파일의 여러 값을 Ansible 플레이북으로 로드

파일의 여러 값을 Ansible 플레이북으로 로드

특정 웹사이트의 나머지 호출을 사용하여 파일을 다운로드하고 시스템에 설치하는 데 도움이 되는 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

모듈 사용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'

답변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

관련 정보