Bagaimana cara saya mendaftarkan variabel yang dinamai secara dinamis dalam tugas Ansible?

11

Saya mencoba mengambil ID grup dari dua grup ( syslogdan utmp) dengan nama menggunakan tugas Ansible. Untuk tujuan pengujian, saya telah membuat buku pedoman untuk mengambil informasi dari host Ansible itu sendiri.

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

Sayangnya saya mendapatkan kesalahan berikut saat menjalankan playbook:

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

Bagaimana saya bisa mengkonsolidasikan tugas seperti ini ke dalam bentuk parameter saat mendaftarkan variabel terpisah , satu per item , untuk digunakan nanti? Jadi tujuannya adalah untuk memiliki variabel berdasarkan nama grup yang kemudian dapat digunakan dalam tugas selanjutnya.

Saya menggunakan intfilter gid_syslog.stdoutdan gid_utmp.stdoutuntuk melakukan perhitungan berdasarkan GID di tugas selanjutnya.


Saya juga mencoba menggunakan gid.{{item}}dan gid[item]bukannya gid_{{item}}tidak berhasil.


Berikut ini berfungsi dengan baik berbeda dengan yang di atas:

---
- 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
sumber

Jawaban:

8

Saya kira tidak ada cara mudah untuk itu. Dan registerdengan with_itemsloop hanya menempatkan semua hasil mereka ke dalam sebuah array variable.results. Coba tugas-tugas berikut:

  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}}"

Anda tidak dapat menggunakan ekspansi variabel dalam set_factkunci seperti ini:

    - set_fact:
        "gid_{{item.item}}": "{{item}}"
      with_items: gids.results
yaegashi
sumber
Terima kasih, saya akan mencobanya, tetapi sepertinya saya tidak akan memberikan solusi itu karena lebih panjang dan lebih berbelit-belit daripada yang saya duplikat semuanya (di bagian bawah pertanyaan saya). Keterbacaan adalah salah satu kekuatan Ansible sebaliknya, jadi bekerja di sekitar itu akan kembali menggigit saya :)
0xC0000022L
1

Tetapkan fakta yang mendukung variabel, yang bertentangan dengan pernyataan solusi sebelumnya

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