Ansible

來自 openstack.cloud.server_info 的 Ansible 記憶體清單

  • October 13, 2021

我需要創建一個記憶體清單以在 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所以他們只適用於這個租戶/項目/任何東西。

# 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如果有意義,請使用。使用任務更新 AAAA 和 A DNS 記錄{{ jumphost }}。只要這個 IP 沒有改變,就不需要執行任何任務來再次找到它。

引用自:https://serverfault.com/questions/1052016