我想在每个节点上执行命令:
docker ps --format '{{.Names}}' -a | egrep -v '^k8s.*$'
我尝试了数百万种在 ansible 中执行命令的变体,其中包括:
- hosts: kubernetes
tasks:
- name: check docker
command:
cmd: docker ps --format '{{.Names}}' -a | egrep -v '^k8s.*$'
register: doc
- debug: var=doc.stdout_lines
我尝试转义字符。但没有任何效果。那么,如何让 ansible 在每个主机上执行我的 docker 命令?
PS 我想列出不受 k8s 控制的容器
您的任务存在几个问题:
您正在使用带有 shell 语法的
command
模块(流水线多个命令)本例中的错误:
可以看到,管道被忽略,
-v
参数被传递给了Docker 命令。字符串中的双花括号。在 Ansible 中,双花括号被解释为 Jinja2 语法并尝试模板化。
本例中的错误:
问题 1 的解决方案
您可以使用
shell
模块,在这里您可以执行 shell 中可能的所有命令。command
或者,您可以简单地使用模块执行 Docker 命令并在 Ansible 中过滤生成的数据。请参阅下面的示例。
问题 2 的解决方案
将花括号定义为变量,并插入到适当的位置。
您可以使用标记
!unsafe
将整个字符串定义为原始字符串。 然后它不会被 Ansible 使用 Jinja2 模板化,但您无法模板化此字符串中的其他变量。最终结果任务
使用
command
模块,在 Ansible 中过滤数据并!unsafe
标记使用
reject
过滤器,所有匹配的列表元素^k8s
都会被丢弃。使用
shell
模块和!unsafe
标记