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