it-swarm.com.de

Ansible - liest Inventar-Hosts und -Variablen in die Datei group_vars / all

Ich habe einen bloßen Zweifel, der mich lange Zeit festhält. Ich habe eine sehr banale Inventardatei mit Hosts und Variablen:

[lb]
10.112.84.122

[Tomcat]
10.112.84.124

[jboss5]
10.112.84.122

...

[tests:children]
lb
Tomcat
jboss5

[default:children]
tests

[tests:vars]
data_base_user=NETWIN-4.3
data_base_password=NETWIN
data_base_encrypted_password=
data_base_Host=10.112.69.48
data_base_port=1521
data_base_service=ssdenwdb
data_base_url=jdbc:Oracle:thin:@10.112.69.48:1521/ssdenwdb

Das Problem ist, dass ich über die Datei group_vars/all auf alle diese Hosts und Variablen in der Inventardatei zugreifen muss.

Ich habe die folgenden Möglichkeiten ausprobiert, um auf die Host-IP zuzugreifen:

{{ lb }}
"{{ hostvars[lb] }}"
"{{ hostvars['lb'] }}"
{{ hostvars[lb] }}

Um auf eine Host-Variable zuzugreifen, habe ich versucht:

"{{ hostvars[tests].['data_base_Host'] }}"

Alle von ihnen sind falsch !!! Kann mir jemand helfen, die beste Vorgehensweise für den Zugriff auf Hosts und Variablen zu finden, nicht aus einem Playbook, sondern aus einer Variablendatei?

EDIT:

Okay. Lassen Sie uns klären.

Problem: Verwenden Sie einen in der Inventardatei deklarierten Host in einer Variablendatei, sagen wir: group_vars/all.

Beispiel: Ich habe einen DB Host mit IP:10.112.83.37.

Inventardatei:

[db]
10.112.83.37

In der Gruppe: vars/all Datei möchte ich diese IP verwenden, um eine Variable zu erstellen.

group_vars/all Datei:

data_base_url=jdbc:Oracle:thin:@{{ db }}:1521/ssdenwdb

In einer Vorlage verwende ich die Variable, die in der Datei group_vars/all erstellt wurde.

Vorlagendatei:

Oracle_url = {{ data_base_url }}

Das Problem ist, dass die {{ db }} Variable in der Datei group_vars/all wird nicht durch die DB Host IP ersetzt. Der Benutzer kann nur die Inventardatei bearbeiten.

25
Tiago Sousa
- name: Host
   debug: msg="{{ item }}" 
   with_items:
    - "{{ groups['tests'] }}"

Dieser Code gibt die folgende Meldung aus:

'10.112.84.122'
'10.112.84.124'

wie groups['tests'] gibt grundsätzlich eine Liste eindeutiger IP-Adressen zurück ['10.112.84.122','10.112.84.124'] wohingegen groups['Tomcat'][0] kehrt zurück 10.112.84.124.

27
eldos

Wenn Sie programmgesteuert auf die Inventareinträge zugreifen möchten, um sie beispielsweise in eine Aufgabe aufzunehmen. Sie können so darauf verweisen:

{{ hostvars.Tomcat }}

Dies gibt eine Struktur mit allen mit diesem Host verbundenen Variablen zurück. Wenn Sie nur eine IP-Adresse (oder einen Hostnamen) möchten, können Sie sich folgendermaßen darauf beziehen:

{{ hostvars.jboss5.ansible_ssh_Host }}

Hier ist eine Liste von Variablen, auf die Sie verweisen können: Klicken . Darüber hinaus können Sie eine Variable deklarieren und mit dem Ergebnis eines bestimmten Schritts in einem Playbook festlegen.

- name: Change owner and group of some file
  file: path=/tmp/my-file owner=new-owner group=new-group
  register: chown_result

Wenn Sie diesen Schritt auf Tomcat spielen, können Sie von jboss5 so was:

- name: Print out the result of chown
  debug: msg="{{ hostvars.Tomcat.chown_result }}"
20
wpodgorski

Nur für den Fall, dass das Problem weiterhin besteht, können Sie mit ‘hostvars’, ‘group_names’, und ‘groups’ ansible Variablen.

Beispiel:

Um die IP-Adressen aller Server in der Gruppe "mygroup" abzurufen, verwenden Sie die folgende Konstruktion:

- debug: msg="{{ hostvars[item]['ansible_eth0']['ipv4']['address'] }}" 
  with_items:
     - "{{ groups['mygroup'] }}"
14
odzhu

Ja das Beispiel von nixlike funktioniert sehr gut.

Inventar:

[docker-Host]
myhost1 user=barbara
myhost2 user=heather

spielbuch:

---

- hosts: localhost
  connection: local         

     tasks:    
        - name: loop debug inventory hostnames
          debug: 
            msg: "the docker Host is {{ item }}"
          with_inventory_hostnames: docker-Host
        - name: loop debug items
          debug: 
            msg: "the docker Host is {{ hostvars[item]['user'] }}"
          with_items: "{{ groups['docker-Host'] }}"

ausgabe:

ansible-playbook ansible/tests/vars-test-local.yml

PLAY [localhost]


TASK [setup] *********************************************** ********************* ok: [localhost]

TASK [Hostnamen für Loop-Debugging-Inventar] ******************************************************** ok : [localhost] => (item = myhost2) => {"item": "myhost2", "msg": "Der Docker-Host ist myhost2"} ok: [localhost] => (item = myhost1) => {" item ":" myhost1 "," msg ":" Der Docker-Host ist myhost1 "}

TASK [Loop Debug Items] ********************************************* ************ ok: [localhost] => (item = myhost1) => {"item": "myhost1", "msg": "der Docker-Host ist barbara"} ok: [ localhost] => (item = myhost2) => {"item": "myhost2", "msg": "the docker Host is heather"}

PLAY RECAP ************************************************* ********************* localhost: ok = 3 geändert = 0 nicht erreichbar = 0
fehlgeschlagen = 0

vielen Dank!

3
nettie

Betrachten Sie Ihr vorheriges Beispiel:

inventardatei:

[db]
10.112.83.37

group_vars/all

data_base_url=jdbc:Oracle:thin:@{{ db }}:1521/ssdenwdb

vorlagendatei:

Oracle_url = {{ data_base_url }}

Möglicherweise möchten Sie Ihre group_vars/all durch ersetzen

data_base_url="jdbc:Oracle:thin:@{{ groups['db'][0] }}:1521/ssdenwdb"
2
Antonio Pérez