รันงานเฉพาะในกรณีที่โฮสต์ไม่ได้อยู่ในกลุ่ม


107

ฉันต้องการเรียกใช้งานที่ตอบได้ก็ต่อเมื่อโฮสต์ของ playbook ปัจจุบันไม่ได้อยู่ในกลุ่มใดกลุ่มหนึ่ง ในรหัสกึ่งหลอก:

- name: my command
  command: echo stuff
  when: "if {{ ansible_hostname }} not in {{ ansible_current_groups }}"

ฉันควรทำอย่างไร?

คำตอบ:


199

นี่เป็นอีกวิธีหนึ่งในการดำเนินการนี้:

- name: my command
  command: echo stuff
  when: "'groupname' not in group_names"

group_namesเป็นตัวแปรมหัศจรรย์ตามที่บันทึกไว้ที่นี่: https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#accessing-information-about-other-hosts-with-magic-variables :

group_names คือรายการ (อาร์เรย์) ของกลุ่มทั้งหมดที่โฮสต์ปัจจุบันอยู่


3
+1 และหากคุณไม่รวมคำพูดโดยรอบคุณจะได้รับข้อผิดพลาด:This one looks easy to fix. It seems that there is a value started with a quote, and the YAML parser is expecting to see the line ended with the same kind of quote.
Peter Ajtai

3
ฉันพบว่าวิธีนี้อ่านง่ายและสะดวกกว่าในการเขียน แต่ทั้งสองอย่างทำงานได้ดีพอ ๆ กัน when: inventory_hostname not in groups.certain_groups
Liam

4
วิธีนี้มีประสิทธิภาพมากกว่าinventory_hostname in groups['groupname']เนื่องจากในกรณีที่ไม่มียาแนวเอง Ansible จะแสดงข้อผิดพลาดเช่น "ตรวจสอบให้แน่ใจว่าชื่อตัวแปรของคุณไม่มีอักขระที่ไม่ถูกต้องเช่น '-': อาร์กิวเมนต์ประเภท 'StrictUndefined' ไม่สามารถทำซ้ำได้"
hamx0r

20

คุณสามารถตั้งค่าตัวแปรควบคุมในไฟล์ vars ที่อยู่ในgroup_vars/หรือในไฟล์โฮสต์โดยตรงดังนี้:

[vagrant:vars]
test_var=true

[location-1]
192.168.33.10 hostname=apollo

[location-2]
192.168.33.20 hostname=zeus

[vagrant:children]
location-1
location-2

และเรียกใช้งานเช่นนี้:

- name: "test"
  command: "echo {{test_var}}"
  when: test_var is defined and test_var

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