如果我有一个可解析的ad-hoc命令想要一个字典或列表值参数,比如queries
到postgresql_query
的参数,我如何在ansible
ad-hoc指令中调用它?
我必须写一本单命令的剧本吗?我正在寻找一种方法来最大限度地减少所涉及的令人困惑的引用(shell、yaml/json等(的层数。
易解释的文档提到接受变量的结构化形式。因此,我尝试了参数的yaml和json语法:
ansible -m postgresql_query -sU postgres -a '{"queries":["SELECT 1", "SELECT 2"]}'
而得CCD_ 4。
如果我@include
是一个包含yaml或json内容(如(的文件,也是如此
cat > 'query.yml' <<'__END__'
queries:
- "SELECT 1"
- "SELECT 2"
__END__
ansible -m postgresql_query -sU postgres -a @queries.yml
您可以在JSON变量中定义一个字典,然后将其作为参数传递给下一个:
ansible -m module_name -e '{"dict": {"key": "value"}}' -a "param={{ dict }}"
(参数位置任意(
在Ansible(2.14.2(中,您可以直接指定JSON
根据这里给出的答案尝试了一下,结果奏效了。
在这里,我返回由Ansible的主机组"的设置模块收集的事实;psu";根据过滤器模式列表过滤输出以仅查看两个事实。JSON是一个带有单个关键字的字典,该关键字的值是过滤器模式的列表。
ansible psu -m setup -a '{ "filter": ["ansible_distribution_version", "kernel"] }'
输出:
psu1 | SUCCESS => {
"ansible_facts": {
"ansible_distribution_version": "8.7",
"ansible_kernel": "5.4.17-2136.318.7.1.el8uek.x86_64"
},
"changed": false
}
psu2 | SUCCESS => {
"ansible_facts": {
"ansible_distribution_version": "8.7",
"ansible_kernel": "5.4.17-2136.318.7.1.el8uek.x86_64"
},
"changed": false
}
我有一个大部分的解决方案-一种不用额外引用就可以表达shell脚本或查询负载之类内容的方法。但它很丑陋:
ansible hostname -m postgresql_query -sU postgres -a 'query="{{query}}"' -e @/dev/stdin <<'__END__'
query: |
SELECT 'no special quotes needed' AS "multiline
identifier works fine" FROM
generate_series(1,2)
__END__
这不仅令人羞愧地糟糕,而且似乎对列表(数组(不起作用:
ansible hostname -m postgresql_query -sU postgres -vvv -a 'query="{{query}}"' -e @/dev/stdin <<'__END__'
queries:
- |
SELECT 1
- |
SELECT 2
__END__
故障
hostname | FAILED! => {
"changed": false,
"err": "syntax error at or near "<"nLINE 1: <bound method Templar._query_lookup of <ansible.template.Tem...n ^n",
"invocation": {
"module_args": {
"autocommit": false,
"conninfo": "",
"queries": null,
"query": "<bound method Templar._query_lookup of <ansible.template.Templar object at 0x7f72531c61d0>>"
}
},
"msg": "Database query failed"
}
因此,看起来某种懒惰的评估正在破坏事物。