我如何使Ansible期望模块正确等待使用_items创建PID文件



我正在尝试使用我们使用的服务启动shell脚本在节点上启动一堆服务。似乎服务没有完全启动,因为Ansible不等待脚本完成运行(其中一部分启动了BG中的thin WebServer)。我希望with_items循环等到PID文件到位,然后启动第二个SRVC。

- name: startup all the services   
  hosts: all   
  gather_facts: no   
  tasks:
    expect:
      command: /bin/bash -c "/home/vagrant/app-src/app_global/bin/server_tool server_daemon {{ item }}"
      creates: "/home/vagrant/app-src/{{ item }}/tmp/pids/thin.pid"
      with_items:
        - srvc1
        - srvc2

我希望项目循环可以与command以及其创建的thin.pid文件一起使用。

,但是当我运行时似乎什么也没做。

🍺  vagrant provision 
==> default: Running provisioner: ansible...
    default: Running ansible-playbook...
PLAY [startup all the services] ******************************************* 
PLAY RECAP ******************************************************************** 

如果我正确理解您的意图,则不应使用预期模块。它用于自动化需要交互式输入的程序(请参阅:期望)。

依次启动服务并暂停剧本的处理,直到创建pid -File为止,您可以(当前)将剧本分为两个文件,然后使用with_items属性使用include模块:

主剧本:

- name: startup all the services   
  hosts: all   
  gather_facts: no   
  tasks:
    - include: start_daemon.yml srvcname={{ item }}
      with_items:
        - srvc1
        - srvc2

子播放书start_daemon.yml

- shell: "/home/vagrant/app-src/app_global/bin/server_tool server_daemon {{ srvcname }}"
  args:
    creates: "/home/vagrant/app-src/{{ srvcname }}/tmp/pids/thin.pid"
- name: Waiting for {{ srvcname }} to start
  wait_for: path=/home/vagrant/app-src/{{ srvcname }}/tmp/pids/thin.pid state=present

备注:

我认为您不需要为command模块指定/bin/bash(但这可能取决于配置)。如果由于某种原因server_tool需要外壳环境,请使用shell模块(如上所述)。

使用wait_for任务中的name:,您将获得当前正在等待的服务上的屏幕信息。

未来:一种自然的方法是将block模块与with_items一起使用。已要求此功能,但截至今天尚未实施。

最新更新