我有3个应用程序托管在三个独立的主机上,并在my.hosts
文件中提到,如下所示:
[app1_webapp]
host3.mybank.com
[app2_webapp]
host5.mybank.com
[app3_webapp]
host8.mybank.com
我的要求是运行两种raw
模块命令。
第一个
raw
任务,应该在所有三个主机上运行所有三个应用程序,即uptime
第二个
raw
任务是ps
命令,应该只在各自的主机上运行,即ps -ef | grep app1
应该只在host3.mybank.com
上运行
下面是我如何调用
ansible-playbook -i my.hosts main.yml -e appname=app1,app2,app3
和我的main.yml
- hosts: "{{ product(appname.split(',')) | product(['webapp'])|map('flatten')|map('join', '_') }}"
user: user1
gather_facts: no
tasks:
- name: Check Running Process
raw: "ps -ef | grep {{ item }}"
register: psout
with_items: "{{ appname.split(',') }}"
- name: DUMP Running Process
debug:
msg: "{{ psout.stdout }}"
上面的raw
失败了,因为它为每个主机上的每个应用程序尝试了ps
,这是我希望跳过的(正确的)。
我如何把一个when条件,使ps
命令为各自的应用程序应该只在各自的主机上运行,而不是在所有三个主机上运行?
正如在评论中已经提到的,正确的方法是按功能对库存进行分组…
给定库存
[app1_test]
test1.example.com
[app2_test]
test2.example.com
一个小的测试剧本
---
- hosts: app1_test,app2_test
become: false
gather_facts: false
vars:
APPNAME: "app1,app2"
tasks:
- name: Check on
debug:
msg: "{{ item }} on {{ group_names }}"
when: group_names is search(item)
with_items: "{{ APPNAME.split(',') }}"
生成所请求的
输出。TASK [Check on] *************************
ok: [test1.example.com] => (item=app1) =>
msg: app1 on [u'app1_test']
ok: [test2.example.com] => (item=app2) =>
msg: app2 on [u'app2_test']
我如何放置when条件以便…各自的应用程序应该只在各自的主机上运行
这意味着,你需要检查(唯一的)如果"app"包含在各自的组名中。一个主机可以属于多个组。
进一步Q&
- 如何在Ansible
group_names
中搜索子字符串? - 仅当主机不属于组时运行任务?
文档
Ansible: magic variables信息
最常用的魔术变量是
hostvars
、groups
、group_names
和inventory_hostname
。基于
ansible_facts
的条件