如果我有一个特殊的命令,希望使用字典或列表值参数,例如queries
的{{1}}参数,如何在postgresql_query
中临时调用它命令?
我必须写一本命令书吗?我正在寻找一种方法来减少所涉及的令人困惑的报价(shell,yaml / json等)的层数。
ansible文档提到接受变量的结构化形式。所以我尝试使用yaml和json语法作为参数:
ansible
...但是得到了ansible -m postgresql_query -sU postgres -a '{"queries":["SELECT 1", "SELECT 2"]}'
。
如果我ERROR! this task 'postgresql_query' has extra params, which is only allowed in the following modules: ...
包含yaml或json内容的文件,则同样如此
@include
答案 0 :(得分:0)
我拥有大部分解决方案-一种表达诸如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"
}
所以看起来有些惰性评估正在破坏事物。
答案 1 :(得分:0)
您可以在JSON变量中定义字典,然后将其作为参数传递:
ansible -m module_name -e '{"dict": {"key": "value"}}' -a "param={{ dict }}"
(参数位置是任意的)