몇 가지 서비스의 상태를 가져오기 위해 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 %}