Ansible görevine dinamik olarak adlandırılmış bir değişkeni nasıl kaydederim?


11

Bir Ansible görevi kullanarak iki grubun ( syslogve utmp) grup kimliğini adıyla almaya çalışıyorum . Test amacıyla, Ansible sunucusundan bilgi almak için bir oyun kitabı oluşturdum.

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

Ne yazık ki, playbook'u çalıştırırken aşağıdaki hatayı alıyorum:

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

Böyle bir görevi daha sonra kullanmak üzere her öğe için ayrı değişkenler kaydederken parametreli bir forma nasıl birleştirebilirim ? Bu nedenle amaç , daha sonra görevlerde kullanılabilecek grup adına dayalı değişkenlere sahip olmaktır.

Ben kullanıyorum intfiltreyi gid_syslog.stdoutve gid_utmp.stdoutdaha sonraki görevlerde GID dayalı bazı hesaplama yapmak.


Ayrıca boşuna kullanmak yerine gid.{{item}}ve gid[item]kullanmayı denedim gid_{{item}}.


Yukarıdakilerin aksine aşağıdakiler iyi çalışır:

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

Yanıtlar:


8

Sanırım bunun için kolay bir yol yok. Ve registerile with_itemsdöngü sadece bir diziye hepsi sonuçlarını koyar variable.results. Aşağıdaki görevleri deneyin:

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

Aşağıdaki set_factgibi tuşlarda değişken genişletmeyi kullanamazsınız :

    - set_fact:
        "gid_{{item.item}}": "{{item}}"
      with_items: gids.results

Teşekkürler, deneyeceğim, ama her şeyi çoğalttığımdan daha uzun ve daha kıvrımlı olduğu için bu çözümü koymam pek olası değil. Okunabilirlik, Ansible'ın güçlü yönlerinden biridir, bu yüzden etrafta çalışmak beni ısırmak için geri dönecektir :)
0xC0000022L

Set gerçeği, önceki çözümün açıklamasının aksine değişkenleri destekler, aşağıdaki cevaba bakınız
Vano

2

Set gerçeği, önceki çözümün açıklamasının aksine değişkenleri destekler

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

1
Yapabilirsem +10 verirdim! :)
Vano
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.