我正在尝试使用我们使用的服务启动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
一起使用。已要求此功能,但截至今天尚未实施。