Uygun: bir ana bilgisayar birden fazla grupta görünür ve her iki grup da aynı görevlere sahiptir; görevleri bir kez çalıştırmanın herhangi bir yolu var mı?


9

Ben böyle bir şey görünüyor bir oyun kitabı var:

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

- hosts: group2
  roles:
    - role2
    - role3

Şimdi böyle bir girişi olan bir hosts dosyası var diyelim:

[group1]
host1.example.com

[group2]
host1.example.com

Ansible, host1.example.com için rol2 TWICE içindeki görevleri 2 grupta göründüğünden ve her birine kendilerine atanan rol2 atadığından çalışacaktır.

Ansible'ın aynı rolü iki kez içerdiğini fark etmesini nasıl sağlayabilirim ve bu yüzden sadece bir kez çalıştırmalıdır?


Bize "role1", "role2" vb. Yerine gerçek örnekler vermek daha iyi olur, çünkü belki de farklı şekilde yapmalısınız. Ama bu aslında neyi başarmaya çalıştığınıza bağlıdır.
Antonis Christofides

Yanıtlar:


10

Belirtildiği gibi, bu tasarım gereğidir. Ansible her seferinde sadece bir oyun yürütür. Oynatma kitabınız iki oynatmadan (oynatma kitabı dosyası tarafından tanımlanan kök düzeyi YAML listesindeki iki öğe) oluşur. İlk oyun rol1 ve rol2'yi grup1'e uygular. Bu oyun önce yürütülür ve bittikten sonra ikinci oyun başlar. Ancak Ansible oyunları mantıklı bir şekilde birleştirmeye çalışmaz. Sonuçta, role2'deki görevlerin iki kez çalışmasını isteyebilirsiniz.

Sorunu ele almak için, bu sorunu çözmenin birkaç yolu vardır ve seçtiğiniz gruplar ve rollerin ayrıntılarına bağlıdır.

Rol2'deki tüm görevler idempotent ise, yani birden çok kez çalıştırılabilir ve her seferinde aynı sonuçla sonuçlanabilirse, gerçekten kaybettiğiniz tek şey zaman demektir ve rollerin tekrarlanmasına izin vermek uygundur. Rollerin uygulanması çok uzun sürüyorsa veya bunu idempotent yapamıyorsanız, aşağıdaki fikirleri göz önünde bulundurun:


Başucu kitabını üç oyuna bölebilir ve rolleri ayrı ayrı uygulayabilirsiniz:

---
- hosts: group1
  roles:
    - role1

- hosts: group1:group2
  roles:
    - role2

- hosts: group2
  roles:
    - role3

Veya rollerinizin birlikte gruplanması gerekiyorsa, üç rolün tümüne ihtiyaç duyan sunucular için üçüncü bir grup oluşturabilirsiniz. Onları diğer iki gruptan çıkarmanıza gerek yok. Grubu envanter dosyanızda şu şekilde oluşturabilirsiniz:

[group1and2:children]
group1
group2

Ardından, oyun kitabınızda tekrar üç oyuna ayrılabilirsiniz, ancak rolleri yeniden çalıştırmaktan kaçınmak için üçüncü grubu kullanın:

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

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

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

Bu oldukça çirkin ama bazı durumlarda faydalı olabilir.


Teşekkürler, sanırım bir seçenek (2) varyasyonu ile gideceğim - Gruplarımı ve rolleri sunucularımı gruplandırmak için daha ayrıntılı hale getireceğim.
Asfand Qazi

Ana bilgisayarları {{host1}} ve {{host2}} değişkeniyle çağırırsam, bunları nasıl bir araya getirebilirim?
BMW

Belgeler bölümünü
ararsanız

3

Bu tasarım gereğidir. Tek yol, rol2'yi yalnızca bir oynatma kitabında belirli bir gruba uygulamak ve rol2'yi burada olduğu gibi ortak üyeleri olabilecek bir gruptaki başka herhangi bir oynatma kitabında kullanmamak olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.