Ansible: วิธีการเรียกใช้งานหนึ่งโฮสต์โดยโฮสต์?


15

ในระดับการเล่นเราต้องserial: 1อนุญาตให้เราเรียกใช้การเล่นทั้งหมดครั้งละหนึ่งโฮสต์ แต่ฉันไม่ได้พบวิธีง่ายๆในการทำสิ่งนี้ในงานเดียว สิ่งนี้มีความเกี่ยวข้องเป็นพิเศษหากงานที่มีปัญหาไม่สามารถทำการล็อคได้อย่างเหมาะสม (ด้วยเหตุผลใดก็ตาม)

หนึ่งคำตอบที่ชัดเจนคือการวางงานในการเล่นของตัวเอง แต่นั่นไม่ได้ช่วยบทบาท ( serial: 1การเล่นบทโดยใช้บทบาทนั้นไม่ง่ายนัก)

คำตอบ:


12

หากคุณไม่ต้องการให้ความขนานในการดำเนินการตามขั้นตอนใน playbook ของคุณให้กำหนดระดับ fork เป็น 1:

ansible-playbook --forks=1 ...

คุณยังสามารถใส่มันลงในไฟล์ cfg ของคุณได้:

[defaults]
forks=1

แต่ถ้าคุณต้องการเป็นรายบุคคลให้ใช้ตัวเลือกบรรทัดคำสั่งด้านบน

แก้ไข:

serial: 1ทำสิ่งที่แตกต่างอย่างสิ้นเชิง: นั่นเหมือนกับการเรียกใช้ playbook สำหรับแต่ละโฮสต์โดยรอให้ playbook ที่สมบูรณ์เสร็จสิ้นก่อนที่จะย้ายไปยังโฮสต์ถัดไป forks=1หมายถึงเรียกใช้งานแรกในการเล่นบนโฮสต์หนึ่งก่อนที่จะทำงานเดียวกันบนโฮสต์ถัดไปดังนั้นงานแรกจะถูกเรียกใช้สำหรับแต่ละโฮสต์ก่อนที่จะแตะงานถัดไป

ดังนั้นคุณต้องforks=1เล่นเพียงครั้งเดียว; น่าเสียดายที่ปัจจุบันไม่สามารถทำได้


2
ฉันไม่ต้องการตั้งให้เล่นทั้งเล่ม นั่นเป็นสิ่งที่ไม่ใช่เม็ด serial: 1ให้ฉันตั้งไว้อย่างน้อยเล่น แต่ฉันแค่อยากจะตั้งมันไว้ในส่วนย่อยของละคร (สิ่งที่เคยเป็นชื่อที่ถูกต้องนั่นคือฉันคิดว่ามันเป็น "งาน" แต่ความคิดเห็นข้างต้นดูเหมือนจะไม่เห็นด้วย)
Elrond

3
serial: 1ทำสิ่งที่แตกต่างอย่างสิ้นเชิง: นั่นเหมือนกับการเรียกใช้ playbook สำหรับแต่ละโฮสต์โดยรอให้ playbook ที่สมบูรณ์เสร็จสิ้นก่อนที่จะย้ายไปยังโฮสต์ถัดไป forks=1หมายถึงเรียกใช้งานแรกในการเล่นบนโฮสต์หนึ่งก่อนที่จะทำงานเดียวกันบนโฮสต์ถัดไปดังนั้นงานแรกจะถูกเรียกใช้สำหรับแต่ละโฮสต์ก่อนที่จะแตะงานถัดไป ดังนั้นคุณต้องการforks=1เล่นเพียงครั้งเดียว; น่าเสียดายที่ปัจจุบันไม่สามารถทำได้
wurtel

จุดดี! คุณจะเพิ่มสิ่งนั้นในคำตอบหรือไม่?
Elrond

2

มีวิธีแก้ไขปัญหานี้ - สามารถส่งรายชื่อโฮสต์ (หรือกลุ่ม) ไปยังwith_itemsแล้วใช้delegate_toกับรายการนี้ วิธีนี้จะดำเนินการโฮสต์โดยโฮสต์

ตัวอย่างเช่น:

- name: start and enable rabbitmq (run task host by host)
  service:
    name: "rabbitmq-server"
    state: "started"
    enabled: true
  delegate_to: "{{ item }}"
  with_items: "{{ groups['rabbitmq-cluster'] }}"
  run_once: true

สำหรับผู้ที่สงสัยว่าทำไมrun_once: trueอยู่ที่นั่นให้ลองหยิบมันออกมา คุณจะไม่ชอบสิ่งที่เกิดขึ้น (จำนวนมากทำงานซ้ำ aaaahhhh)
Almenon

1

หากคุณกำลังเรียกใช้งานบนเครื่องเดียวปัญหาการล็อคแบบเอกสิทธิ์จะเกิดขึ้นกับโฮสต์มากกว่าหนึ่งโฮสต์ดังนั้นคุณควรดำเนินการทีละรายการสำหรับโฮสต์ทั้งหมดด้วยเหตุนี้คุณต้อง--forks=1ตั้งค่าเมื่อเรียกคำสั่งเพลย์บุ๊คแบบ ansible ตัวอย่างที่: ansible-playbook webserver.yml --forks=1ที่ webserver.yml มีapp01 และ app02ภายในตัวคุณ[webserver]


0

คิดว่าสิ่งที่คุณต้องการคือ

run_once: จริง


4
ไม่: "run_once: true" หมายถึงการเรียกใช้งานสำหรับหนึ่งโฮสต์ในรายการโฮสต์ ฉันต้องการเรียกใช้สำหรับแต่ละโฮสต์ในรายการ แต่อย่างใดอย่างหนึ่งหลังจากที่อื่น
Elrond

0

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

เช่น:

- name: Init New Appliances - Remove the known hosts entry for the server in case it has changed
  run_once: yes
  connection: local
  become: no
  command: "ssh-keygen -R {{ item }}"
  with_items:
  - "{{ inventory_hostname }}"

1
คุณต้องใส่รายชื่อโฮสต์แทนชื่อโฮสต์inventory_hostnameมิฉะนั้นการวนซ้ำก็ไม่สมเหตุสมผล
Konstantin Suvorov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.