Ansible根据条件改变默认值

是否可以根据某些条件(即另一个variables的值)更改angular色variables默认值?

细节

我有一个命令envcomposer_opts两个相关的variables。

如果两者都保持默认( env = "prod"composer_opts = "--no-dev" ),那么一切都可以。

如果我将env改为dev ,另一个的默认值会打断我的命令,所以我总是需要同时设置。 是否有可能通过设置一个自定义脚本的条件默认值/如果?

重要说明:我不希望根据env始终设置composer_opts值。 我只想设置它,如果它尚未设置(即dynamic默认值)。

伪代码

我想这样做(下面的代码是无效的,只是伪代码来expression我的需要)

 --- # defaults/main.yml env: prod composer_opts: when: "{{env}}" = 'prod' '--no-dev --optimize-autoloader --no-interaction' when: "{{env}}" = 'dev' '' 

我build议这个解决scheme:

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

当variablesenv等于' dev '时,它将把composer_optsvariables设置为string""

这里是基于更新问题的剧本的例子:

 $ 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 

示例输出:

 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 

虽然@ Navern的答案确实起作用,但是我发现embedded的Jinja2符号( "{% if env == 'prod' %} ... )极易受到符号的影响,因此相当脆弱。为了更好的可读性,例如在这个未经testing的代码中

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

我结束了意想不到的结果,如composer_opts其他空格或\n

我使用的方法是非常笨重,但也更稳定:

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

我也发现这个博客文章是有用的,基本上遵循相同的方法。