2017-11-08 5 views
0

問題:私は2つのタスクがあります。私が理解するように、タスクごとに1つのモジュールしか実行できません。Jinja2テンプレートから複数のホストに対して単一の構成を生成します。

タスク1 - ネットワークデバイスからのファクト情報(シリアル、バージョンなど)を収集します。

タスク2 -

理想的な結果タスク1で収集した情報を持つテンプレートをレンダリングします私はネットワーク機器の負荷をループするよ、私の理想的な結果は、一度に1つのデバイスを選択することですので、集まりますその情報をテンプレートにレンダリングした後、ループ上の他のデバイスに移動するなどの操作を行います。

アプローチ:私は同じ構文を維持すると考えました。タスク1でファクトをファイル(.json)に保存し、タスク2でJSONファイルを読み込み、興味のある変数を取得します。

これを実行する方法はありますか?

タスク:役割/ジュニパー私はテンプレートをレンダリングするときのように私の目的に適合していない現在持っているもの

は、それが唯一の最後のデバイスに関する情報が含まれています(おそらく複数あります) .junos /タスク/ main.yaml

- name: 1 - Gathering Facts 
    junos_get_facts: 
     host: "{{ inventory_hostname}}" 
     user: "" 
     passwd: "" 
     savedir: "~/Ansible/Ouput/Facts" 
    ignore_errors: True 
    register: junos 

- name: 2 - Creating the template 
    template: 
     src="~/Ansible/roles/juniper.junos/templates/template.j2" 
     dest="~/Ansible/Ouput/Facts/Device_facts.yml" 

テンプレート:〜/ Ansible /役割/ juniper.junos /テンプレート/ template.j2

{% for host in groups['OOB_AMS'] %} 

    ANSIBLE NAME:     {{ inventory_hostname}} 

    HOSTNAME:    {{ junos.facts.hostname }} 
    MODEL:     {{ junos.facts.model }} 
    SERIAL:     {{ junos.facts.serialnumber }} 
    VERSION:    {{ junos.facts.model }} 
    UP TIME:    {{ junos.facts.RE0.up_time }} 

{% endfor %} 

理想的な出力: "〜/ Ansible /出力リレー/事実/ Device_facts.yml"

ANSIBLE NAME:     DEVICE 1 

    HOSTNAME:    DEVICE 1 HOSTNAME 
    MODEL:     DEVICE 1 MODEL 
    SERIAL:     DEVICE 1 SERIAL 
    VERSION:    DEVICE 1 VERSION 
    UP TIME:    DEVICE 1 UP TIME 

    ANSIBLE NAME:     DEVICE 2 

    HOSTNAME:    DEVICE 2 HOSTNAME 
    MODEL:     DEVICE 2 MODEL 
    SERIAL:     DEVICE 2 SERIAL 
    VERSION:    DEVICE 2 VERSION 
    UP TIME:    DEVICE 2 UP TIME 

    ANSIBLE NAME:     DEVICE 3 

    HOSTNAME:    DEVICE 3 HOSTNAME 
    MODEL:     DEVICE 3 MODEL 
    SERIAL:     DEVICE 3 SERIAL 
    VERSION:    DEVICE 3 VERSION 
    UP TIME:    DEVICE 3 UP TIME 

答えて

1

あなたはhost変数でfor -loopを書きましたが、一度もそれを使用していません。

変更テンプレート:groups['OOB_AMS']上でループ

{% for host in ansible_play_hosts %} 

    ANSIBLE NAME:     {{ hostvars[host].inventory_hostname}} 

    HOSTNAME:    {{ hostvars[host].junos.facts.hostname }} 
    MODEL:     {{ hostvars[host].junos.facts.model }} 
    SERIAL:     {{ hostvars[host].junos.facts.serialnumber }} 
    VERSION:    {{ hostvars[host].junos.facts.model }} 
    UP TIME:    {{ hostvars[host].junos.facts.RE0.up_time }} 

{% endfor %} 

は悪くありませんでしたが、グループ名をハードコーディングすることは、あなたの場合には不要と思われます。代わりに、ansible_play_hosts(バージョン2.2より前はplay_hosts)を使用できます。

また、わかりやすくするためにtemplateタスクにrun_once: trueを追加することもできます。これはクリティカルではありません。テンプレートが各繰り返しで同じ出力を生成するため、後続の実行はとにかくスキップされますが、何度も実行する必要はありません。

+0

ありがとう@techraf。これは治療にも役立ちました。私はrun_onceも使用して、期待される結果を得ました。この[link](http://docs.ansible.com/ansible/latest/playbooks_variables.html)には、techrafによって提案された変数があります。 –

関連する問題