首页 > 解决方案 > 仅具有私有 IP 的 Azure VM 的 Ansible 动态清单

问题描述

在 Azure 上,我有一个包含 2 个服务器的 1 个 vnet 的资源组;主人和工人。只有 master 有公共 IP。

ansible_host使用“普通”Ansible,我可以通过在文件中定义工作人员的私有 IPhosts并创建一个group_vars带有 ssh ProxyCommand 参数的文件来管理两个服务器,以申请工作人员组,如此处针对跳转主机所述(请注意,也有涉及直接的较旧方法ssh 配置,但我认为 group_vars 方法更可取,因为它对其他用户更便携)。

然而,这种方法需要对 IP 进行硬编码,这在 Azure 上不是很好。有一个azure_rm 清单脚本插件(取决于 Ansible 版本)将提供动态清单,避免对主机文件的需要,但在这种情况下,我该如何进行与 ProxyCommand 设置等效的操作?

这种情况一定很常见,所以我觉得我一定错过了一些东西。

标签: azuresshproxyansibleansible-inventory

解决方案


堡垒主机

要将代理/堡垒主机/跳转主机与 Ansible 一起使用,您需要ansible_ssh_common_argsansible.cfg.

  • 应该有一个 environment variable ANSIBLE_SSH_COMMON_ARGS,但由于这个 Ansible 问题而丢失了- 自 Ansible 2.9.3 起尚未修复。

您可以在组级别将其设置在静态清单中以all进行试验(在没有动态清单的情况下更容易首先尝试) - 有关更多详细信息,请参阅此博客

[all:vars]
ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p my-bastion.example.com"'

一旦你有了这个工作,你可以使用动态清单 - 创建一个文件group_vars/all.yml(首先使用静态清单测试),将上述 INI 格式清单转换为 YAML(将 更改=:)。

ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p my-bastion.example.com"'

使用具有动态清单的私有 IP

为确保ansible_host在清单输出中使用私有 IP,您必须使用export AZURE_USE_PRIVATE_IP=true(使用经典azure_rm.py清单脚本,尚未尝试使用插件清单)。

  • 没有这个,ansible_host可以为 null 或设置为公共 IP/域名
  • 如果您使用解析为私有 IP 的域名,则可能不需要此功能

测试动态库存

在开始将动态清单用于剧本之前,请务必测试它是否生成了正确的 JSON 数据。

要检查特定清单值是否映射到正确的主机,请尝试:

$ AZURE_USE_PRIVATE_IP=true ansible -i azure_rm.py mygroup -m debug -a var=ansible_host
test01 | SUCCESS => {
    "ansible_host": "10.0.0.1"
}

您还可以-vvvvv在调试时检查 Ansible SSH 是否像这样工作:

$ AZURE_USE_PRIVATE_IP=trueansible -i azure_rm.py mygroup -m debug -a var=ansible_host
test01 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

经典与基于插件的库存

我在这里使用了旧的“经典”azure_rm.py动态清单——同样的方法适用于当前基于插件的动态清单(从 Ansible 2.4 开始,包括清单缓存)。

要在任一模式下查看动态库存 JSON 输出:

  • 经典的:AZURE_USE_PRIVATE_IP=true python azure_rm.py | jq .
  • 基于插件:ansible-inventory -i azure.yml --graph

jq的使用是可选的,它只是格式化输出以提高可读性。


推荐阅读