ฉันจะลงทะเบียนตัวแปรที่ตั้งชื่อแบบไดนามิกในงาน Ansible ได้อย่างไร


11

ฉันพยายามดึง ID กลุ่มของสองกลุ่ม ( syslogและutmp) ตามชื่อโดยใช้งาน Ansible สำหรับวัตถุประสงค์ในการทดสอบฉันได้สร้าง playbook เพื่อดึงข้อมูลจาก Ansible host เอง

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

น่าเสียดายที่ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อเรียกใช้ playbook:

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

ฉันจะรวมงานเช่นนี้เป็นรูปแบบ parametrized ในขณะที่ลงทะเบียนตัวแปรแยกกันหนึ่งรายการต่อรายการเพื่อใช้ในภายหลังได้อย่างไร ดังนั้นเป้าหมายคือการมีตัวแปรตามชื่อกลุ่มซึ่งสามารถใช้ในงานต่อมาได้

ฉันใช้intตัวกรองgid_syslog.stdoutและgid_utmp.stdoutทำการคำนวณตาม GID ในงานต่อไป


ฉันยังลองใช้gid.{{item}}และgid[item]แทนที่จะgid_{{item}}ไม่มีประโยชน์


งานต่อไปนี้ทำงานได้ดีในทางตรงกันข้ามกับด้านบน:

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

คำตอบ:


8

ฉันคิดว่ามันไม่มีวิธีง่ายๆในการทำเช่นนั้น และregisterมีวงเพียงแค่ทำให้ผลทั้งหมดของพวกเขาเป็นอาร์เรย์with_items variable.resultsลองทำสิ่งต่อไปนี้:

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

คุณไม่สามารถใช้การขยายตัวแปรในset_factคีย์เช่นนี้:

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

ขอบคุณฉันจะลองใช้ แต่ไม่น่าเป็นไปได้ที่ฉันจะแก้ปัญหาด้วยวิธีที่ยาวกว่าและซับซ้อนกว่าที่ฉันทำซ้ำทุกอย่าง (ที่ด้านล่างของคำถาม) ความสามารถในการอ่านเป็นหนึ่งในจุดแข็งของ Ansible เป็นอย่างอื่นดังนั้นการหลีกเลี่ยงสิ่งนั้นจะกลับมากัดฉัน :)
0xC0000022L

Set fact รองรับตัวแปรตรงข้ามกับคำสั่งของโซลูชันก่อนหน้าดูคำตอบด้านล่าง
Vano

2

ชุดข้อเท็จจริงสนับสนุนตัวแปรเมื่อเทียบกับคำสั่งของโซลูชั่นก่อนหน้า

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

1
ฉันจะให้ 10 อย่างถ้าทำได้! :)
Vano
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.