ansible에서 jinja2 및 csv 파일을 사용하여 ansible-playbook을 생성해야 합니다.

ansible에서 jinja2 및 csv 파일을 사용하여 ansible-playbook을 생성해야 합니다.

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

관련 정보