【问题标题】:Error when set variable with condition - Ansible Playbook on Linux使用条件设置变量时出错 - Linux 上的 Ansible Playbook
【发布时间】:2019-04-15 20:37:15
【问题描述】:

在 Red Hat 的剧本中使用 if/else 条件设置变量时出错。

我尝试了几种不同的引号、括号等排列方式。

执行为“ansible-playbook -e env=dev playbook.yaml”

设置变量:

vars:

  certenv: "{{ '-eng.dev.' if {{env}} == 'eng' else '.dev.' if {{env}} == 'dev' else '.uat.' if {{env}} == 'stg' else '.prd.' if {{env}} == 'prd' }}"

任务

   - name: Update server.xml Cert

     lineinfile:

      dest: "{{tomcat}}/conf/server.xml"

      regexp: '^(.*)certificateFile(.*)$'

      line: 'certificateFile="{{tomcat}}/webapps/{{appwar}}/certificates/app{{certenv}}domain.cer"'

错误

fatal: [localhost]: FAILED! => {"msg": "An unhandled exception occurred while templating '{{ '-eng.dev.' if {{env}} == 'eng' else '.dev.' if {{env}} == 'dev' else '.uat.' if {{env}} == 'stg' else '.prd.' if {{env}} == 'prd' }}'. 
Error was a <class 'ansible.errors.AnsibleError'>, original message: template error while templating string: expected token ':', got '}'. String: {{ '-eng.dev.' if {{env}} == 'eng' else '.dev.' if {{env}} == 'dev' else '.uat.' if {{env}} == 'stg' else '.prd.' if {{env}} == 'prd' }}"}

期望将 certenv 变量设置为“.dev”。例如。

【问题讨论】:

  • 你为什么不尝试使用when?来自ansible conditionals
  • 你试过了吗:certenv: "{{ '-eng.dev.'如果 env == 'eng' 否则 '.dev.'如果 env == 'dev' 否则 '.uat.'如果 env == 'stg' 否则 '.prd.'如果 env == 'prd' }}"
  • @HermanTheGermanHesse - 将调查“何时”谢谢。
  • @cpt_guy - 我得到“'env' is undefined” - 感谢您的回复
  • 你有一个叫 env 的变量吗?我认为我们在正确的轨道上。

标签: ansible


【解决方案1】:

根据 cmets:将您的变量修改为

certenv: "{{ '-eng.dev.' if env == 'eng' else '.dev.' if env == 'dev' else '.uat.' if env == 'stg' else '.prd.' if env == 'prd' }}"

并运行您的剧本:

ansible-playbook myplaybook.yml -e "env=dev".

【讨论】:

    【解决方案2】:

    对于jinja2,语法是:

    vars:
      certenv: "{% if env == 'eng' %}-eng.dev.{% elif env == 'dev' %}.dev.{% elif env == 'stg' %}.uat.{% elif env == 'prd' %}.prd.{% endif %}"
    

    您不需要将变量放在{{...}} 中,因为它们位于jinja2 标记{%...%} 内。

    您还可以使其更具可读性:

    vars:
      certenv:
        "{% if env == 'eng' %}
            -eng.dev.
         {% elif env == 'dev' %}
            .dev.
         {% elif env == 'stg' %}
            .uat.
         {% elif env == 'prd' %}
            .prd.
         {% endif %}"
    

    【讨论】:

    • 谢谢你这工作正常以及@cpt_guy 响应。
    【解决方案3】:

    一个选项是使用 selectattrmap。下面的戏

    vars:
      cert_options:
        eng: "-eng.dev."
        dev: ".dev."
        stg: ".uat."
        prd: ".prd."
      env: "stg"
    tasks:
      - set_fact:
          certenv: "{{ cert_options|dict2items|selectattr('key', 'match', env)|map(attribute='value')|list }}"
      - debug:
          var: item
        loop: "{{ certenv }}"
    

    给予:

    "item": ".uat."
    

    此提示可能有助于解决问题。

    代码的固定语法如下。 (未测试)

    - name: Update server.xml Cert
      lineinfile:
        dest: "{{ tomcat }}/conf/server.xml"
        regexp: "^(.*)certificateFile(.*)$"
        line: "certificateFile={{ tomcat }}/webapps/{{ appwar }}/certificates/app{{ certenv }}domain.cer"
    

    【讨论】:

    • 感谢您的回复。我没有尝试过,因为上述 2 个响应有效。
    • 对。我的似乎更灵活 :) 我认为。
    猜你喜欢
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 2017-01-31
    • 2023-04-05
    相关资源
    最近更新 更多