如何将字典传递给ansible ad-hoc命令?

时间:2018-12-03 16:14:49

标签: ansible

如果我有一个特殊的命令,希望使用字典或列表值参数,例如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

2 个答案:

答案 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 }}" 

(参数位置是任意的)