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

Cra*_*ger 5 ansible

如果我有一个需要字典或列表值参数的 ansible ad-hoc 命令,如queries参数 to postgresql_query,我如何在ansiblead-hoc 命令中调用它?

我必须编写一个单一命令的剧本吗?我正在寻找一种方法来最小化所涉及的令人困惑的引用(shell、yaml/json 等)的层数。

ansible 文档提到接受变量的结构化形式。所以我尝试了参数的 yaml 和 json 语法:

ansible -m postgresql_query -sU postgres -a '{"queries":["SELECT 1", "SELECT 2"]}'
Run Code Online (Sandbox Code Playgroud)

...但得到了ERROR! this task 'postgresql_query' has extra params, which is only allowed in the following modules: ...

如果我@include的文件包含 yaml 或 json 内容,则同样如此

cat > 'query.yml' <<'__END__'
queries:
  - "SELECT 1"
  - "SELECT 2"
__END__
ansible -m postgresql_query -sU postgres -a @queries.yml
Run Code Online (Sandbox Code Playgroud)

ped*_*ero 8

您可以在 JSON 变量中定义一个字典,然后将其作为参数传递:

ansible -m module_name -e '{"dict": {"key": "value"}}' -a "param={{ dict }}" 
Run Code Online (Sandbox Code Playgroud)

(参数位置任意)


use*_*018 3

在 Ansible (2.14.2) 中,您似乎可以直接指定 JSON

根据此处给出的答案尝试了这一点,并且成功了。

在这里,我返回由Ansible 的设置模块为主机组“psu”过滤输出收集的事实,以便根据过滤器模式列表仅看到两个事实。JSON 是一个具有单个键的字典,其值是过滤器模式列表。

ansible psu -m setup -a '{ "filter": ["ansible_distribution_version", "kernel"] }'
Run Code Online (Sandbox Code Playgroud)

输出:

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
}
Run Code Online (Sandbox Code Playgroud)