プレイブックで次のコードを入手しました:
---
- hosts: db
vars:
postgresql_ext_install_contrib: yes
postgresql_pg_hba_passwd_hosts: ['10.129.181.241/32']
...
postgresql_pg_hba_passwd_hosts
の値をすべてのWebサーバーのプライベートipsに置き換えたいと思います。 templateで this のような値を取得できることを理解しています:
{% for Host in groups['web'] %}
{{ hostvars[Host]['ansible_eth1']['ipv4']['address'] }}
{% endfor %}
このループの結果をプレイブックの変数に割り当てる最も簡単/簡単な方法は何ですか?または、そもそもこの情報を収集するより良い方法はありますか?このループをテンプレートに入れる必要がありますか?
追加の課題:すべてのエントリに/32
を追加する必要があります。
set_fact およびansible filter plugin を使用して、変数にリストを割り当てることができます。
カスタムフィルタープラグインをfilter_pluginsディレクトリーに次のように配置します。
(ansible top directory)
site.yml
hosts
filter_plugins/
to_group_vars.py
to_group_vars.pyhostvarsをグループで選択されたリストに変換します。
from ansible import errors, runner
import json
def to_group_vars(Host_vars, groups, target = 'all'):
if type(Host_vars) != runner.HostVars:
raise errors.AnsibleFilterError("|failed expects a HostVars")
if type(groups) != dict:
raise errors.AnsibleFilterError("|failed expects a Dictionary")
data = []
for Host in groups[target]:
data.append(Host_vars[Host])
return data
class FilterModule (object):
def filters(self):
return {"to_group_vars": to_group_vars}
次のように使用します。
---
- hosts: all
tasks:
- set_fact:
web_ips: "{{hostvars|to_group_vars(groups, 'web')|map(attribute='ansible_eth0.ipv4.address')|list }}"
- debug:
msg: "web ip is {{item}}/32"
with_items: web_ips
プレイブックで:
vars:
- arrayname:
- name: itemname
value1: itemvalue1
value2: itemvalue2
- name: otheritem
value1: itemvalue3
value2: itemvalue4
テンプレート内:(例は、セクション、キー、および値を持つiniファイルのタイプです):
{% for item in arrayname %}
[{{ item.name }}]
key1 = {{ item.value1 }}
key2 = {{ item.value2 }}
{% endfor %}
これにより、テンプレートが次のようにレンダリングされます。
[itemname]
key1 = itemvalue1
key2 = itemvalue2
[otheritem]
key1 = itemvalue3
key2 = itemvalue4
変数は標準のYAML構造として表すことができるため、次のようにリスト値をキーに割り当てることができます。
---
- hosts: db
vars:
postgresql_ext_install_contrib: yes
postgresql_pg_hba_passwd_hosts:
- '10.129.181.241/32'
- '1.2.3.0/8'
Jinja2フィルターを使用できます。
{{ groups['nodes']|map('extract', hostvars, ['ansible_eth1','ipv4', 'address']) |list }}
iPアドレスのリストを返します。つまり.
---
- hosts: db
vars:
postgresql_ext_install_contrib: yes
postgresql_pg_hba_passwd_hosts: {{ groups['nodes']|map('extract', hostvars, ['ansible_eth1','ipv4', 'address']) |list }}
...
チャレンジ(末尾に/32
)。ただし、jinja2フィルターを使用することも可能です。
2.1以降のバージョンが必要
アドレスに「/ 32」を追加するには、Ansible ipaddrフィルターを使用できます( CIDR表記に変換 )。
{{ ip_addresses|ipaddr('Host') }}