我需要创建一个内存清单以在 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 事实可能包含错误的信息。
考虑使用清单插件和 DNS 减少生成此主机列表所需运行的任务数量。还使标准库存功能成为可能,例如缓存以提高性能。
创建并使用
openstack.cloud.openstack
清单配置并让它枚举主机。大概是想设置private: yes
。用于keyed_groups
添加以元数据值命名的组,因为此清单实现Constructable
在 vars 中定义跳转主机的名称。可能在
group_vars
所以他们只适用于这个租户/项目/任何东西。继续播放
localhost
以填写跳转主机是什么。openstack.cloud.server_info
如果有意义,请使用。使用任务更新 AAAA 和 A DNS 记录{{ jumphost }}
。只要这个 IP 没有改变,就不需要运行任何任务来再次找到它。这对我有用