我正在尝试使用我们使用的服务启动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 ********************************************************************
答案 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,但截至目前尚未实施。