[英]Create ansible list variable with jinja2
以下代码位于角色的 defaults/main.yml 文件中:
file_env: "{% if cf_env is equalto 'cf10_dev' %}\
dev\
{% elif cf_env is equalto 'cf10_stg' %}\
stg\
{% elif (cf_env is equalto 'cf10_prd') or (cf_env is equalto 'cf10_prd_ext') %}\
prd\
{% elif cf_env is equalto 'cf11' %}\
[dev, prd]
{% endif %}"
前 3 个条件语句工作正常,其中file_env
var 设置为单个值,但是当尝试将file_env
var 设置为列表(最后一个 elif 语句)时,它不起作用:
failed: [server-new.xxx.com] (item=[dev, prd] ) => {"ansible_loop_var": "item", "changed": false, "item": "[dev, prd] ", "msg": "Destination /opt/coldfusion11/[dev, prd] 01/bin/jvm.config does not exist !", "rc": 257}
这是产生上述错误的任务:
- name: Update jvm.config for coldfusion11 server
lineinfile:
path: /opt/coldfusion11/{{ item }}01/bin/jvm.config
regexp: '^java.home'
line: 'java.home=/usr/lib/jvm/jre-openjdk'
loop:
- "{{ file_env }}"
notify:
- handler_create_script_list
- handler_restart_coldfusion10
when:
- cf_env == "cf11"
如何将file_env
var 设置为列表?
我相信你的问题是它将变量解释为一个字符串,字面意思是'[dev, prd] '
(最后有一个空格,根据错误消息判断)。
我认为您想尝试https://serverfault.com/a/913936/512181中建议的不同格式
如果您要遍历您的 var,则应始终返回一个列表(需要时带有单个元素)以避免可能的棘手错误。 您只需将loop
表达式修改为以下内容:
loop: "{{ file_env }}"
您的模板表达式没有使用空格控件,当它们不应该出现时,它们最终会在 output 中出现新行。
你的变量定义很难读(这让我觉得你有更深层次的项目架构问题,但那是另一回事了)。 考虑到上面的第 1 点,我建议您使用 dict 中的键/值映射并在最终 var 中获取相应的值,重构为以下更具可读性、可持续性和工作性的形式
files_by_env cf10_dev: - dev cf10_stg: - stg cf10_prd: - prd cf10_prd_ext: - prd cf11: - dev - prd file_env: "{{ files_by_env[cf_env] }}"
或者,您可以反转 dict 中的定义(即每个文件的列表环境),这稍微不那么冗长,但会导致更复杂的表达式来获得结果
env_by_file: dev: - cf10_dev - cf11 stg: - cf10_stg prd: - cf10_prd - cf10_prd_ext - cf11 file_env: "{{ env_by_file | dict2items | selectattr('value', 'contains', cf_env) | map(attribute='key') | list }}"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.