在机架空间上为Ansible设置SSH主机IP地址 问题

在机架空间上为Ansible设置SSH主机IP地址 问题,ansible,rackspace-cloud,openstack-nova,pyrax,novaclient,Ansible,Rackspace Cloud,Openstack Nova,Pyrax,Novaclient,使用rax模块启动服务器并获取资源清册时,我如何告诉Ansible连接到隔离网络上的IP地址,而不是服务器的公共IP 注意:Ansible正在从同一隔离网络上的服务器运行 问题 我使用Ansible和rax模块在Rackspace云中启动服务器,并将其添加到一个隔离/专用网络中。然后我将其添加到清单中并开始配置它。我要做的第一件事是锁定SSH,部分是告诉它只绑定到隔离网络上主机的IP地址。问题是,这意味着ansible无法通过公共IP地址连接,因此我还将ansible\u ssh\u主机设置为私

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

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

问题 我使用Ansible和
rax
模块在Rackspace云中启动服务器,并将其添加到一个隔离/专用网络中。然后我将其添加到清单中并开始配置它。我要做的第一件事是锁定SSH,部分是告诉它只绑定到隔离网络上主机的IP地址。问题是,这意味着ansible无法通过公共IP地址连接,因此我还将
ansible\u ssh\u主机
设置为私有IP。(将主机添加到资源清册时会发生这种情况。)

这在创建和配置新实例的第一次运行中就可以正常工作。不幸的是,下次我尝试连接到这些服务器时,连接被拒绝,因为Ansible正在尝试使用SSH未侦听的IP地址。这是因为:

  • Ansible尝试连接到
    Ansible\u ssh\u主机
  • 但是
    rax.py
    清单脚本已将
    ansible\u ssh\u host
    设置为Rackspace返回的
    accessIPv4
  • Rackspace已将
    accessIPv4
    设置为服务器的公共IP地址
  • 现在,我不知道该怎么办。Rackspace确实允许更新服务器并设置其
    访问IPv4
    ,因此我认为在创建服务器后可以运行另一个
    本地\u操作。不幸的是,该模块似乎不允许更新服务器,即使它允许更新服务器,也取决于它所依赖的服务器,而不是
    accessIPv4


    肯定有人曾经这样做过。通过
    rax
    模块获取动态资源清册时,告诉Ansible连接到隔离网络的正确方法是什么?

    您可以手动编辑rax.py文件,并从以下位置更改第125行和第163行

    hostvars['ansible_ssh_host'] = server.accessIPv4
    
    hostvars['ansible_ssh_host'] = server.accessIPv4
    
    致:


    这将使ansible_ssh_host的价值成为私有IP。

    我的第一个想法是将其视为需要设置的隧道

    当您使用
    rax
    模块时,它将被激活。默认情况下,这些都是使用该公共ipv4地址访问的

    您可以使用该组(via)创建另一个组,但请指定要实际访问该组的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的替代方案。您可以在/etc/tower/settings.py中设置一个环境变量以使用专用网络。要么是

    AWX_TASK_ENV['RAX_ACCESS_NETWORK'] = 'YOURNETWORK'
    

    然后,您将使用
    ansible tower service restart

    然后,您需要刷新清单,您可以通过塔界面进行刷新。现在,您将看到主机IP已设置为变量中指定的网络。

    在ansible的最新版本中,您需要更改:

    致:

    hostvars[server.name]['ansible_ssh_host'] = server.accessIPv4
    
    致:


    这是我已经做过的事情,但它似乎有点像黑客。(虽然我似乎有一个不同版本的rax.py——不同的行和稍微不同的语法。)我会等一等,看看是否有其他人有想法,否则我会接受你的,因为它确实解决了眼前的问题。谢谢我不一定会称之为“黑客”。我想说的是,Rackspace动态库存文件不如其他一些动态库存文件功能齐全。例如,AWS动态清单文件有一个设置文件,允许您在使用私有IP和公共IP之间切换。嗯,这不是一个坏主意。我不相信“raxhosts”组是自动创建的(这只是他们给出的一个如何使用“add_host”的示例),但也许我可以对“all”做同样的事情?因此,我基本上只是为新创建的主机做一些事情,而不是为所有主机做这些事情。。。。但是我想我必须自己读取服务器的元数据来完成所有的清单和分组,而不是让rax.py来完成。(我认为rax.py检测到的组中的主机仍然具有错误的IP。)我会考虑一下,然后尝试一下。是的,对不起,我没有完全优雅的东西。我刚才读了这些文件(现在又读了一遍),这简直是我一时糊涂。不过,谢谢你!现在,我想我将使用bkan的解决方案,以避免在我的剧本中做更多的库存工作,但这对仔细思考是非常有帮助的。
    AWX_TASK_ENV['RAX_ACCESS_NETWORK'] = 'private'
    
    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']