Ansible change default value according to a condition
Solution 1:
I suggest this solution:
---
- set_fact:
composer_opts: ""
when: "{{env}}" == 'dev'
It will set composer_opts
variable to string ""
when variable env
is equal to 'dev
'.
Here is example of playbook based on updated question:
$ 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
Sample output:
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
Solution 2:
While @Navern's answer does work, I found the embedded Jinja2 notation ("{% if env == 'prod' %} ...
) to be extremely susceptible to notation and thus rather fragile. For example, when wrapping the line in question for better readability such as in this untested code:
composer_opts: >
"{% if env == 'prod' %}
'--no-dev --optimize-autoloader --no-interaction'
{% else %}
''
{% endif %}"
I ended up with unexpected results, such as additional whitespace or \n
in composer_opts
.
The approach I use is much dumber, but also more stable:
- 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'
I also found this blog post to be useful which essentially follows the same approach.
Solution 3:
Ansible set_fact based on condition in one liner :
- name: "set composer_opts based on environment"
set_fact:
composer_opts: "{{ '--no-dev --optimize-autoloader --no-interaction' if (env == 'prod') else '' }}"