레지스터 출력에 fo 루프를 사용하는 Ansible Jinja2 템플릿 문제

레지스터 출력에 fo 루프를 사용하는 Ansible Jinja2 템플릿 문제

몇 가지 서비스의 상태를 가져오기 위해 ansible을 사용하고 HTML 출력을 생성하기 위해 ansible jinja 템플릿을 사용하고 있습니다. 변수가 정의되지 않았거나 다른 오류가 발생합니다.

여기서는 레지스터 모듈에 값을 저장한 다음 이 값을 템플릿에 가져오는데 작동하지 않습니다.

Jinja 템플릿:

{% for network_switch in ['client'] %}
        <tr>
            <td>{{ hostvars[network_switch]['ansible_hostname'] }}</td>
            <td>{{ hostvars[network_switch]['kernel.stdout'] }}</td>
            <td>{{ hostvars[network_switch]['httpd.stdout'] }}</td>
        </tr>
{% endfor %}

스크립트 세부정보:

- name: Getting the OS Information
      command: 'uname -r'
      register: kernel

    - name: Getting the OS Information
      shell: "systemctl status sshd | grep -i active | awk '{print$3}'"
      register: httpd

    - name: create HTML report
      template:
        src: report.j2
        dest: "{{ file_path }}"
      delegate_to: localhost
      run_once: true

실수:

실패! => {"변경됨": false, "msg": "AnsibleUndefineVariable: \"hostvars['client']\" 정의되지 않음"}

답변1

사용ansible_play_batch "현재 게임의 활성 호스트 목록은 일련 번호(일명 "배치")로 제한됩니다. 실패하거나 연결할 수 없는 호스트는 "활성"으로 간주되지 않습니다.

{% for network_switch in ansible_play_batch %}
...

배치가 더 있으면 파일을 덮어씁니다. 바라보다제어 스크립트 실행: 전략 등. 바라보다가능한 날짜 변수사용하는 방법날짜고유한 파일 이름을 만듭니다. 예를 들어

dest: "{{ file_path ~ '-' ~
          ansible_date_time.date ~ '-' ~
          ansible_date_time.hour ~ '-' ~
          ansible_date_time.minute ~ '-' ~
          ansible_date_time.second }}"

단일 파일 만들기

다음 옵션은 첫 번째 재생의 모든 항목이 포함된 목록을 생성하고 두 번째 재생에서 파일을 쓰는 것입니다(템플릿을 변경하고 사용나의 목록). 예를 들어

- hosts: all
  tasks:
    - name: Getting the OS Information
      ...
    - name: Collect the list
      set_fact:
        my_list: "{{ my_list|default([]) +
                     [hostvars[item]['ansible_hostname'],
                      hostvars[item]['kernel.stdout'],
                      hostvars[item]['httpd.stdout']] }}"
       loop: "{{ ansible_play_batch }}"
       run_once: true

- hosts: all
  tasks:
    - name: Take a look at what was collected
      debug:
        var: my_list
      run_once: true
    - name: create HTML report
      template:
        src: report.j2
        dest: "{{ file_path }}"
      delegate_to: localhost
      run_once: true

(검증되지 않은)

답변2

스크립트:

---
- name: build Centos inventory report
  hosts: client

  vars:
    file_path: /var/www/html/generated_report.html

  tasks:
    #- name: Getting the OS Information
    #  command: 'cat /etc/redhat-release'
    #  register: os_release

    - name: Getting the OS Information
      command: 'uname -r'
      register: kernel

    - name: Getting the OS Information
      shell: "systemctl status sshd | grep -i active | awk '{print$3}'"
      register: httpd

    - name: Collect the list
      set_fact:
        my_list: "{{ my_list|default([]) +
                     [hostvars[item]['ansible_hostname'],
                      hostvars[item]['kernel.stdout'],
                      hostvars[item]['httpd.stdout']] }}"
      loop: "{{ ansible_play_batch }}"
      run_once: true

- name: Collecting all information
  hosts: client
  vars:
    file_path: /var/www/html/generated_report.html
  tasks:
    - name: Take a look at what was collected
      debug:
        var: my_list
      run_once: true

    - name: create HTML report
      template:
        src: report.j2
        dest: "{{ file_path }}"
      delegate_to: localhost
      run_once: true

Jinja 템플릿:

{% for network_switch in ansible_play_batch %}
        <tr>
            <td>{{ hostvars[network_switch]['ansible_hostname'] }}</td>
            <td>{{ hostvars[network_switch]['kernel.stdout'] }}</td>
            <td>{{ hostvars[network_switch]['httpd.stdout'] }}</td>
        </tr>
{% endfor %}

관련 정보