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