我想根据条件创建一个 var,因此我创建了以下内容:
hosts: test
vars: vtarget_backup_folder_in_progress: "{{ "{{ folder }}/{{ target }}/test{{ hostvars['localhost']['tstamp'].stdout }}{{ type }}" if node_type == "master" else "{{ folder }}/{{ target }}/prod{{ hostvars['localhost']['tstamp'].stdout }}_{{ type }}" }}"
但它失败了,出现以下错误:
我们可能错了,但这个看起来可能是缺少引号的问题。当模板表达式括号以值开头时,请始终用引号括起来。例如:
with_items: - {{ foo }} Should be written as: with_items: - "{{ foo }}"
你能帮我吗?
编辑
我已尝试以下方法:
tasks:
- name: set IN_PROGRESS backup folder
set_fact:
v_target_backup_folder_in_progress: >-
{% if node_type == "master" %}
"{{ folder }}/{{ target }}/test_{{ hostvars['localhost']['tstamp'].stdout }}_{{ type }}"
{% else %}
"{{ folder }}/{{ target }}/prod_{{ hostvars['localhost']['tstamp'].stdout }}_{{ type }}"
{% endif %}
- name: ensure target in progress folder exists
file:
path: "{{ v_target_backup_folder_in_progress }}"
state: directory
owner: "{{ app_user }}"
group: "{{ app_user_group }}"
mode: u=rwx,g=rwx
当我调试剧本时,它获得了正确的变量值,但是当我在运行剧本的 3 个节点中的每个节点上检查 v_target_backup_folder_in_progress 时,我发现一些奇怪的事情:
在一个节点上,v_target_backup_folder_in_progress 没有被创建,尽管它似乎是在调试模式下创建的,但是当我转到同一路径时,我找不到该目录!
在其他 2 个节点上,v_target_backup_folder_in_progress 已创建,但作为文件!而不是目录,尽管它似乎是在调试模式下作为目录创建的。
那么为什么会发生这种情况?
答案1
这应该可以做到:
vtarget_backup_folder_in_progress: "{% if node_type == 'master' %}{{ folder }}/{{ target }}/test{{ hostvars['localhost']['tstamp'].stdout }}{{ type }}{% else %}{{ folder }}/{{ target }}/prod{{ hostvars['localhost']['tstamp'].stdout }}_{{ type }}{% endif %}"
所有内容都在一个字符串中,没有嵌套括号,if/else/endif{% %}
您甚至可以通过将公共的开始和结束移出条件来稍微减少它:
vtarget_backup_folder_in_progress: "{{ folder }}/{{ target }}/{% if node_type == 'master' %}test{{ hostvars['localhost']['tstamp'].stdout }}{% else %}prod{{ hostvars['localhost']['tstamp'].stdout }}_{{ type }}{% endif %}{{ type }}"