wake-up-neo.net

So weisen Sie einem Array in einem Ansible-Playbook ein Array zu

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.

21
dabai

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
24
Yuichiro

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
9
anneb

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'
6
tima

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

4
turkenh

Um der Adresse "/ 32" hinzuzufügen, können Sie den Ansible ipaddr-Filter verwenden ( Konvertierung in CIDR-Notation ).

{{ ip_addresses|ipaddr('Host') }}
0
arpe