วิธีระบุโฮสต์ที่แตกต่างกันสำหรับ playbooks ที่แตกต่างกันในหนึ่งสคริปต์ที่เข้าใจได้


9

ตามที่ฉันเข้าใจเพลย์บุ๊คแต่ละรายการจะมีโฮสต์หนึ่งรายการ ฉันต้องการที่จะรู้ว่าถ้าฉันสร้าง playbook คอนเทนเนอร์ที่มี playbooks อื่น ๆ ฉันสามารถกำหนดค่าโฮสต์สำหรับ playbook แต่ละรายการได้หรือไม่ ดังนั้นสิ่งที่ชอบ

---
- include playbook_1.yml
    hosts: tag_postgres
- include: playbook_2.yml
    hosts: tag_rabbitmq

ฉันสามารถใส่ playbooks ที่แตกต่างกันทั้งหมดในสคริปต์และโทรหนึ่ง แต่ด้วยวิธีนี้ฉันไม่สามารถนำ set_fact บางอย่างจาก playbook หนึ่งไปยังอีกเล่มหนึ่งได้ดังนั้นจึงมีงานซ้ำซ้อนมากมาย

ข้อพิสูจน์อีกข้อหนึ่งคือฉันจะเปิดตัว ec2 บนอเมซอนซึ่งจะมีได้ไหม

hosts: localhost

และการกำหนดค่าของ ec2 ที่เปิดตัวซึ่งโดยทั่วไปจะกำหนดค่าสินค้าคงคลังจาก-i ec2.pyและมีโฮสต์ที่ระบุเป็น

hosts: tag_<some_tag>

เกิดขึ้นผ่าน playbook เดียวกันหรือชุด playbooks รวม (บทบาทที่แตกต่าง)


คุณรู้หรือไม่ว่าคุณสามารถมีส่วนได้มากกว่าหนึ่งhosts:ส่วนใน yaml และในสาระสำคัญมี playbooks หลายเล่มที่ใช้กลุ่มโฮสต์ที่แตกต่างกันในสินค้าคงคลังของคุณ?
Yonsy Solis

คำตอบ:


4

ที่จริงแล้วคุณสามารถมีโฮสต์ได้มากกว่าหนึ่งรายการ: ส่วนต่อเพลย์บุ๊ค ดูเหมือนว่าโฮสต์: เริ่มเล่นใหม่ ดูhttp://www.tecmint.com/use-ansible-playbooks-to-automate-complex-tasks-on-multiple-linux-servers/ตัวอย่างเช่น

บางสิ่งเช่นนี้ใช้ได้กับฉัน (ansible 2.2):

---
- hosts: localhost 
  connection: local
  roles:
    - { role: ec2,
        tag: 'master',
        instance_type: t2.2xlarge,
        count: 1
      }
  tasks:
  - shell: hostname # reports localhost

- hosts: tag_master
  tasks:
  - shell: hostname # reports instance(s) with tag 'master'

ดังนั้นใส่โฮสต์: ที่ด้านบนของแต่ละรายการที่รวม .yml ไม่ใช่หลังจากรวม:


4

http://docs.ansible.com/ansible/playbooks_variables.html#information-discovered-from-systems-facts

... มีสถานที่อื่น ๆ ที่ตัวแปรสามารถมาจาก แต่สิ่งเหล่านี้เป็นตัวแปรชนิดหนึ่งที่ถูกค้นพบซึ่งไม่ได้กำหนดโดยผู้ใช้

ข้อเท็จจริงคือข้อมูลที่ได้จากการพูดกับระบบรีโมตของคุณ ...

ข้อเท็จจริงมาจากโฮสต์ระยะไกลของคุณ ดังนั้นนี่คือเหตุผลที่ว่าทำไมปกติคุณสามารถแบ่งปันข้อเท็จจริงระหว่างโฮสต์ที่แตกต่างกันของคุณเมื่อคุณ.yml *ไฟล์มีหลายplaybooks

ตอนนี้คุณสามารถเข้าถึงข้อเท็จจริงจากโฮสต์อื่น ๆ ถ้าคุณทำสิ่งนี้ในส่วนอื่นของ playbook ของคุณ:

{{ hostvars['server01.example.com']['ansible_eth0']['ipv4']['address'] }}
...
...
{{ hostvars[groups['servers'][0]]['ansible_eth0']['ipv4']['address'] }}

แต่ในกรณีนี้คุณต้องจำไว้ว่าคุณต้องได้รับข้อเท็จจริงก่อนใช้งาน จากนั้นคุณสามารถตั้งค่าส่วนแรกใน playbook ของคุณเพื่อรับข้อเท็จจริงทั้งหมดสำหรับโฮสต์ทั้งหมดหรือใช้การแคชจริงสำหรับสิ่งนี้ (ดู: http://docs.ansible.com/ansible/playbooks_variables.html#fact-caching )

ตอนนี้หากคุณต้องการแชร์ตัวเลือกใน playbooks ของคุณอาจจะดีกว่าที่จะคิดใหม่ข้อมูลที่จะใส่ในตัวแปรและด้วยสิ่งนี้คุณสามารถ "แบ่งปัน" ตัวแปรของคุณด้วยincludeคำสั่งเดียวกันดูที่:

http://docs.ansible.com/ansible/playbooks_variables.html#variables-defined-from-included-files-and-roles


2
คำถามของฉันเฉพาะเจาะจงกับโฮสต์ไม่ใช่ตัวแปรโดยทั่วไป ความต้องการของฉันคือการสามารถสร้าง playbook ต้นแบบที่ไม่มีโฮสต์ได้ แต่ playbook ที่รวมอยู่แต่ละชุดจะมีโฮสต์อยู่ภายในหรือสามารถกำหนดให้เป็นพารามิเตอร์ได้ ฉันสามารถเรียกใช้พวกเขาเป็น playbooks แยกต่างหาก แต่จากนั้นข้อเท็จจริงที่ได้ในหนึ่งจะไม่ส่งต่อไปยังหน้าถัดไปและดังนั้นจึงมีความซ้ำซ้อนจำนวนมาก
Pankaj Lal

โปรดอ่านข้างบนอีกครั้ง: "ตอนนี้คุณสามารถเข้าถึงข้อเท็จจริงจากโฮสต์อื่น ๆ ได้ถ้าคุณทำสิ่งนี้ในส่วนอื่นของ playbook ของคุณ: ... แต่ในกรณีนี้คุณต้องจำไว้ว่าคุณต้องได้รับข้อเท็จจริงก่อนใช้งาน "ใช่คุณสามารถแบ่งปันข้อเท็จจริงระหว่าง playbooks ที่รวมอยู่ใน playbook หลักของคุณ
Yonsy Solis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.