使用rax
模块启动服务器并获取库存时,如何告知Ansible连接到隔离网络上的IP地址而不是服务器的公共IP?
注意:Ansible正在同一个隔离网络上的服务器上运行。
我使用带有rax
模块的Ansible在Rackspace Cloud中启动服务器,然后将其添加到隔离/专用网络。然后我将其添加到库存并开始配置它。我做的第一件事是锁定SSH,部分是告诉它只绑定到隔离网络上给主机的IP地址。问题是,这意味着ansible无法通过公共IP地址连接,因此我还将ansible_ssh_host
设置为私有IP。 (当我将主机添加到库存时会发生这种情况。)
- name: Add servers to group
local_action:
module: add_host
hostname: "{{ item.name }}"
ansible_ssh_host: "{{ item.rax.addresses.my_network_name[0].addr }}"
groups: launched
with_items: rax_response.success
when: rax_response.action = 'create'
这在第一次创建和配置新实例时效果很好。不幸的是,下次我尝试连接到这些服务器时,连接被拒绝,因为Ansible正在尝试SSH没有监听的IP地址。这是因为:
ansible_ssh_host
... rax.py
广告资源脚本已将ansible_ssh_host
设置为Rackspace返回的accessIPv4
... accessIPv4
设置为服务器的公共IP地址。现在,我不知道该怎么做。 Rackspace允许API call更新服务器并设置其accessIPv4
,所以我认为在创建服务器之后我可以运行另一个local_action
。遗憾的是,rax模块似乎不允许更新服务器,即使这样做也取决于pyrax,novaclient依赖于novaclient only allows updating the name of the server和{{3}},不是accessIPv4
。
肯定有人以前做过这件事。通过rax
模块获取动态库存时,告诉Ansible在隔离网络上连接的正确方法是什么?
答案 0 :(得分:2)
您可以手动修改 rax.py 文件,并从以下位置更改第125行和第163行:< / p>
hostvars['ansible_ssh_host'] = server.accessIPv4
为:
hostvars['ansible_ssh_host'] = server.addresses['private'][0]['addr']
这应该使ansible_ssh_host的值成为私有IP。
答案 1 :(得分:2)
我对此的第一个想法就是像对待你需要设置的隧道一样对待它。
使用rax
模块时,creates a group called "raxhosts"。默认情况下,使用该公共ipv4地址访问它们。
您可以使用该群组创建另一个群组(通过add_host
),但请指定您希望实际访问该群组的IP。
- name: Redirect to raxprivhosts
local_action:
module: add_host
hostname: "{{ item.name }}"
ansible_ssh_host: "{{ item.rax_addresses['private'][0]['addr'] }}"
ansible_ssh_pass: "{{ item.rax_adminpass }}"
groupname: raxprivhosts
with_items: raxhosts
然后对这些群体应用剧本作为您的后续行动。
让我知道这对您有何影响,我只是将其作为替代手动更改您的rax.py。
答案 2 :(得分:0)
您可以在/etc/tower/settings.py中设置环境变量以使用专用网络。它可能是
AWX_TASK_ENV['RAX_ACCESS_NETWORK'] = 'YOURNETWORK'
或
AWX_TASK_ENV['RAX_ACCESS_NETWORK'] = 'private'
然后您将使用ansible-tower-service restart
重新启动服务
然后,您需要刷新可通过Tower界面执行的清单。您现在可以看到主机IP设置为您在变量中指定的网络。
答案 3 :(得分:0)
在最新版本的ansible中,您需要更改:
hostvars['ansible_ssh_host'] = server.accessIPv4
为:
hostvars['ansible_ssh_host'] = server.addresses['private'][0]['addr']
和强>
hostvars[server.name]['ansible_ssh_host'] = server.accessIPv4
为:
hostvars[server.name]['ansible_ssh_host'] = server.addresses['private'][0]['addr']