質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Ansible Tutorial

Ansible Tutorialは、Pythonで記述されたサーバの設定・管理を自動化させるためのツールです。サーバからクライアントへ直接命令し結果を取得するため、各クライアントでAnsible Tutorialをインストールが不要になります。

Q&A

解決済

1回答

2416閲覧

AnsibleのTemplatesでループをしたい

swtg

総合スコア1

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Ansible Tutorial

Ansible Tutorialは、Pythonで記述されたサーバの設定・管理を自動化させるためのツールです。サーバからクライアントへ直接命令し結果を取得するため、各クライアントでAnsible Tutorialをインストールが不要になります。

0グッド

1クリップ

投稿2020/09/26 17:40

前提・実現したいこと

Ansibleのtemplates機能で複数の変数リストを1つのループだけで解決できる様にしたい

本来やりたいと思っている事は、何台登録されるか分からないホストとIPの情報をループして
configファイルに追記して、configを完成させたいが、想定の登録だけになってくれない。
変数側の作りを変えることは厳しいのでansible側で解決をしたいと考えています。

作りたいconfig想定は local-data: "host_b. IN A 100.100.100.100" local-data: "host_b.test.local. IN A 100.100.100.100" local-data-ptr: "100.100.100.100 host_b.test.local." local-data: "host_c. IN A 200.200.200.200" local-data: "host_c.test.local. IN A 200.200.200.200" local-data-ptr: "200.200.200.200 host_c.test.local."

発生している問題・エラーメッセージ

しかし、多次元配列となって重複したconfigが出来てしまう

local-data: "host_b. IN A 100.100.100.100" local-data: "host_b.test.local. IN A 100.100.100.100" local-data-ptr: "100.100.100.100 host_b.test.local." local-data: "host_b. IN A 200.200.200.200" local-data: "host_b.test.local. IN A 200.200.200.200" local-data-ptr: "200.200.200.200 host_b.test.local." local-data: "host_c. IN A 100.100.100.100" local-data: "host_c.test.local. IN A 100.100.100.100" local-data-ptr: "100.100.100.100 host_c.test.local." local-data: "host_c. IN A 200.200.200.200" local-data: "host_c.test.local. IN A 200.200.200.200" local-data-ptr: "200.200.200.200 host_c.test.local."

該当のソースコード

変数の作り dns_server: test.local hoge: - server_host: host_a - server_host: host_b - server_host: host_c ip: - server_ip: 10.10.10.10 - server_ip: 100.100.100.100 - server_ip: 200.200.200.200 test.conf.j2 {% for h in hoge %} {% for i in ip %} local-data: "{{ h.server_host }}. IN A {{ i.server_ip }}" local-data: "{{ h.server_host }}.{{ dns_server }}. IN A {{ i.server_ip }}" local-data-ptr: "{{ i.server_ip }} {{ h.server_host }}.{{ dns_server }}." {% endfor %} {% endfor %}

ここにより詳細な情報を記載してください。

ubuntu20.04 ansible2.9.6 を利用しています。 宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Jinja2 の for 文では、loop という特殊変数が参照できます。これの index0 という属性では loop が何回目かを参照できますので、以下のようにすることで、二重ループを避けることができます。

test.conf.j2

yaml

1 {% for h in hoge %} 2 3 local-data: "{{ h.server_host }}. IN A {{ ip[loop.index0].server_ip }}" 4 local-data: "{{ h.server_host }}.{{ dns_server }}. IN A {{ ip[loop.index0].server_ip }}" 5 local-data-ptr: "{{ ip[loop.index0].server_ip }} {{ h.server_host }}.{{ dns_server }}." 6 {% endfor %}

実行結果

local-data: "host_a. IN A 10.10.10.10" local-data: "host_a.test.local. IN A 10.10.10.10" local-data-ptr: "10.10.10.10 host_a.test.local." local-data: "host_b. IN A 100.100.100.100" local-data: "host_b.test.local. IN A 100.100.100.100" local-data-ptr: "100.100.100.100 host_b.test.local." local-data: "host_c. IN A 200.200.200.200" local-data: "host_c.test.local. IN A 200.200.200.200" local-data-ptr: "200.200.200.200 host_c.test.local."

投稿2020/09/26 22:38

mit0223

総合スコア3401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swtg

2020/09/27 02:31

mit0223様、有難うございます。できました。質問する前にloop何回か試したのですが、こういう使い方だったのですね、理解出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問