以指令設定 Ansible Tower 的 License

這兩天遇到一個狀況,以瀏覽器登入 Ansible Tower 網站,發生了無法設定 License 的情況。是故,只能透過 CLI 方式來進行。

方法有幾個:

  1. 使用 tower-cli (若是 AWX,就是 awx)
  2. 使用 curl
  3. 使用 Tower 這個 collection (3.8.0 以後,而且這 module 在 automation hub)

使用 tower-cli / awx

tower-cli setting modify LICENSE '{"eula_accepted" : "true", "subscription_name": "Enterprise Tower up to 100 Nodes", ....}'
awx setting modify LICENSE '{"eula_accepted" : "true", "subscription_name": "Enterprise Tower up to 100 Nodes", ....}'

不過,說真的,誰會知道後面要填什麼…在已經有 license 的主機上取得的結果大致是這樣

{'subscription_name': '', 'sku': '', 'support_level': None, 'instance_count': 20, 'license_date': '', 'license_type': '', 'product_name': '', 'valid_key': True, 'pool_id': '', 'satellite': False}

使用 curl

這方法跟上面是相似的,因為上面的 tower-cli / awx 也是使用 Tower API 來處理。

使用 Tower collection

Tower 這個 Collection 是放在 Red Hat Automation Hub 上,所以用 ansible-galaxy collection install 的時候,會出現錯誤,因為 galaxy.ansible.com 上並沒有這個 collection。

取巧的步驟可以參考下面。

第一步,編輯 ansible.cfg

[defaults]
collections_paths=./collections

第二步,安裝 ansible.tower 這個 collection。

到這個網址:https://console.redhat.com/ansible/automation-hub/repo/published/ansible/tower 下載 tarball ,下載完成後解壓縮放到 collections/ansible_collections/ansible/tower 下面。

# 假設 tarball 路徑是 ~/Downloads/ansible-tower-3.8.4.tar.gz
mkdir -p collections/ansible_collections/ansible/tower
cd collections/ansible_collections/ansible/tower
tar xf ~/Downloads/ansible-tower-3.8.4.tar.gz

第三步,新增 playbook.yml

---
- hosts: localhost
  collections:
    - ansible.tower
      # - awx.awx       #when using awx.awx

  tasks:
    - name: Upload manifest
      delegate_to: localhost
      tower_license:
        manifest: "{{ manifest }}"
        eula_accepted: yes
        tower_username: "{{ tower_username }}"
        tower_password: "{{ tower_password }}"
        tower_host: "{{ tower_host }}"
        validate_certs: no

第四步,到 access.redhat.com 去配置 subscription (步驟可以參考 4. Import a Subscription — Ansible Tower User Guide v3.8.4 ),然後下載為 manifest.zip,在 Tower 主機裡執行以下指令來匯入 license

ansible-playbook playbook.yml  -e manifest=./manifest.zip \
     -e tower_username=<tower_admin> \
     -e tower_password=<tower_admin_password> \
     -e tower_host=<tower_host>

這樣就大功告成了。

補充

把 Red Hat Automation Hub 加到 galaxy server list 的方法是在 ansible.cfg 裡加入

[galaxy]
server_list = automation_hub

[galaxy_server.automation_hub]
url=https://cloud.redhat.com/api/automation-hub/
auth_url=https://sso.redhat.com/auth/realms/redhat-external/protocol/openid-connect/token

token=my_ah_token

參考資料