在Rackspace上为Ansible设置SSH主机IP地址

时间:2014-07-22 19:08:27

标签: ansible rackspace-cloud openstack-nova pyrax novaclient

问题

使用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地址。这是因为:

  1. Ansible尝试连接ansible_ssh_host ...
  2. rax.py广告资源脚本已将ansible_ssh_host设置为Rackspace返回的accessIPv4 ...
  3. Rackspace已将accessIPv4设置为服务器的公共IP地址。
  4. 现在,我不知道该怎么做。 Rackspace允许API call更新服务器并设置其accessIPv4,所以我认为在创建服务器之后我可以运行另一个local_action。遗憾的是,rax模块似乎不允许更新服务器,即使这样做也取决于pyraxnovaclient依赖于novaclient only allows updating the name of the server和{{3}},不是accessIPv4

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

4 个答案:

答案 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']