Koşullara göre kabul edilebilir varsayılan değer


16

Bir rol değişkeni varsayılan değerini bazı koşullara (yani başka bir değişkenin değeri) göre değiştirmek mümkün müdür?

ayrıntılar

Bir komut için iki ilişkili değişkenim var envve composer_opts.

Her ikisi de varsayılan olarak bırakılırsa ( env = "prod"ve composer_opts = "--no-dev") her şey yolunda demektir.

Şunu değiştirirsem enviçin devhep hem ayarlamanız gerekir, böylece diğeri için varsayılan, emrime kıracak. Özel bir komut dosyası / if ile koşullu bir varsayılan değer ayarlayarak bundan kaçınmak mümkün müdür?

Önemli: Değeri her zamancomposer_opts değere göre ayarlamak istemiyorum env. Sadece zaten ayarlanmamışsa (yani dinamik bir varsayılan değer) ayarlamak istiyorum.

pseudocode

Böyle bir şey yapmak istiyorum (aşağıdaki kod geçerli değil, sadece ihtiyacımı ifade etmek için sözde kod)

---
# defaults/main.yml

env: prod
composer_opts: 
    when: "{{env}}" = 'prod'
        '--no-dev --optimize-autoloader --no-interaction'
    when: "{{env}}" = 'dev'
        '' 

Yanıtlar:


12

Bu çözümü öneririm:

---
 - set_fact:
     composer_opts: ""
   when: "{{env}}" == 'dev'

composer_optsDeğişken ' ' değerine eşit ""olduğunda değişkeni dizeye ayarlar .envdev

Güncellenmiş soruya dayanan oyun kitabı örneği:

$ cat test.yml

---
- hosts: 127.0.0.1
  connection: local
  tasks:
  - set_fact:
      composer_opts: "{% if env == 'prod' %} '--no-dev --optimize-autoloader --no-interaction' {% else %} '' {% endif %}"

  - debug: var=composer_opts

Örnek çıktı:

sudo ansible-playbook test.yml -e env=dev

PLAY [127.0.0.1] ************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [127.0.0.1]

TASK: [set_fact ] ************************************************************* 
ok: [127.0.0.1]

TASK: [debug var="{{composer_opts}}"] ***************************************** 
ok: [127.0.0.1] => {
    "var": {
        " '' ": " '' "
    }
}

PLAY RECAP ******************************************************************** 
127.0.0.1                  : ok=3    changed=0    unreachable=0    failed=0   


sudo ansible-playbook test.yml -e env=prod

PLAY [127.0.0.1] ************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [127.0.0.1]

TASK: [set_fact ] ************************************************************* 
ok: [127.0.0.1]

TASK: [debug var="{{composer_opts}}"] ***************************************** 
ok: [127.0.0.1] => {
    "var": {
        " '--no-dev --optimize-autoloader --no-interaction' ": " '--no-dev --optimize-autoloader --no-interaction' "
    }
}

PLAY RECAP ******************************************************************** 
127.0.0.1                  : ok=3    changed=0    unreachable=0    failed=0   

1
Bu çözümün bir parçası. Ayarlanan gerçek değerlerin üzerine yazılır ve "dev" composer_optsolduğunda her zaman boş dizeye envayarlanır. Ben koşullu böyle genişletilmesi gerektiğini düşünüyorum: when: "{{env}}" == 'dev' and "{{composer_opts}}" is undefined. İyi görünüyor mu? Sorunuzu buna göre değerlendirebilir misiniz?
Francesco Abeni

composer_opts varsayılan değerine sahip olduğundan tanımlanacaktır. Görevinizi çözmek için başka bir ifadeye ihtiyacınız var. Örneğin custom_composer_opts değişkeni.
Navern

Lütfen ne yapmak istediğinizi pseudocode ile hazırlayın. Cevabımı buna göre güncelleyeceğim.
Navern

Sorumu ek açıklama ve sözde kod örneği ile güncelledim. Teşekkür ederim.
Francesco Abeni

Cevabımı güncelledim. Kontrol et. Neye ihtiyacın olduğunu anladığımı düşünüyorum.
Navern

4

İken Navern cevabı @ çalışır, ben gömülü jinja2 gösterimini bulundu ( "{% if env == 'prod' %} ...) notasyonu son derece duyarlı ve dolayısıyla oldukça kırılgan olmaya. Örneğin, bu test edilmemiş kod gibi daha iyi okunabilirlik için söz konusu satırı sararken :

composer_opts: >
               "{% if env == 'prod' %}
                   '--no-dev --optimize-autoloader --no-interaction'
                {% else %}
                   ''
                {% endif %}"

Ben bu tür ek boşluk veya gibi beklenmedik sonuçlarla, ile sona erdi \nin composer_opts.

Kullandığım yaklaşım çok dumber, ama aynı zamanda daha kararlı:

- name: set composer_opts for dev env
  set_fact:
     composer_opts: ''
     when: "{{env}}" == 'dev'

- name: set composer_opts for prod env
  set_fact:
     composer_opts: '--no-dev --optimize-autoloader --no-interaction'
     when: "{{env}}" == 'prod'

Bu blog yazısını da temelde aynı yaklaşımı izleyen faydalı buldum .


@sec |yerine kullanırsanız >boşluk sorunu olmayabilir. (ya da daha fazlasını LOL alacaksınız)
Michael

@sec '> -' kullanın ve uygun teknik özelliklere bakın. Çok satırlı dizeleri doğru şekilde işlemek için birçok seçeneğe sahiptir. yaml-multiline.info Özellikle blok parçalama göstergesine dikkat edin.
DylanYoung

Bu çözümün de öncelik sorunları olduğunu unutmayın. Bir gerçek varsayılan değildir.
DylanYoung

2

Tek bir astardaki koşullara dayalı sevimli set_fact:

- name: "set composer_opts based on environment"
  set_fact:
     composer_opts:  "{{ '--no-dev --optimize-autoloader --no-interaction' if (env == 'prod') else '' }}"

Diğer çözümlerle aynı öncelik sorunları (bir gerçek varsayılan değildir), ancak bu koşullu hakkı defaults.yml dosyanıza koyarsanız, bu çözüm çalışır.
Duruma
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.