2016-08-22 217 views
2

我正在通过Terraform供应新服务器,并将Ansible作为本地系统上的供应商。Ansible wait_for似乎不起作用

Terraform为EC2提供了一个系统,然后运行Ansible playbook,提供新建系统的IP作为库存。

我想使用Ansible等待系统完成引导,并阻止尝试进一步的任务直到建立连接。直到这一点,我一直在使用不方便和不精确的手动暂停。

Ansible似乎没有做文件说明它会(除非我错了,一个非常可能的场景)。这里是我的代码:

- name: waiting for server to be alive 
    wait_for: 
     state: started 
     port: 22 
     host: "{{ ansible_ssh_host | default(inventory_hostname) }}" 
     delay: 10 
     timeout: 300 
     connect_timeout: 300 
     search_regex: OpenSSH 
    delegate_to: localhost 

在此步骤中会发生什么事是连接不等待任何超过10秒进行连接,它失败。如果服务器已启动,并且我再次尝试操作手册,它可以正常工作并按预期执行。

我也试过do_until风格循环似乎从来没有工作。文档中给出的所有示例都使用shell输出,我不认为它可以用于非shell模块。

我也似乎无法得到任何调试信息,如果我尝试注册一个结果并使用调试模块打印出来。

任何人有什么建议,我做错了什么?

回答

1

当您使用delegate_tolocal_action模块,{{ ansible_ssh_host }}解析为localhost,让你的任务总是用下面的参数运行:

host: localhost 

它等待10秒,检查SSH连接到本地主机和收益(因为它很可能是开放的)。


如果使用gather_facts: false(我认为你这样做),你可以前添加set_fact任务,向目标主机名的值存储在一个变量:

- set_fact: 
    host_to_wait_for: "{{ ansible_ssh_host | default(inventory_hostname) }}" 

并更改行:

host: "{{ host_to_wait_for }}" 

您可以用下面的剧本验证试验的变量:

--- 
- hosts: all 
    gather_facts: false 
    tasks: 
    - set_fact: 
     host_to_wait_for: "{{ ansible_ssh_host | default(inventory_hostname) }}" 
    - debug: msg="ansible_ssh_host={{ ansible_ssh_host }}, inventory_hostname={{ inventory_hostname }}, host_to_wait_for={{ host_to_wait_for }}" 
     delegate_to: localhost 

或者你可以尝试找到一种方法来提供EC2实例的IP地址Ansible作为变量,并把它作为host:参数的值。例如,您从CLI运行Ansible,然后将${aws_instance.example.public_ip}传递给--extra-vars参数。

+0

对不起,我回滚到原来的版本。当然,我建议的作品,我之前测试过,并且在您的评论后感到困惑,因为我重新运行了“gather_facts”功能,并且它甚至没有关闭主机。 (同时请清理你的意见) – techraf

+0

'set_fact'然后在本地机器上运行吗? – smiller171

+0

运行我附带的剧本并亲自体验。为什么Ansible会在远程机器上调用Python来为变量设置一个值? – techraf

0

正如techraf指出的,您的库存查找实际上是由于委派而抓取本地主机地址,因此它不会针对正确的机器运行。

我认为你最好的解决方案可能是让terraform将变量传递给包含实例IP地址的剧本。例如:

terraform通过-e "new_ec2_host=<IP_ADDR>"

Ansible任务:

- name: waiting for server to be alive 
    wait_for: 
     state: started 
     port: 22 
     host: "{{ new_ec2_host }}" 
     delay: 10 
     timeout: 300 
     connect_timeout: 300 
     search_regex: OpenSSH 
    delegate_to: localhost