
2 人のホストのグループがあります。現在のホストではないホストにタスクを委任したいと考えています。
以下は何も一致せず、最初の 2 つのホストのリストのみを返します。
- debug: msg="{{ groups['web-servers'] | select('match', '^(?!\{\{\ inventory_hostname\ \}\}$).+') | list }}"
問題は脱出だと思うのですが、わかりません。
答え1
オプションとしては、違いフィルター。以下はフィルターの使い方の例です。
shell> cat test-difference-01.yml
- hosts: localhost
gather_facts: no
vars:
web_servers:
- web-server-01
- web-server-02
- web-server-09
inventory_hostname:
- web-server-02
tasks:
- set_fact:
delegate_to_hosts: "{{ web_servers|difference(inventory_hostname) }}"
- debug:
msg : "{{ delegate_to_hosts }}"
shell> ansible-playbook test-difference-01.yml | grep -A 3 msg
"msg": [
"web-server-01",
"web-server-09"
]
質問:「2 つのホストのグループ ... 現在のホストではないホストにタスクを委任します「
在庫を考慮すると
shell> cat hosts
[webservers]
web-server-01
web-server-02
プレイブック
- hosts: webservers
tasks:
- debug:
msg: "{{ inventory_hostname }} {{ item }}"
loop: "{{ groups.webservers|difference([inventory_hostname]) }}"
delegate_to: "{{ item }}"
与える(要約)
ok: [web-server-01 -> web-server-02] => (item=web-server-02) =>
msg: web-server-01 web-server-02
ok: [web-server-02 -> web-server-01] => (item=web-server-01) =>
msg: web-server-02 web-server-01
このコードは、全てホストリストansible_play_hosts_すべて
- hosts: all
tasks:
- debug:
msg: "{{ inventory_hostname }} {{ item }}"
loop: "{{ ansible_play_hosts_all|difference([inventory_hostname]) }}"
delegate_to: "{{ item }}"
答え2
否定先読みの正規表現を指定する必要はありません。代わりに、reject
フィルター。
また、test では、文字列をおよびequalto
で囲む必要はありません。^
$
- debug:
msg: "{{ groups['web-servers'] | reject('equalto', inventory_hostname) | list }}"
答え3
問題は正規表現パターンの変数置換(またはその欠如)にあると思います。パターンを個別に定義し、それをフィルターに渡すことができます(正規表現を少し変更したことに注意してください)。
- set_fact: pattern="^(?!{{ inventory_hostname }}).+$"
- debug: msg="{{ groups['web-servers'] | select('match', pattern) | list }}"
結果:
TASK [debug : debug] ******************************************
ok: [foo] => {
"msg": [
"bar",
"baz"
]
}
ok: [bar] => {
"msg": [
"foo",
"baz"
]
}
ok: [baz] => {
"msg": [
"foo",
"bar"
]
}