我需要创建一个内存清单以在 overcloud 实例上运行 playbook,所有实例都没有直接暴露,只有一个服务器暴露并且可以用作“网关”又名“JumpHost”又名“ProxyHost”。
我已经完成了以下任务:
在我感兴趣的服务器上获取信息
...
- name: detect gateway for the {{ project }} tenant
openstack.cloud.server_info:
cloud: "{{ project }}"
server: "*gw*"
register: gw_info
...
然后我提取与此实例关联的 FloatingIP 的信息:
...
- name: Register info of gateway for {{ project }} tenant
set_fact:
gw_ip: "{{ item.interface_ip }}"
loop: "{{ gw_info.openstack_servers }}"
...
获得所需信息后,我会收集租户中所有实例的信息
...
- name: fetch instances on {{ project }} tenant
openstack.cloud.server_info:
cloud: "{{ project }}"
register: servers_info
...
最后使用实例元数据中的必要组创建内存清单以运行其他播放
...
- name: create in memory inventory
add_host:
hostname: "{{ item.name }}"
ansible_ssh_host: "{{ item.private_v4 }}"
ansible_user: "{{ ansible_user }}"
ansible_ssh_common_args: '-o ProxyCommand="ssh -i {{ ssh_priv_ key }} -W %h:%p -q ansible@{{ gw_ip }}"'
group:
- "{{ item.metadata.tool }}"
- "{{ item.metadata.environment }}"
loop: "{{ servers_info.openstack_servers }}"
...
这是有效的游戏,但有没有办法以更好的方式做到这一点,也许更“优雅”?
我对 ansible 模块 openstack.cloud.server_info 也有疑问,在文档中有参数filter,我尝试过滤实例的元数据,但它不起作用。
我更喜欢使用元数据而不是服务器名称来过滤我的网关,因为像这样,如果另一个实例获得带有“gw”字母的名称,我的剧本可能会失败,因为 gw_ip 事实可能包含错误的信息。