我想问您是否可以使用与库存本身中的变量相关的模式来过滤库存文件。例如:
我有这个库存
groupA:
hosts:
host1A:
env: pre
host2A:
env: prod
groupB:
hosts:
host1B:
env: pre
host2B:
env: prod
这是标语牌:
- name: test
hosts: **only hosts that contain env:pre??**
role: backend
有可能做到这一点吗?也许使用REG表达式?请帮帮我。提前谢谢。
给定库存
shell> cat hosts
groupA:
hosts:
host1A:
env: pre
host1B:
env: prod
groupB:
hosts:
host1B:
env: pre
host1C:
env: prod
最简单的选项是使用模块group_by。例如,
- hosts: all
gather_facts: false
tasks:
- group_by:
key: group_{{ env }}
- debug:
var: groups
run_once: true
给出
PLAY [all] ************************************************************************************
TASK [group_by] *******************************************************************************
changed: [host1A]
changed: [host1B]
changed: [host1C]
TASK [debug] **********************************************************************************
ok: [host1A] =>
groups:
all:
- host1A
- host1B
- host1C
groupA:
- host1A
- host1B
groupB:
- host1B
- host1C
group_pre:
- host1A
- host1B
group_prod:
- host1C
ungrouped: []
PLAY RECAP ************************************************************************************
host1A: ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
host1B: ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
host1C: ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
这可能不是你想要的。主机host1B不是prod组的成员,因为变量env的计算结果为"re">。
您可以通过将所有选项放在逗号分隔的列表中轻松修复它。例如,
shell> cat hosts
groupA:
hosts:
host1A:
env: pre
host1B:
env: prod,pre
groupB:
hosts:
host1B:
host1C:
env: prod
和战术手册
- hosts: all
gather_facts: false
tasks:
- group_by:
key: "group_{{ item }}"
loop: "{{ env.split(',') }}"
- debug:
var: groups
run_once: true
提供您想要的
PLAY [all] ************************************************************************************
TASK [group_by] *******************************************************************************
ok: [host1A] => (item=pre)
ok: [host1B] => (item=prod)
ok: [host1C] => (item=prod)
ok: [host1B] => (item=pre)
TASK [debug] **********************************************************************************
ok: [host1A] =>
groups:
all:
- host1A
- host1B
- host1C
groupA:
- host1A
- host1B
groupB:
- host1B
- host1C
group_pre:
- host1A
- host1B
group_prod:
- host1C
- host1B
ungrouped: []
PLAY RECAP ************************************************************************************
host1A: ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
host1B: ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
host1C: ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0