设置条件变量时出错-Linux上的Ansible Playbook

时间:2019-04-15 11:19:08

标签: ansible

在红帽上使用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”。例如。

3 个答案:

答案 0 :(得分:0)

一种选择是使用 selectattr map 。下面的游戏

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"

答案 1 :(得分:0)

对于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 %}"

答案 2 :(得分:0)

根据评论:将变量修改为

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".