在运行ansible -a(直接执行命令)时,有许多陷阱。(直接执行命令)有很多坑要注意

同时执行多个命令的方法

起因:无法使用Ansible主机 -a “echo hello && echo world” 进行操作。

将模块从默认命令更改为shell,就可以完成该任务。

ansible host -m shell -a 'echo hello && echo world'

如果您认为将参数直接传递给ssh命令就可以工作,那么这个方法也是可行的。(也是因为ssh命令无法一次执行多个命令的人吧)

ansible host -a "bash -c 'echo hello && echo world'"

自作主观猜测:只需将指令直接传递给ssh。将shell命令先写入tmp文件,然后通过ssh进行传输和执行。(无论是哪种情况,都会进行Ansible变量展开等处理)

参考:Ansible:如何使用ansible执行多个命令 -a- Stack Overflow

使用双花括号(Double curly braces)的方式

起因:无法执行docker ps –format {{.Images}}命令。

我立刻明白了原因。这是因为ansible的变量功能。

如果您将Ansible的变量写在/etc/ansible/hosts文件中,可以这样做。

mygroup:
  hosts:
    host1.com:
    host2.com:
  vars:
    myvar: "blah blah" 

这样就可以从命令中使用变量了。

ansible mygroup -a 'echo {{myvar}}'         # blah blah

毫无疑问,这个功能和其他功能发生了冲突。

解决方案 (jiě jué àn)

用”{%raw%}”和”{%unraw%}”来包围看起来还不错。这真是麻烦!!

ansible host -m shell -a 'docker ps --format {%raw%}{{.Images}}{%unraw%}'

令人惊讶的是,ansible的变量展开在单引号内也能生效。ansible的-a参数中的变量展开非常强大!简直无法轻易停止!所以似乎需要使用{{%raw%}}。

参考:Ansible中如何转义双大括号 – Stack Overflow

额外赠品

以一种类似yaml的方式获取所有服务器的docker image/容器的shell技巧。

ansible all -m shell -a ' docker ps --format {%raw%}"\t{{.Names}}:\n\t\t\t\t\t\t{{.Image}}"{%endraw%}' | grep -v "non-zero" | grep -v FAILED | sed -E "s/(.*)\| SUCCESS.*/\1:/"

这样的感觉出来。

host1.com :
    cont1:
                                                - php:7-apache
    cont2:
                                                - haproxy:latest

如果我们能够解析这个,会不会很开心呢。

广告
将在 10 秒后关闭
bannerAds