csvファイルからデータを読み取る必要があるため、ansibleプレイブックを作成するにはjinjaテンプレートを作成する必要があります。
csvファイルは次のとおりです(ファイル名ansi.csv)。
aaa,bbb,ccc,ddd
aa01,ansi,directory,yes
aa02,jinj,directory,yes
aa01,play,direvtory,yes
aa02,tem,directory,yes
テンプレートを生成する私のプレイブックは次のとおりです。
---
- hosts: localhost
vars:
csvfile: "{{ lookup('file', 'csv_files/ansi.csv')}}"
tasks:
- name: generate template
template:
src: template.j2
dest: playbook.yml
以下のようにテンプレートを作成しました。
---
{% for item in csvfile.split("\n") %}
{% if loop.index != 1 %}
{% set list = item.split(",") %}
- name: 'make directory'
hosts: {{ list[0]|trim()}}
become: {{ list[3]}}
tasks:
- name: {{ list[1] }}
file:
path: {{list[1]}}
state: {{ list[2] }}
{% endif %}
{% endfor %}
私が得る出力スクリプトはもっと簡単です。
---
- name: 'make directory'
hosts: aa01
become: yes
tasks:
- name: ansi
file:
path: ansi
state: directory
- name: make directory
hosts: aa02
become: yes
tasks:
- name: jinj
file:
path: jinj
state: directory
- name: make directory
hosts: aa01
become: yes
tasks:
- name: play
file:
path: play
state: directory
- name: make directory
hosts: aa01
become: yes
tasks:
- name: tem
file:
path: tem
state: directory
しかし、以下のスクリプトが必要です
---
- name: 'make directory'
hosts: aa01
become: yes
tasks:
- name: ansi
file:
path: ansi
state: directory
- name: play
file:
path: play
state: directory
- name: make directory
hosts: aa02
become: yes
tasks:
- name: jinj
file:
path: jinj
state: directory
- name: tem
file:
path: tem
state: directory
上記のプレイブックで最初の列に基づいてグループ化し、作業部分のみを繰り返します(ホストが同じ場合)。これを達成するのに役立つ人はいますか?事前にありがとう
答え1
モジュールを使用してcsvファイルを読み取るCSVを読むそしてフィルターを使うグループ化基準。たとえば、次のスクリプトとテンプレートは
shell> cat playbook.yml
- hosts: localhost
tasks:
- read_csv:
path: ansi.csv
register: data
- template:
src: template.j2
dest: playbook.yml
shell> cat template.j2
---
{% for host in data.list|groupby('aaa') %}
- name: 'make directory'
hosts: {{ host.0 }}
become: yes
tasks:
{% for task in host.1 %}
- name: {{ task.bbb }}
file:
path: {{ task.bbb }}
state: {{ task.ccc }}
{% endfor %}
{% endfor %}
与える
shell> cat playbook.yml
---
- name: 'make directory'
hosts: aa01
become: yes
tasks:
- name: ansi
file:
path: ansi
state: directory
- name: play
file:
path: play
state: direvtory
- name: 'make directory'
hosts: aa02
become: yes
tasks:
- name: jinj
file:
path: jinj
state: directory
- name: tem
file:
path: ten
state: directory