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