Ansible:在检查未定义变量之前检查'When'

Ansible:在检查未定义变量之前检查'When',ansible,Ansible,表2.9.6 我在中有一个包含\u项的哈希列表。我将when作为参数项之一。 因此,有些项目将被执行,有些则不会。我不想为跳过的项目中的变量声明或设置默认值。但我有“VAR_2未定义”错误,即使是对于将不执行的项 例如: --- - hosts: localhost gather_facts: no tasks: - name: localtest template: src: test.txt.j2 dest: "{{ it

表2.9.6

我在
中有一个包含\u项的哈希列表
。我将
when
作为参数项之一。 因此,有些项目将被执行,有些则不会。我不想为跳过的项目中的变量声明或设置默认值。但我有“VAR_2未定义”错误,即使是对于将不执行的项

例如:

---
- hosts: localhost
  gather_facts: no
  tasks:
    - name: localtest
      template:
        src: test.txt.j2
        dest: "{{ item.BASE_NAME }}-test.txt"
      when: "item.when"
      with_items:
        - { BASE_NAME: "{{VAR_1}}", when: "{{ variable_true }}" }
        - { BASE_NAME: "{{VAR_2}}", when: "{{ variable_false }}" }
        - { BASE_NAME: "{{VAR_3}}", when: "{{ variable_true }}" }

我不想使用默认值,因为我正在为不同的主机使用不同的变量集。当必要的变量(带有when
true
条件)未声明时,我需要错误。

您在这里描述的是特殊变量的原因,您可以在Ansible中使用
默认过滤器

默认情况下,Ansible需要模板化表达式中所有变量的值。但是,可以将特定变量设置为可选变量。例如,您可能希望对某些项使用系统默认值,并控制其他项的值。要使变量成为可选变量,请将默认值设置为特殊变量
ommit

资料来源:

所以你可以用这样的剧本:

-hosts:localhost
收集事实:不
任务:
-模板:
src:test.txt.j2
dest:{{item.BASE_NAME}}-test.txt”
时间:“项目。时间”
有以下项目:
-基本名称:{{VAR_1}默认值(省略)}”
当:“{variable_true}}”
-基本名称:{{VAR_2}默认值(省略)}”
当:“{variable_false}}”
-基本名称:{{VAR_3}默认值(省略)}”
当:“{variable_true}}”
变量:
变量_true:true
变量_false:false

你可以做的另一件事,但我个人觉得不太吸引人,就是只定义循环中变量的名称,然后使用查找引用这个变量的内容

因此,以本剧本结尾:

-hosts:localhost
收集事实:不
任务:
-模板:
src:test.txt.j2
dest:“{lookup('vars',item.BASE_NAME)}}-test.txt”
时间:“项目。时间”
有以下项目:
-基本名称:“变量1”
当:“{variable_true}}”
-基本名称:“变量2”
当:“{variable_false}}”
-基本名称:“变量3”
当:“{variable_true}}”
变量:
变量_true:true
变量_false:false

也可以缩短为:

dest:“{{vars[item.BASE_NAME]}}-test.txt”

谢谢。非常有用的解释和好看的格式。但不完全是我的情况。看来我在解释中遗漏了要点。我需要为使用的项目保留关于未声明变量的警告。例如我有两位主人。对于第一个,我需要部署带有多个PRAM的1st和3td数据库。对于第二个,我需要部署带有多个婴儿车的第一个和第二个数据库。所以我使用一个变量作为deploy/notdeploy标志。没关系。和几个变量作为参数。如果我忽略它们,我可能会因为部署而错过它们。