Ansible: sebuah host muncul di lebih dari satu grup, dan kedua grup memiliki tugas yang sama di dalamnya; Adakah cara untuk menjalankan tugas satu kali?

9

Saya memiliki buku pedoman yang terlihat seperti ini:

---
- hosts: group1
  roles:
    - role1
    - role2

- hosts: group2
  roles:
    - role2
    - role3

Sekarang katakan saya memiliki file host yang memiliki entri seperti ini:

[group1]
host1.example.com

[group2]
host1.example.com

Ansible akan menjalankan tugas-tugas di role2 DUA KALI untuk host1.example.com karena muncul dalam 2 grup, dan masing-masing memiliki role2 ditugaskan untuk mereka.

Bagaimana saya bisa membuat Ansible menyadari bahwa ia memiliki peran yang sama termasuk dua kali, dan karena itu ia hanya dapat menjalankannya sekali?

Asfand Qazi
sumber
Akan lebih baik untuk memberi kita contoh nyata daripada "role1", "role2" dll, karena mungkin Anda harus melakukannya secara berbeda. Tetapi itu tergantung pada apa yang sebenarnya ingin Anda capai.
Antonis Christofides

Jawaban:

10

Seperti yang disebutkan, ini adalah desain. Ansible mengeksekusi hanya satu permainan pada satu waktu. Playbook Anda terdiri dari dua play (dua item dalam daftar YAML tingkat root yang ditentukan oleh file playbook). Permainan pertama berlaku role1 dan role2 untuk group1. Drama itu dijalankan pertama kali, dan hanya setelah selesai barulah drama kedua dimulai. Tetapi Ansible tidak berusaha untuk menggabungkan permainan bersama secara logis. Setelah semua, Anda mungkin benar-benar ingin tugas dalam role2 berjalan dua kali

Adapun untuk mengatasi masalah, ada beberapa cara Anda bisa mengatasi hal ini, dan yang Anda pilih akan tergantung pada detail kelompok dan peran.

Jika semua tugas dalam role2 idempoten, yaitu jika mereka dapat dijalankan beberapa kali dan berakhir dengan hasil yang sama setiap kali, maka semua yang Anda benar-benar kehilangan adalah waktu, dan tidak apa-apa untuk membiarkan peran itu diulang. Jika peran membutuhkan waktu sangat lama untuk diterapkan atau jika Anda tidak dapat membuatnya idempoten, maka pertimbangkan ide-ide berikut:


Anda dapat membagi buku pedoman menjadi tiga drama, dan menerapkan peran satu per satu:

---
- hosts: group1
  roles:
    - role1

- hosts: group1:group2
  roles:
    - role2

- hosts: group2
  roles:
    - role3

Atau jika peran Anda perlu dikelompokkan bersama, Anda dapat membuat grup ketiga untuk server yang membutuhkan ketiga peran tersebut. Anda tidak perlu mengeluarkan mereka dari dua kelompok lainnya. Anda dapat membuat grup di file inventaris Anda seperti ini:

[group1and2:children]
group1
group2

Kemudian di buku pedoman Anda, Anda bisa lagi membagi menjadi tiga drama, tetapi gunakan kelompok ketiga untuk menghindari menjalankan kembali peran:

---
- hosts: group1:!group1and2
  roles:
    - role1
    - role2

 - hosts: group1and2
   roles:
     - role1
     - role2
     - role3

 - hosts: group2:!group1and2
   roles:
     - role2
     - role3

Itu sangat jelek tetapi mungkin berguna dalam beberapa kasus.

daveadams
sumber
Terima kasih, saya pikir saya akan menggunakan variasi opsi (2) - Saya akan membuat grup dan peran saya lebih terperinci untuk mengelompokkan server saya bersama.
Asfand Qazi
Jika saya memanggil host melalui variabel sebagai {{host1}} dan {{host2}}, bagaimana saya bisa menyatukannya?
BMW
Jika Anda mencari bagian dokumentasi: Pola umum
Sahap Asci
3

Ini dengan desain. Satu-satunya cara untuk pergi adalah menerapkan role2 hanya dalam satu buku pedoman untuk satu kelompok tertentu, dan tidak menggunakan peran2 dalam buku pedoman lain pada grup yang mungkin memiliki anggota umum, seperti di sini.

Serge van Ginderachter
sumber