Ansible playbook - 根据条件定义 var

Ansible playbook - 根据条件定义 var

我想根据条件创建一个 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 }}"

相关内容