5

问题

当使用该rax模块启动服务器并获取库存时,我如何告诉 Ansible 连接到隔离网络上的 IP 地址而不是服务器的公共 IP?

注意:Ansible 正在同一隔离网络上的服务器上运行。

问题

我使用带有模块的 Ansible 在 Rackspace Cloud 中启动服务器,rax并将其添加到隔离/专用网络。然后我将它添加到库存并开始配置它。我要做的第一件事是锁定 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 地址。发生这种情况是因为:

  1. Ansible 尝试连接到ansible_ssh_host...
  2. 但是rax.py库存脚本已设置ansible_ssh_hostaccessIPv4Rackspace 返回的...
  3. 并且 Rackspace 已设置accessIPv4为服务器的公共 IP 地址。

现在,我不知道该怎么办。Rackspace 确实允许API 调用来更新服务器并设置它,所以我想我可以在创建服务器后accessIPv4运行另一个来执行此操作。local_action不幸的是,rax模块似乎不允许更新服务器,即使它这样做了,它也依赖于pyrax ,而 pyrax又依赖于novaclient,而novaclient 只允许更新服务器的名称,而不是accessIPv4.

以前肯定有人这样做过。rax通过模块获取动态库存时,告诉 Ansible 在隔离网络上连接的正确方法是什么?

4

4 回答 4

3

我对此的第一个想法是把它当作你有一个需要设置的隧道来对待。

当您使用该rax模块时,它会创建一个名为 "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 的替代方法。

于 2014-07-24T01:36:35.637 回答
3

您可以手动编辑rax.py文件并将第 125行和第 163 行更改为:

hostvars['ansible_ssh_host'] = server.accessIPv4

至:

hostvars['ansible_ssh_host'] = server.addresses['private'][0]['addr']

这应该使 ansible_ssh_host 的值成为私有 IP。

于 2014-07-23T18:19:24.367 回答
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']
于 2016-11-18T14:13:08.097 回答
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 设置为您在变量中指定的网络。

于 2016-02-08T13:46:39.920 回答