特定のWebサイトの残りの呼び出しを使用してファイルをダウンロードしてシステムにインストールするのに役立つAnsible PlayBookを作成しようとしています。私の現在のスクリプトは次のとおりです。
---
- 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
複数の値を1つのURLにロードする方法はありますか?読みながら複数のタスクを作成して複数のアプリをインストールし、1つのタスクとしてすべてインストールするのではなく、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