Ansible

將文件中的多個值載入到 ansible 劇本中

  • October 20, 2022

我正在嘗試創建一個 ansible 劇本,它將幫助我下載文件並使用來自某個網站的休息呼叫將其安裝到我們的系統中。我目前的劇本如下所示。

---
- name: install apps
 hosts: myserversservers
 tasks:
   - name: app installer
     uri:
       url: 'https://127.0.0.1:8089/services/apps/local'
       method: POST
       body: 'auth=XXXXXh&filename=true&name=https://XX.domain.com/app/2934/release/2.2.0/download'
       headers:
         Content-Type: application/x-www-form-urlencoded
       url_username: admin
       url_password: mypass
       validate_certs: false
       status_code: 201
     register: result

有沒有一種方法可以在一段時間內將多個值載入到 URL 中讀取一種樣式,這樣我就可以簡單地使用 jinja 在一次播放中載入所有變數,而不是編寫多個任務來安裝多個應用程序,這樣所有的任務都可以完成應用程序安裝?例如,而不是像下面這樣寫 URL

https://XX.domain.com/app/**2934**/release/**2.2.0**/download

我可以通過引用 yaml 文件(包括 vars)以某種方式使用 Jinja 替換它嗎?如果可能,應該如何格式化 YAML 文件以及如何將其引用到劇本中?

https://XX.domain.com/app/{{ app number }}/release/{{ version number}}/download

我可以維護一個包含我需要的所有變數的文件

app1 ver3
app3 ver55
app99 ver99

例如,給定文件

shell> cat app_ver.csv
app1 ver3
app3 ver55
app99 ver99

使用模組community.general.read_csv

   - community.general.read_csv:
       path: app_ver.csv
       fieldnames: [app, ver]
       delimiter: ' '
     register: app_ver

 app_ver.list:
   - {app: app1, ver: ver3}
   - {app: app3, ver: ver55}
   - {app: app99, ver: ver99}

測試迭代

   - debug:
       msg: |
         body: 'auth=XXXXXh&filename=true&name={{ http }}'
     loop: "{{ app_ver.list }}"
     vars:
       http: 'https://XX.domain.com/app/{{ item.app }}/release/{{ item.ver }}/download'

TASK [debug] **********************************************************************************
ok: [localhost] => (item={'app': 'app1', 'ver': 'ver3'}) => 
 msg: |-
   body: 'auth=XXXXXh&filename=true&name=https://XX.domain.com/app/app1/release/ver3/download'
ok: [localhost] => (item={'app': 'app3', 'ver': 'ver55'}) => 
 msg: |-
   body: 'auth=XXXXXh&filename=true&name=https://XX.domain.com/app/app3/release/ver55/download'
ok: [localhost] => (item={'app': 'app99', 'ver': 'ver99'}) => 
 msg: |-
   body: 'auth=XXXXXh&filename=true&name=https://XX.domain.com/app/app99/release/ver99/download'

用於測試的完整劇本範例

- hosts: localhost

 tasks:

   - community.general.read_csv:
       path: app_ver.csv
       fieldnames: [app, ver]
       delimiter: ' '
     register: app_ver

   - debug:
       var: app_ver.list|to_yaml

   - debug:
       msg: |
         body: 'auth=XXXXXh&filename=true&name={{ http }}'
     loop: "{{ app_ver.list }}"
     vars:
       http: 'https://XX.domain.com/app/{{ item.app }}/release/{{ item.ver }}/download'

引用自:https://unix.stackexchange.com/questions/721709