避免在剧本中使用未使用和未定义的变量

时间:2020-04-21 10:39:21

标签: ansible ansible-2.x

我在变量文件中有以下数据

data: [
    {
        service: "ServiceName",
        var2: "file/path/value",
        var3: "{{ check_var }}",
    }, {
        service: "ServiceName",
        var2: "file/path/value",
        var3: "{{ check_var }}",
    }
]

我有两个需要相同数据的剧本。但是,一本剧本不需要 var3

- debug: msg="{{ item['service'] }} uses - {{ item['var2'] }}"
with_items: "{{ data }}" 

这会导致错误-“'check_var'未定义”
尝试:
我不想用不良标准填充剧本并使用
何时:未定义check_var
或者在剧本的vars atrribute中使用错误的伪数据。在维持标准的同时,有什么办法吗?另外,实际数据非常庞大,因此我不想为每个剧本重复两次。

1 个答案:

答案 0 :(得分:1)

在Ansible中,必须将数据分配给主机,而不要分配给剧本。

您必须创建两个主机组。那些只需要两个变量的主机进入第一组。那些需要3个变量的主机将分为两组。您可以将第一组的主机包括在第二组中。

然后创建两个组var文件。在第一个变量中放置2个变量,在第二个变量中放置第3个变量。

通过这种方式,每个主机都可以获取正确数量的信息。 Playbook 1使用3个变量,Playbook 2仅使用2个变量。

更新:最小示例

$ diff -N -r none .
diff -N -r none/check_var.yaml ./check_var.yaml
0a1,4
> ---
> - hosts: localhost
>   tasks:
>     - debug: var=check_var
diff -N -r none/group_vars/myhosts.yaml ./group_vars/myhosts.yaml
0a1
> check_var: "Hello World!"
diff -N -r none/inventory ./inventory
0a1,2
> [myhosts]
> localhost
$ ansible-playbook -i inventory check_var.yaml

PLAY [localhost] ***************************************************************************

TASK [Gathering Facts] *********************************************************************
ok: [localhost]

TASK [debug] *******************************************************************************
ok: [localhost] => {
    "check_var": "Hello World!"
}

PLAY RECAP *********************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0