【问题标题】:Ansible, set_fact using if then else statementAnsible,set_fact 使用 if then else 语句
【发布时间】:2017-08-13 15:11:30
【问题描述】:

我正在尝试根据另一个变量在运行时使用 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 设置什么。

【问题讨论】:

    标签: ansible jinja2 ansible-template


    【解决方案1】:

    首先,YAML 中的字典没有顺序(Ansible 在这里使用的语法是 YAML 字典),所以你不能保证 Ansible 会先设置jm_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 %}"
    

    【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 2011-05-11
      • 2016-08-30
      相关资源
      最近更新 更多