14

我正在尝试根据另一个变量在运行时使用 set_fact 在 Ansible 中设置一个变量。如果无论实际值是什么,都使用第一个值。这是我的代码示例:

- name: Global_vars - get date info
    set_fact:  
      jm_env: "{{lookup('env', 'Environment')}}"
      l_env: "{% if '{{jm_env}}==Develop' %}d{% elif '{{jm_env}}==Staging'%}s{% else %}p{% endif %}"

l_envd不管是什么设置jm_env

4

2 回答 2

17

首先,YAML 中的字典没有顺序(Ansible 在这里使用的语法是 YAML 字典),所以你不能保证 Ansiblejm_env在继续之前会先设置l_env——你需要将分配分成两个任务。

其次,您的测试表达式不正确 -'{{jm_env}}==Develop'是一个字符串,因为它被引用了;并且测试if 'string'将始终评估为true(这是您始终获得d输出的直接原因)。

利用:

- name: Set the jm_env
    set_fact:  
      jm_env: "{{lookup('env', 'Environment')}}"

- name: Set the l_env
    set_fact:  
      l_env: "{% if jm_env=='Develop' %}d{% elif jm_env=='Staging'%}s{% else %}p{% endif %}"
于 2017-03-21T21:36:22.073 回答
9

设置基于事实的条件示例的简单方法之一如下:

  - name: Set facts for delete operation results
    set_fact:
        tr_result: "{{ '{\"status\": \"SUCCESS\"}' if (op_result['output'] == 'Deleted') else '{\"status\" : \"FAILED\"}' }}"

注意:假设op_result是一个已经定义的字典。

代码已经过测试并且运行良好。

于 2018-05-04T14:32:30.107 回答