Ansible rolündeki varsayılanlar ve değişkenler arasındaki fark nedir?


158

Yeni bir yanıtlayıcı 'rol oluştururken, şablon a hem oluşturur varsve bir defaultsboş ile dizin main.ymldosyası. Rolümü tanımlarken, bunlardan herhangi birine değişken tanımları yerleştirebilirim ve bunlar görevlerimde mevcut olacaktır.

İçine tanımlarını html arasındaki fark nedir defaultsve vars? Neye girmeli defaultsve neye girmeli vars? Aynı veriler için ikisini birden kullanmak mantıklı mı?

İkisi arasında öncelik / öncelik farkı olduğunu biliyorum, ancak neyin nereye gitmesi gerektiğini anlamak istiyorum.

Diyelim ki rolüm, hedef sistemde bir dizin listesi oluşturacak. Oluşturulacak varsayılan dizinlerin bir listesini sağlamak istiyorum, ancak kullanıcının rolü kullanırken bunları geçersiz kılmasına izin vermek istiyorum.

İşte bunun nasıl görüneceği:

---
- directories:
  - foo
  - bar
  - baz

İçine ya bu yer verebilir defaults/main.ymlveya vars/main.ymlancak nereye gitmeli - bir yürütme açısından, herhangi bir şeyi değiştirmez?

Yanıtlar:


116

Değişken önceliğe ilişkin Ansible belgeleri bu ayrıntıyı özetler:

Aynı isimde birden fazla değişken farklı yerlerde tanımlanırsa, belirli bir sırayla kazanırlar, yani:

  • ekstra değişkenler (komut satırında -e) her zaman kazanır
  • daha sonra envanterde tanımlanan bağlantı değişkenleri gelir (ansible_ssh_user, vb.)
  • sonra "diğer her şeyin çoğu" gelir (komut satırı anahtarları, oyundaki değişkenler, dahil edilen değişkenler, rol değişkenleri vb.)
  • daha sonra envanterde tanımlanan değişkenlerin geri kalanı gelir
  • sonra bir sistem hakkında keşfedilen gerçekler gelir
  • daha sonra en "varsayılan" olan ve her şeyde önceliği kaybeden "rol varsayılanları".

Öyleyse, Tomcat'i bir grup web barındırıcıya yüklemek için kullandığınız bir "tomcat" rolünüz olduğunu, ancak birkaç ana bilgisayarda tomcat'in farklı sürümlerine ihtiyacınız olduğunu, diğer durumlarda farklı kullanıcılar olarak çalışması gerektiğini vb. Varsayalım. defaults/main.ymlDosya görünebilir. bunun gibi bir şey:

tomcat_version: 7.0.56
tomcat_user: tomcat

Bunlar sadece varsayılan değerler olduğundan, bu değişkenler söz konusu ana bilgisayar için başka hiçbir yerde tanımlanmamışsa kullanılacakları anlamına gelir. Bu değişkenler için farklı değerler belirtmek üzere, bunları ekstra değişkenlerle, envanter dosyanızdaki gerçekler aracılığıyla vb. Geçersiz kılabilirsiniz.

Düzenleme: Yukarıdaki listenin Ansible 1.x için olduğunu unutmayın. Ansible 2.x'te liste genişletildi. Her zaman olduğu gibi Ansible Belgeleri , 2.x için değişken önceliğin ayrıntılı bir açıklamasını sağlar.


4
Teşekkürler, bu mükemmel bir sayfa - aradığım buydu. Neyin içine ne koyacağımı defaultsve varsdaha sonra neyi koyacağımı çok daha fazla ayrıntıya giriyorum .
nwinkler

44
vurgulanmaya değer: rol değişkenlerinin kötü-yüksek bir önceliği vardır . benim deneyimlerime göre, gerçekten sinir bozucu olan oyun değişkenlerinden daha yüksek.
tedder42

1
5 yıl sonra, ama ... Ben buna şu şekilde bakma eğilimindeyim: rol varsayılanları, rolün bir kullanıcısının bir yerlerde kendi değişkenlerinde geçersiz kılmasını beklediğim şeylerdir. Rol değişkenleri, OTOH, bir görevdeki bilgilerin sabit kodlanmasından kaçınmama izin veriyor, ancak büyük olasılıkla yalnızca test için geçersiz kılınacak ve bir rol sürdürücü tarafından değiştirilecek. Örnek olarak, bir ilk yönetici kullanıcı adı varsayılanlarda olacaktır, ancak bağımlılık sürümleri değişkenler içinde olacaktır.
ntwrkguru

44

İçinde tanımlanan rol değişkenleri varçok yüksek önceliğe sahiptir - yalnızca komut satırından, belirli bir görevde veya bir blokta iletilerek üzerine yazılabilirler. Bu nedenle, neredeyse tüm değişkenleriniz içinde tanımlanmalıdır defaults.

" Değişken Önceliği - Rolünüzü Nereye Koymalısınız Vars " makalesinde yazar, nelerin konulacağına dair bir örnek veriyor vars: Çok değişmeyen sisteme özgü sabitler. Sahip olabileceğiniz Yani vars/debian.ymlve vars/centos.ymlaynı değişken adlarının ama farklı değerlerle ve onları şartlı sayılabilir.


4

IMHO Ansible'ın çeşitli rollerde konfigürasyona bu kadar yüksek öncelik vermesi pratik değildir ve mantıklı değildir . Yapılandırma vars/main.ymlvedefaults/main.yml düşük ve muhtemelen aynı öncelik olmalıdır.

Bu tür davranışları istediğimiz vakaların gerçek hayattan örnekleri var mı?

Bunu istemediğimiz örnekler var.

Burada dikkat edilmesi gereken nokta, yapılandırmanın defaults/main.ymldinamik olamayacağıdır. Tenekede konfigürasyon vars/main.yml. Örneğin, geerlingguy.postgresql'de gösterildiği gibi belirli bir işletim sistemi ve sürümü için dinamik olarak yapılandırmayı dahil edebilirsiniz.

Öncelik tanıtmak yanıtlayıcı 'geerlingguy ihtiyaçlarını çok garip ve pratik değildir çünkü sözde değişkenleri de görülebileceği gibi variables.yml

- name: Define postgresql_packages.
  set_fact:
    postgresql_packages: "{{ __postgresql_packages | list }}"
  when: postgresql_packages is not defined

Bu, önceliğin pratik olmadığını gösteren somut bir gerçek hayat örneğidir.

Burada belirtmemiz gereken bir diğer nokta, rollerin yapılandırılabilir olmasını istediğimizdir. Roller harici olabilir, başka biri tarafından yönetilebilir. Genel bir kural olarak, rollerdeki yapılandırmanın yüksek önceliğe sahip olmasını istemezsiniz.


Bu bir cevap değil, bir yorum olmalıdır.
ntwrkguru

3

Temel olarak, "rol varsayılanları" na (rol içindeki varsayılan klasör) giren her şey en kolay anlaşılır ve kolayca geçersiz kılınandır. Rolün vars dizinindeki herhangi bir şey, bu değişkenin ad alanındaki önceki sürümlerini geçersiz kılar. Buradaki izlenecek fikir, kapsama ne kadar açık olursanız, komut satırı ile o kadar öncelik kazanır - her zaman ekstra değişkenler kazanır. Ana bilgisayar ve / veya envanter değişkenleri rol varsayılanlarını kazanabilir, ancak vars dizini veya include_vars görevi gibi açıkça dahil edemez. belge


-4

Değişkenler ve varsayılanlar el ele yürür. işte bir örnek

-name: install package
 yum: name=xyz{{package_version}} state=present

varsayılan dosyanızda aşağıdaki gibi bir şeye sahip olursunuz:

package_version: 123

Yanıtlayanın yapacağı şey, değerini alacak package_versionve paket adının yanına koyacak, böylece bir yerde şöyle okuyacaktır:

-name: install package
 yum: name=xyz123 state=present

Bu şekilde , xyz'lerin büyük deposunda ne varsa yükleyecek xyz123ve kurmayacaktır xyz123.4.

Sonunda yapacak yum install -y xyz123

Dolayısıyla, temelde varsayılanlar mevcut değerlerdir, değişkenler için belirli bir değer ayarlamazsanız, bu alan boş kalamaz.


Soruyu ele almadığı için olumsuz oy verildi. Açıkçası defaults, varstanımlı olmadığında kullanılır , ancak cevap açıklamaz, neden bir değeri biri veya diğeri olarak tanımlayacağınızı, OP'nin sorduğu şey budur. Aşağıdaki açıklama ile karşılaştırın.
Thomas Hirsch
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.