Wie würde ich eine dynamisch benannte Variable in einer Ansible-Aufgabe registrieren?

11

Ich versuche, die Gruppen-ID von zwei Gruppen ( syslogund utmp) nach Namen mithilfe einer Ansible-Aufgabe abzurufen . Zu Testzwecken habe ich ein Playbook erstellt, um die Informationen vom Ansible-Host selbst abzurufen.

---
- name: My playbook
  hosts: enabled
  sudo: True
  connection: local
  gather_facts: False
  tasks:
    - name: Determine GIDs
      shell: "getent group {{ item }} | cut -d : -f 3"
      register: gid_{{item}}
      failed_when: gid_{{item}}.rc != 0
      changed_when: false
      with_items:
        - syslog
        - utmp

Leider wird beim Ausführen des Playbooks folgende Fehlermeldung angezeigt:

fatal: [hostname] => error while evaluating conditional: gid_syslog.rc != 0

Wie kann ich eine Aufgabe wie diese in einer parametrisierten Form zusammenfassen, während ich separate Variablen, eine pro Element , für die spätere Verwendung registriere ? Das Ziel ist es also, Variablen basierend auf dem Gruppennamen zu haben, die dann in späteren Aufgaben verwendet werden können.

Ich verwende den intFilter für gid_syslog.stdoutund gid_utmp.stdoutum in späteren Aufgaben einige Berechnungen basierend auf der GID durchzuführen.


Ich habe auch versucht, gid.{{item}}und gid[item]statt gid_{{item}}ohne Erfolg.


Folgendes funktioniert im Gegensatz zu den oben genannten gut:

---
- name: My playbook
  hosts: enabled
  sudo: True
  connection: local
  gather_facts: False
  tasks:
    - name: Determine syslog GID
      shell: "getent group syslog | cut -d : -f 3"
      register: gid_syslog
      failed_when: gid_syslog.rc != 0
      changed_when: false
    - name: Determine utmp GID
      shell: "getent group utmp | cut -d : -f 3"
      register: gid_utmp
      failed_when: gid_utmp.rc != 0
      changed_when: false
0xC0000022L
quelle

Antworten:

8

Ich nehme an, dafür gibt es keinen einfachen Weg. Und registermit with_itemsloop werden einfach alle Ergebnisse in ein Array eingefügt variable.results. Probieren Sie die folgenden Aufgaben aus:

  tasks:
    - name: Determine GIDs
      shell: "getent group {{ item }} | cut -d : -f 3"
      register: gids
      changed_when: false
      with_items:
        - syslog
        - utmp
    - debug:
        var: gids
    - assert:
        that:
          - item.rc == 0
      with_items: gids.results
    - set_fact:
        gid_syslog: "{{gids.results[0]}}"
        gid_utmp: "{{gids.results[1]}}"
    - debug:
        msg: "{{gid_syslog.stdout}} {{gid_utmp.stdout}}"

Sie können die Variablenerweiterung auch nicht in folgenden set_factSchlüsseln verwenden:

    - set_fact:
        "gid_{{item.item}}": "{{item}}"
      with_items: gids.results
yaegashi
quelle
Danke, ich werde es ausprobieren, aber es ist unwahrscheinlich, dass ich diese Lösung einsetzen würde, da sie länger und komplizierter ist als die, bei der ich alles dupliziere (am Ende meiner Frage). Die Lesbarkeit ist ansonsten eine der Stärken von Ansible.
Wenn Sie
1

Set fact unterstützt Variablen im Gegensatz zur Aussage der vorherigen Lösung

   - set_fact:
       "{{ item.name }}": "{{ item.val }}"
     when: item.name not in vars
     with_items:
       - { name: test, val: myalue }
       - { name: notest, val: novalue }
ww12
quelle