在机架空间上设置SSH主机IP地址

jch*_*ain 5 rackspace-cloud openstack-nova ansible pyrax novaclient

问题

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

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

问题

我在rax模块上使用Ansible在Rackspace Cloud中启动服务器,然后将其添加到隔离/专用网络中。然后,将其添加到清单并开始配置。我要做的第一件事是锁定SSH,部分是通过告诉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'
Run Code Online (Sandbox Code Playgroud)

在第一次创建和配置新实例时,此方法就很好。不幸的是,下次我尝试连接到这些服务器时,连接被拒绝,因为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,而后者又取决于novaclient,而novaclient仅允许更新服务器的名称,而不是accessIPv4

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

bka*_*kan 3

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

hostvars['ansible_ssh_host'] = server.accessIPv4
Run Code Online (Sandbox Code Playgroud)

到:

hostvars['ansible_ssh_host'] = server.addresses['private'][0]['addr']
Run Code Online (Sandbox Code Playgroud)

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