使用ansible过滤器和环境变量进行变量插值

时间:2016-08-19 19:46:16

标签: filter ansible jinja2

我有一个角色可以引导用户的OSX工作站。在其中,我需要使用以下优先级确保正确设置xdg变量:

  • 默认/ main.yml
  • 用户的环境变量
  • 任何其他值(在vars,host_vars,命令行等中设置)

我尝试了几种不同的方法,但我遇到的基本问题是我无法嵌套变量插值,所以接近一个(以及我能想到的所有其他方法) )在defaults / main.yml中失败:

# if the env var doesn't exist, it'll set it to an empty string, doesn't look
# like there is a way to specify the 'default' string that should be used
# xdg_cache_home: "{{ lookup('env','XDG_CACHE_HOME') }}"

# this is just bad syntax, can't have nested '{{ }}'
# xdg_config_home: "{{ lookup('env','XDG_CACHE_HOME') | default("{{ home }}/.cache", true) }}"

# this simply fails to define the variable, i'm not sure why
# xdg_cache_home: "{{ default( lookup('env','XDG_CACHE_HOME'), join(lookup('env', 'HOME', '.cache'))) }}"

我尝试的下一个方法是使用第一个方法设置默认值(空字符串,如果为空),然后在roles / myrole / tasks / main.yml中检查并设置默认值:

- name: set default xdg_cache_home
  set_fact: xdg_cache_home="{{ join(lookup('env', 'HOME', '/.cache')) }}"
  when: "{{ xdg_cache_home }}" == ""

但我也无法做到这一点。有什么建议或意见吗?

1 个答案:

答案 0 :(得分:1)

在jinja文档中找到答案 - 使用jinja字符串连接运算符(〜):

xdg_cache_home: "{{ lookup('env', 'XDG_CACHE_HOME') | default(ansible_user_dir ~ '/.cache', true) }}"
xdg_config_home: "{{ lookup('env', 'XDG_CONFIG_HOME') | default(ansible_user_dir ~ '/.config', true) }}"
xdg_data_home: "{{ lookup('env', 'XDG_DATA_HOME') | default(ansible_user_dir ~ '/.local/share', true) }}"