是否可以根据某些条件(即另一个变量的值)更改角色变量的默认值?
我有一个命令的两个相关变量,env和composer_opts.
如果两者都保留为默认值(env = "prod"和composer_opts = "--no-dev"),则一切正常。
如果我更改env为dev,另一个的默认值会破坏我的命令,所以我总是需要同时设置两者。是否可以通过使用自定义脚本/if 设置条件默认值来避免这种情况?
重要提示:我不想总是设置composer_opts根据该值env的价值。我只想在尚未设置的情况下设置它(即动态默认值)。
我想做这样的事情(以下代码无效,只是表达我需要的伪代码)
---
# defaults/main.yml
env: prod
composer_opts:
when: "{{env}}" = 'prod'
'--no-dev --optimize-autoloader --no-interaction'
when: "{{env}}" = 'dev'
''
Run Code Online (Sandbox Code Playgroud)
Nav*_*ern 14
我建议这个解决方案:
---
- set_fact:
composer_opts: ""
when: "{{env}}" == 'dev'
Run Code Online (Sandbox Code Playgroud)
当变量等于' '时,它会将composer_opts变量设置为字符串。""envdev
以下是基于更新问题的剧本示例:
$ 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
Run Code Online (Sandbox Code Playgroud)
示例输出:
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
Run Code Online (Sandbox Code Playgroud)
虽然@Navern 的回答确实有效,但我发现嵌入的 Jinja2 符号 ( "{% if env == 'prod' %} ...) 非常容易受到符号的影响,因此相当脆弱。例如,当包装有问题的行以获得更好的可读性时,例如在此未经测试的代码中:
composer_opts: >
"{% if env == 'prod' %}
'--no-dev --optimize-autoloader --no-interaction'
{% else %}
''
{% endif %}"
Run Code Online (Sandbox Code Playgroud)
我结束了意想不到的效果,如额外的空格或\n在composer_opts。
我使用的方法要笨得多,但也更稳定:
- 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'
Run Code Online (Sandbox Code Playgroud)
我还发现这篇博文很有用,它基本上遵循相同的方法。