レジスタ出力に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 }}"

単一ファイルの作成

次のオプションは、最初の再生のすべての項目を含むリストを作成し、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 %}

関連情報