私はいくつかのサービスの状態を取得するために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 }}"
単一ファイルの作成
次のオプションは、最初の再生のすべての項目を含むリストを作成し、2番目の再生でファイルを書き込むことです(テンプレートを変更して使用する私のリスト)。例えば
- 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 %}