在运行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
如果我们能够解析这个,会不会很开心呢。