Ansible acessing vars提示值,用于检查dict中的多个值

Ansible acessing vars提示值,用于检查dict中的多个值,ansible,Ansible,我有一个vars数据类型文件: foo: foo_根路径:faaa foo_dest_路径:baa 酒吧: 条根路径:xyz 条目的地路径:wxy 巴兹: baz_根路径:abc baz_dest_路径:def 我有一个剧本,如果是foo、bar或baz,它会提示用户查看我获取的数据类型 我正在创建一个角色来检查vars prompt==foo,然后访问foo中的值并使用它们执行复制命令 我对Ansible还不熟悉,还试图理解 及 我现在拥有的是,对于每个when条件,我重复我的命令,但

我有一个vars数据类型文件:

foo:
foo_根路径:faaa
foo_dest_路径:baa
酒吧:
条根路径:xyz
条目的地路径:wxy
巴兹:
baz_根路径:abc
baz_dest_路径:def
我有一个剧本,如果是
foo
bar
baz
,它会提示用户查看我获取的数据类型

我正在创建一个角色来检查
vars prompt==foo
,然后访问
foo
中的值并使用它们执行复制命令

我对Ansible还不熟悉,还试图理解

我现在拥有的是,对于每个when条件,我重复我的命令,但我想使用循环和条件:

角色:
当:“'foo'={{data_type}}”
-名称:将foo数据从源移动到目标
副本:
src:'{{foo_root_path}}/{{{name}}'
目的地:“{foo_destination_path}”
业主:富
组别:富
模式:“0644”
当:“'bar'={{type}}”
-名称:移动栏
副本:
src:“{bar_root_path}}/{{name}”
目的地:“{bar_destination_path}”
业主:酒吧
组别:酒吧
模式:“0644”
当:“'baz'={{type}}”
-姓名:move baz
副本:
src:“{baz_root_path}}/{{name}”
目的地:“{baz_destination_path}”
业主:巴兹
组别:baz
模式:“0000”
我想要实现的是使用条件找出vars提示符是什么,然后访问vars部分,在替换vars文件中的参数而不是三个命令后执行copy命令。

您可以使用查找来完成此任务。
请注意,该主机可以通过该查找访问的所有变量,可能有来自播放变量、任务变量、库存变量或通过
var_文件导入的变量,语法保持不变

这使您能够根据变量查找变量,例如:

lookup('vars',type)
我可以给你这本字典吗

foo\u根路径:faaa
foo_dest_路径:baa
类型
foo

由于您的类型也是字典键的一部分,因此您还需要使用波浪符号
~
,这在Jinja中是:

“{{type~'.\u root\u path'}”
我会给你线的

foo_root_path
类型
foo

因此,考虑到剧本:

-主机:所有
收集事实:不
变量:
傅:
foo_根路径:faaa
foo_dest_路径:baa
酒吧:
条根路径:xyz
条目的地路径:wxy
巴兹:
baz_根路径:abc
baz_dest_路径:def
变量提示:
-名称:类型
提示:“您希望使用哪种变量类型?”
二等兵:没有
学前任务:
-断言:
即:查找('vars',type,default='')长度
任务:
-调试:
味精:
根路径:“{{lookup('vars',type)[type~''.\u根路径']}”
dest_path:“{{lookup('vars',type)[type~''dest_path']}”
以下是它的一些运行:

  • 如果未定义提示变量,这会使playbook正常失败,这要归功于定义为
    pre_tasks

    的模块 如果变量未定义,则需要使用
    default='
    ,否则
    vars
    查找将出错。
    然后,当默认值中有一个空字符串时,测试它的值,将计算为
    false
    ,如果字符串恰好为空,则使
    length
    返回
    0
    ,否则,如果它是一个字典,
    length
    将是一个值
    >0
    ,因此,计算为
    true
    What variable type do you want to use?: evil
    
    PLAY [all] *******************************************************************************************************
    
    TASK [assert] ****************************************************************************************************
    fatal: [localhost]: FAILED! => {
        "assertion": "lookup('vars', type, default='') | length",
        "changed": false,
        "evaluated_to": false,
        "msg": "Assertion failed"
    }
    
    PLAY RECAP *******************************************************************************************************
    localhost                  : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0  
    

因此,根据您的案例对所有这些进行调整,可以得出以下结论:

-主机:所有
收集事实:不
变量:
名称:file.ext
傅:
foo_根路径:faaa
foo_dest_路径:baa
酒吧:
条根路径:xyz
条目的地路径:wxy
巴兹:
baz_根路径:abc
baz_dest_路径:def
变量提示:
-名称:类型
提示:“您希望使用哪种变量类型?”
二等兵:没有
学前任务:
-断言:
即:查找('vars',type,default='')长度
任务:
-名称:“将{type}}数据从源移动到目标”
副本:
src:{{lookup('vars',type)[type~''u root_path']}/{{name}”
dest:{{lookup('vars',type)[type~'\u dest\u path']}
所有者:“{type}}”
组:“{type}}”
模式:“0644”

请回答几个后续问题:在pretask中,默认的空表示空吗?长度有什么作用?你能解释一下吗。[类型~''u root_path']波浪线是否将类型与根路径连接?请再问一个问题:我的vars文件位于单独的yaml文件中,并且在playbook中未定义为vars部分。我的vars仅在playbook中作为vars_文件部分访问。那么lookup语句是:lookup('var_files',type,default='')| lengthAll这些问题现在在“msg”中得到了回答:“条件检查'lookup('vars_files',data_type,default='')| length'失败。错误是:lookup plugin(vars_files)not found”。在回答的第二句中,语法相同,变量可能来自播放变量、任务变量、库存变量,或者通过
var\u文件导入。因此您必须使用:
lookup('vars',data_type,default='')| length
What variable type do you want to use?: bar

PLAY [all] *******************************************************************************************************

TASK [assert] ****************************************************************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "All assertions passed"
}

TASK [debug] *****************************************************************************************************
ok: [localhost] => {
    "msg": {
        "dest_path": "wxy",
        "root_path": "xyz"
    }
}

PLAY RECAP *******************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
What variable type do you want to use?: evil

PLAY [all] *******************************************************************************************************

TASK [assert] ****************************************************************************************************
fatal: [localhost]: FAILED! => {
    "assertion": "lookup('vars', type, default='') | length",
    "changed": false,
    "evaluated_to": false,
    "msg": "Assertion failed"
}

PLAY RECAP *******************************************************************************************************
localhost                  : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0