将文件中的多个值加载到 ansible playbook 中

将文件中的多个值加载到 ansible playbook 中

我正在尝试创建一个 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 文件(包括变量)以某种方式使用 Jinja 替换它吗?如果可能的话,YAML 文件应该如何格式化以及如何在剧中引用它?

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

我可以维护一个包含我需要的所有变量的文件

app1 ver3
app3 ver55
app99 ver99

答案1

例如,给定文件

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

使用模块社区.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'

答案2

是的,差不多就是这样。为您的应用程序编号和版本号创建变量并迭代每个变量。就格式而言,我认为您击中了要害。

vars:
 app_number: [app1, app3, app99]
 version_number: [ver3, ver55, ver99]

debug: 
  msg: https://XX.domain.com/app/{{ item.0 }}/release/{{ item.1 }}/download
loop: "{{ list_one | zip(list_two) | list }}"

下面有一篇很好的文章可以帮助您同时处理多个列表:

https://stackoverflow.com/questions/46411107/iteating-over-two-lists-in-ansible

相关内容