Score:0

จับคู่ค่า item.x กับ inventory_hostname

ธง cn

ฉันต้องการความช่วยเหลือในการจับคู่ inventory_hostname กับ item.host (จาก vars_file) วิธีที่ดีที่สุดในการทำเช่นนั้นคืออะไร? ฉันไม่สามารถเข้าใจสิ่งนี้ได้เนื่องจากฉันเป็นมือใหม่

ความต้องการของฉันคือ:

  • ฉันต้องเรียกโฮสต์ทั้งหมดจากไฟล์สินค้าคงคลัง

  • ฉันต้องจับคู่ item.host จาก ansible_inventory หากมีอยู่ ให้รันคำสั่งเชลล์บนโฮสต์ที่จับคู่กับ item.hosts ทั้งหมด จากนั้นออก

  • filelist.yml เป็นไฟล์ไดนามิกซึ่งมีการเปลี่ยนแปลงทุกวัน โฮสต์ทั้งหมดมีอยู่ในสินค้าคงคลัง แต่ฉันต้องการใช้ประโยชน์จากไฟล์ที่อยู่ในไฟล์เท่านั้น

ฉันมีไฟล์ list.yml ซึ่งมีชื่อโฮสต์ ดิสก์ และข้อมูลเวอร์ชัน

$ cat list.yml
---
รายการ:
  - โฮสต์: โฮสต์ 1
    ดิสก์: disk0
    ระบบปฏิบัติการ: 7

  - โฮสต์: host2
    ดิสก์: disk4
    ระบบปฏิบัติการ: 7

  - โฮสต์: lhost6
    ดิสก์: hdisk7
    ระบบปฏิบัติการ: 7
---

ใน playbook ฉันพยายามจับคู่ค่า แต่ไม่มีโชค

---
- ชื่อ: playbook ของฉัน   
  โฮสต์: ทั้งหมด   
  vars_file: 
    - list.yml   
  งาน:
   - ชื่อ: ลบไฟล์ออกจากไคลเอนต์
     เชลล์: "rm -f /tmp/me"
     เมื่อไร:
       - "('item.host' ใน inventory_hostname) และ (ansible_distribution_version == 'item.os')"
     วนซ้ำ: "{{ รายการ }}"
     ลงทะเบียน: fileopt
   - แก้ปัญหา: var=fileopt
----

โปรดเสนอวิธีแก้ปัญหาที่สามารถแก้ไขปัญหานี้ได้

Score:2
ธง br

ตัวอย่างเช่น กำหนดสินค้าคงคลัง

เปลือก> เจ้าภาพแมว
โฮสต์01
โฮสต์02
โฮสต์03

และรายการ

รายการ:
  - โฮสต์: host01
    ดิสก์: disk0
    ระบบปฏิบัติการ: 13.0
  - โฮสต์: host02
    ดิสก์: disk4
    ระบบปฏิบัติการ: 13.0
  - โฮสต์: host06
    ดิสก์: hdisk7
    ระบบปฏิบัติการ: 13.0

สร้างรายชื่อโฮสต์ที่อนุญาต

my_hosts: "{{ รายการ|แผนที่(attribute='host')|รายการ }}"

ให้

my_hosts:
  - โฮสต์ 01
  -host02
  - โฮสต์ 06

จากนั้น สร้างพจนานุกรมของโฮสต์และเวอร์ชันของระบบปฏิบัติการที่อนุญาต

my_os: "{{ list|items2dict(key_name='host', value_name='os') }}"

ให้

  my_os:
    โฮสต์ 01: 13.0
    โฮสต์ 02: 13.0
    โฮสต์06:13.0

ตอนนี้ งานด้านล่างจะลบไฟล์ตามเงื่อนไขและแสดงผลลัพธ์ที่ลงทะเบียน

    - ชื่อ: ลบไฟล์ออกจากไคลเอนต์
      ไฟล์:
        สถานะ: ขาด
        เส้นทาง: /tmp/me
      เมื่อไร:
        - inventory_hostname ใน my_hosts
        - ansible_distribution_version ==
          my_os[inventory_hostname]|default('ไม่มี')|string
      ลงทะเบียน: fileopt
    - แก้ปัญหา:
        var: fileopt

ให้

งาน [ลบไฟล์ออกจากไคลเอนต์] ******************************************* **
การข้าม: [host03]
ตกลง: [host02]
ตกลง: [host01]

งาน [แก้ไขข้อบกพร่อง] *********************************************** *****************
ตกลง: [host01] => 
  ตัวเลือกไฟล์:
    เปลี่ยน: เท็จ
    ล้มเหลว: เท็จ
    เส้นทาง: /tmp/me
    สถานะ: ขาด
ตกลง: [host02] => 
  ตัวเลือกไฟล์:
    เปลี่ยน: เท็จ
    ล้มเหลว: เท็จ
    เส้นทาง: /tmp/me
    สถานะ: ขาด
ตกลง: [host03] => 
  ตัวเลือกไฟล์:
    เปลี่ยน: เท็จ
    skip_reason: ผลลัพธ์ตามเงื่อนไขเป็นเท็จ
    ข้าม: จริง

อย่างที่คาดไว้, โฮสต์03 ที่หายไปจากรายการถูกข้ามไป


ทางเลือก การสร้างกลุ่มไดนามิกอาจมีประสิทธิภาพมากกว่าหากรายการของโฮสต์ที่อนุญาตนั้นมีขนาดเล็กกว่ามากเมื่อเทียบกับโฮสต์ทั้งหมด ตัวอย่างเช่น สร้างกลุ่มโฮสต์ที่อนุญาตในการเล่นครั้งแรกและใช้ในการเล่นครั้งที่สอง

- ชื่อ: สร้างกลุ่ม my_hosts
  โฮสต์: ทั้งหมด
  Gather_facts: จริง
  วาร์:
    รายการ:
      - โฮสต์: host01
        ดิสก์: disk0
        ระบบปฏิบัติการ: 13.0
      - โฮสต์: host02
        ดิสก์: disk4
        ระบบปฏิบัติการ: 13.0
      - โฮสต์: host06
        ดิสก์: hdisk7
        ระบบปฏิบัติการ: 13.0
    my_hosts: "{{ รายการ|แผนที่(attribute='host')|รายการ }}"
    my_os: "{{ list|items2dict(key_name='host', value_name='os') }}"
  งาน:
    - set_fact:
        _my_os: "{{ ansible_distribution_version ==
                    my_os[inventory_hostname]|default('None')|string }}"
    - ชื่อ: สร้างกลุ่ม my_hosts
      add_host:
        ชื่อ: "{{ รายการ }}"
        กลุ่ม: my_hosts
      วนซ้ำ: "{{ hostvars|dict2items|
                selectattr('คีย์', 'ใน', my_hosts)|
                selectattr('value._my_os')|
                แผนที่(แอตทริบิวต์='คีย์')|
                รายการ }}"
      run_once: จริง

- ชื่อ: ลบไฟล์ออกจาก my_hosts
  โฮสต์: my_hosts
  Gather_facts: เท็จ
  งาน:
    - ชื่อ: ลบไฟล์ออกจากไคลเอนต์
      ไฟล์:
        สถานะ: ขาด
        เส้นทาง: /tmp/me
      ลงทะเบียน: fileopt
    - แก้ปัญหา:
        var: fileopt

ให้

เล่น [สร้างกลุ่ม my_hosts] ***************************************

TASK [รวบรวมข้อเท็จจริง] *********************************************
ตกลง: [host03]
ตกลง: [host01]
ตกลง: [host02]

งาน [set_fact] *********************************************** ******
ตกลง: [host03]
ตกลง: [host02]
ตกลง: [host01]

งาน [สร้างกลุ่ม my_hosts] ***************************************
ตกลง: [host01] => (รายการ=host01)
ตกลง: [host01] => (รายการ=host02)

เล่น [ลบไฟล์ออกจาก my_hosts] ***********************************

งาน [ลบไฟล์ออกจากไคลเอนต์] *************************************
ตกลง: [host01]
ตกลง: [host02]

งาน [แก้ไขข้อบกพร่อง] *********************************************** *********
ตกลง: [host01] => 
  ตัวเลือกไฟล์:
    เปลี่ยน: เท็จ
    ล้มเหลว: เท็จ
    เส้นทาง: /tmp/me
    สถานะ: ขาด
ตกลง: [host02] => 
  ตัวเลือกไฟล์:
    เปลี่ยน: เท็จ
    ล้มเหลว: เท็จ
    เส้นทาง: /tmp/me
    สถานะ: ขาด

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา