我正在为我的团队开发 Vagrant + Ansible 配置,以设置开发人员虚拟机,所需的一些工件只能通过物理方式或通过 VPN 连接从我的公司网络获取。
如果我们在不在该公司网络上的机器上进行配置,我想自动连接到我们的 vpn(使用 openconnect 客户端),复制文件,然后断开连接,所有这些都通过 Ansible 完成。
过去,我使用类似以下的方法在 Bash 脚本中检测网络:if nslookup hostname | grep 'can't find'; then ...
我的问题:是否有干净的方法可以在 Ansible“when”语句或类似语句中进行此类检查。
仅供参考:我对 Ansible 还很陌生,所以如果这是在他们的文档中而我却没有找到,请随时指出我并相应地鞭策我。
答案1
不需要太花哨,您可能只想使用命令模块并注册输出,如下所示:
---
- 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 中的寄存器变量的信息,请查看文档在这里
此外,供将来参考,如果您想在注册变量时查看可用的 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": []
}
}
}
注册后,您可以在剧本执行的后续部分使用点符号访问任何这些属性。
干杯!