来自 openstack.cloud.server_info 的 Ansible 内存清单

来自 openstack.cloud.server_info 的 Ansible 内存清单

我需要创建一个内存清单来在 overcloud 实例上运行剧本,所有实例都不会直接暴露,只有一台服务器暴露并且可以用作“网关”又名“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 也有疑问,在文档中有参数筛选,我尝试过滤实例的元数据,但是不起作用。

我更愿意使用元数据而不是服务器名称来过滤我的网关,因为这样如果另一个实例获得带有“gw”字母的名称将被选中,并且我的剧本可能会失败,因为 gw_ip 事实可能包含错误的信息。

答案1

考虑使用清单插件和 DNS 减少生成此主机列表所需运行的任务数量。还可以实现标准清单功能,例如缓存以提高性能。

创建并使用 openstack.cloud.openstack库存配置并让其枚举主机。可能要设置 private: yes。用于keyed_groups添加以元数据值命名的组,因为此库存实现了Constructable

在 vars 中定义跳转主机的名称。可能group_vars只适用于此租户/项目/其他。

# DNS FQDN of jump host
jumphost: jumphost.{{ project }}.example.net
# ProxyCommand or ProxyJump can be defined as ansible vars
ansible_ssh_common_args: '-o ProxyCommand="ssh -i {{ ssh_priv_key }} -W %h:%p -q ansible@{{ jumphost }}"'

运行一个游戏localhost来填写跳转主机。openstack.cloud.server_info如果有意义,请使用。使用{{ jumphost }}任务更新 AAAA 和 A DNS 记录。只要此 IP 不变,就无需运行任何任务来再次找到它。

答案2

这对我有用

  - name: detect gateway for the {{ project }} tenant
    openstack.cloud.server_info:
      cloud: "{{ project }}"
      server: "*gw*"
      filters:
        vm_state: active
        metadata: 
          bootstrap: "true"
    register: gw_info

相关内容