我正在为我的团队开发一个Vagrant + Ansibleconfiguration,这个configuration设置了一个开发者虚拟机,所需的一些工件只能从我的公司networking上获得,无论是通过物理上的还是通过VPN连接的。
如果我们在不在公司networking上的计算机上进行configuration,我想自动连接到我们的vpn(使用openconnect客户端),复制文件,然后从Ansible断开连接。
在过去,我使用类似于bash脚本的方式检测networking: if nslookup hostname | grep 'can't find'; then ... if nslookup hostname | grep 'can't find'; then ...
我的问题是有一个干净的方式来做一个Ansible“当”声明或类似的东西这样的检查。
FWIW:对于Ansible来说我是相当新的,所以如果这是在他们的文档中,我只是想念它,请随时指向我,并相应地鞭打我。
不要太花哨,你可能只想使用命令模块并注册输出,如下所示:
--- - name: Register nslookup hostname result command: nslookup hostname register: ns - name: Some other task with conditional copy: <params go here> when: "'server can\\'t find' in ns.stdout"
如果你想了解更多关于Ansible中的寄存器variables,请查看这里的文档
另外,为了将来的参考,如果你想在注册一个var的时候看到JSON,你可以做如下的事情:
--- - name: Register nslookup hostname result command: nslookup hostname register: ns - debug: var=ns
然后这应该输出如下所示:
ok: [HOST] => { "var": { "ns": { "changed": true, "cmd": [ "nslookup", "hostname" ], "delta": "0:00:00.054897", "end": "2014-12-18 18:51:15.598652", "invocation": { "module_args": "nslookup hostname", "module_name": "command" }, "rc": 0, "start": "2014-12-18 18:51:15.543755", "stderr": "", "stdout": "Server:\t\t192.168.1.1\nAddress:\t192.168.1.1#53\n\n** server can't find hostname: HOSTNAME", "stdout_lines": [ "Server:\t\t192.168.1.1", "Address:\t192.168.1.1#53", "", "** server can't find hostname: HOSTNAME" ], "warnings": [] } } }
在注册后,您可以在剧本执行的后面部分使用点符号访问任何这些属性。
干杯!