如何让Ansible expect模块正确等待创建pid文件with_items

时间:2016-06-24 22:07:02

标签: ansible

我正在尝试使用我们使用的服务启动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

我希望items循环既可以使用command,也可以使用它创建的thin.pid文件。

但是当我运行它时似乎没有做任何事情。

  vagrant provision 
==> default: Running provisioner: ansible...
    default: Running ansible-playbook...

PLAY [startup all the services] ******************************************* 

PLAY RECAP ******************************************************************** 

1 个答案:

答案 0 :(得分:1)

如果我理解你的意图,你根本不应该使用Expect模块。它用于自动化需要交互式输入的程序(参见:Expect)。

要按顺序启动服务并暂停处理Playbook,直到创建pid文件,您可以(当前)将您的Playbook拆分为两个文件并使用include模块和with_items属性:

主要剧本:

- 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

说明:

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

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

对于未来:一种自然的方法是将block模块与with_items一起使用。此功能已requested,但截至目前尚未实施。