Valor padrão de modificação ansível de acordo com uma condição

12

É possível alterar um valor padrão de variável de função de acordo com alguma condição (ou seja, o valor de outra variável)?

Detalhes

Eu tenho duas variáveis relacionadas para um comando, env e composer_opts .

Se ambos forem deixados no padrão ( env = "prod" e composer_opts = "--no-dev" ), tudo ficará bem.

Se eu alterar env para dev , o padrão para o outro irá quebrar meu comando, então eu sempre preciso definir ambos. Seria possível evitar isso configurando um valor padrão condicional com um script personalizado / se?

Importante: Eu não quero sempre definir o valor composer_opts de acordo com o valor env . Quero defini-lo apenas se ainda não estiver definido (ou seja, um valor padrão dinâmico).

Pseudocódigo

Eu gostaria de fazer algo assim (o seguinte código não é válido, apenas pseudocódigo para expressar minha necessidade)

---
# defaults/main.yml

env: prod
composer_opts: 
    when: "{{env}}" = 'prod'
        '--no-dev --optimize-autoloader --no-interaction'
    when: "{{env}}" = 'dev'
        '' 
    
por Francesco Abeni 21.08.2015 / 12:43

3 respostas

10

Sugiro esta solução:

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

Ele definirá composer_opts variable como string "" quando a variável env for igual a ' dev '.

Aqui está um exemplo de uma cartilha com base em uma pergunta atualizada:

$ 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

Exemplo de saída:

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   
    
por 21.08.2015 / 12:46
4

Embora a @ resposta do Navern funcione, achei a notação Jinja2 incorporada ( "{% if env == 'prod' %} ... ) extremamente suscetível à notação e assim, bastante frágil. Por exemplo, quando envolver a linha em questão para melhor legibilidade, como neste código não testado :

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

Acabei com resultados inesperados, como espaços em branco adicionais ou \n em composer_opts .

A abordagem que uso é muito mais burra, mas também mais estável:

- 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'

Eu também achei esta postagem no blog útil, que essencialmente segue a mesma abordagem.

    
por 09.12.2016 / 15:30
1

Ansible set_fact baseado na condição em um forro:

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

Tags