Ansible - 如何在特定主机上运行任务,而不是在所有"inventory_hosts"上运行任务?



我有3个应用程序托管在三个独立的主机上,并在my.hosts文件中提到,如下所示:

[app1_webapp]
host3.mybank.com
[app2_webapp]
host5.mybank.com
[app3_webapp]
host8.mybank.com

我的要求是运行两种raw模块命令。

  1. 第一个raw任务,应该在所有三个主机上运行所有三个应用程序,即uptime

  2. 第二个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&

  • 如何在Ansiblegroup_names中搜索子字符串?
  • 仅当主机不属于组时运行任务?

文档

  • Ansible: magic variables信息

    最常用的魔术变量是hostvarsgroupsgroup_namesinventory_hostname

  • 基于ansible_facts的条件

相关内容

  • 没有找到相关文章

最新更新