使用 nslookup 从 ansible playbook 检测网络

使用 nslookup 从 ansible playbook 检测网络

我正在为我的团队开发 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": []
        }
    }
}

注册后,您可以在剧本执行的后续部分使用点符号访问任何这些属性。

干杯!

相关内容