是否可以根据某些条件(即另一个变量的值)更改角色变量的默认值?
细节
我有两个相关的命令变量,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'
''
我建议这个解决方案:
当变量等于' '时,它将
composer_opts
变量设置为字符串。""
env
dev
以下是基于更新问题的剧本示例:
样本输出:
虽然@Navern 的回答确实有效,但我发现嵌入的 Jinja2 符号 (
"{% if env == 'prod' %} ...
) 极易受到符号的影响,因此相当脆弱。例如,当包装有问题的行以获得更好的可读性时,例如在这个未经测试的代码中:我最终得到了意想不到的结果,例如额外的空格或
\n
.composer_opts
我使用的方法更笨,但也更稳定:
我还发现这篇博客文章很有用,它基本上遵循相同的方法。
Ansible set_fact 基于一个衬里的条件:
设置事实:路径安装:| {% if reportviewer_state == 'absent' and reportviewer_handler[reportviewer_package].name == 'ReportViewer_2010.exe' %} C:\Windows\System32\msiexec.exe {% else %} {{ url_base_repository }}{{ reportviewer_handler[reportviewer_package ].name }} {% endif %}