In einem Spielbuch bekam ich den folgenden Code:
---
- hosts: db
vars:
postgresql_ext_install_contrib: yes
postgresql_pg_hba_passwd_hosts: ['10.129.181.241/32']
...
Ich möchte den Wert von postgresql_pg_hba_passwd_hosts
durch alle privaten ips des Webservers ersetzen. Ich verstehe, dass ich die Werte wie this in einer Vorlage erhalten kann:
{% for Host in groups['web'] %}
{{ hostvars[Host]['ansible_eth1']['ipv4']['address'] }}
{% endfor %}
Was ist der einfachste/einfachste Weg, um das Ergebnis dieser Schleife einer Variablen in einem Playbook zuordnen? Oder gibt es eine bessere Möglichkeit, diese Informationen überhaupt zu sammeln? Soll ich diese Schleife in eine Vorlage einfügen?
Zusätzliche Herausforderung: Ich müsste jedem Eintrag /32
hinzufügen.
Sie können einer Variablen eine Liste durch set_fact und ansible filter plugin zuordnen.
Legen Sie das benutzerdefinierte Filter-Plugin wie folgt in das Verzeichnis filter_plugins ab:
(ansible top directory)
site.yml
hosts
filter_plugins/
to_group_vars.py
to_group_vars.py konvertiert Hostvars in eine Liste, die von der Gruppe ausgewählt wurde.
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}
Verwenden Sie wie folgt:
---
- 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
im Spielbuch:
vars:
- arrayname:
- name: itemname
value1: itemvalue1
value2: itemvalue2
- name: otheritem
value1: itemvalue3
value2: itemvalue4
in template: (Beispiel ist vom Typ ini-Datei mit Abschnitten, Schlüsseln und Werten):
{% for item in arrayname %}
[{{ item.name }}]
key1 = {{ item.value1 }}
key2 = {{ item.value2 }}
{% endfor %}
Dies sollte die Vorlage folgendermaßen darstellen:
[itemname]
key1 = itemvalue1
key2 = itemvalue2
[otheritem]
key1 = itemvalue3
key2 = itemvalue4
Variablen können als Standard-YAML-Strukturen dargestellt werden, sodass Sie einem Schlüssel wie folgt einen Listenwert zuweisen können:
---
- hosts: db
vars:
postgresql_ext_install_contrib: yes
postgresql_pg_hba_passwd_hosts:
- '10.129.181.241/32'
- '1.2.3.0/8'
Sie können jinja2-Filter verwenden:
{{ groups['nodes']|map('extract', hostvars, ['ansible_eth1','ipv4', 'address']) |list }}
gibt eine Liste der IP-Adressen zurück. d.h.
---
- hosts: db
vars:
postgresql_ext_install_contrib: yes
postgresql_pg_hba_passwd_hosts: {{ groups['nodes']|map('extract', hostvars, ['ansible_eth1','ipv4', 'address']) |list }}
...
Enthält nicht die Herausforderung (Anhängen von /32
). Es sollte aber auch irgendwie mit jinja2-Filtern möglich sein.
Erforderliche Version der Version> = 2.1
Um der Adresse "/ 32" hinzuzufügen, können Sie den Ansible ipaddr-Filter verwenden ( Konvertierung in CIDR-Notation ).
{{ ip_addresses|ipaddr('Host') }}