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

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

新規登録して質問してみよう
ただいま回答率
85.35%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Ansible

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

Q&A

解決済

2回答

5143閲覧

Ansible(v2.7) 複数配列の参照方法について

To-mu

総合スコア8

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Ansible

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

0グッド

0クリップ

投稿2020/05/10 13:36

Ansible Playbook実行により、複数配列を同時に参照したいです。

parameter.yml (パラメタ定義ファイル)

server1: file_num: 2 a_files: - a_file_1.txt - a_file_2.txt b_files: - b_file_1.txt - b_file_2.txt

上のパラメタファイルを読み込んだ場合、
要素2個の vars[ansible_hostname]['a_files'] 配列
要素2個の vars[ansible_hostname]['b_files'] 配列
ができるはずです。

yml ファイルのloop機能を使って、
vars[ansible_hostname]['a_files'][0] と vars[ansible_hostname]['b_files'][0] を対応させて実行
vars[ansible_hostname]['a_files'][1] と vars[ansible_hostname]['b_files'][1] を対応させて実行
(計2回の繰り返し)
のようなコードは書けるのでしょうか。

test.yml (実行用playbook)

例えばの例ですが、、、
a_file_1.txt を b_file_1.txt にコピー、a_file_2.txt を b_file_2.txtにコピーする時

- hosts: all vars_files: - parameter.yml tasks: - copy: src: /work/a_dir/<a_filesのリスト> dest: /work/b_dir/<b_filesのリスト> loop: <2つの配列をここに指定>

のような書き方になるかと思っています。
ご存じの方回答をお願いできますでしょうか。

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

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

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

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

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

guest

回答2

0

zipフィルタを使うと良いかもしれません。2つのリストを連結して1つにするフィルタです。
https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#zip-and-zip-longest-filters

投稿2020/05/10 15:39

編集2020/05/10 15:40
answer_d

総合スコア2

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

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

To-mu

2020/05/11 14:27

ご回答頂きありがとうございます。 zipフィルタを使って連結する方法もあるのですね...。 今回は設計段階のため[配列+dict] で実装することにしようと思っております。 ただ運用時に既存配列を連結させる必要が生じた場合、ご教授頂いた方法を是非使わせていただきたいです。 ありがとうございます。
guest

0

ベストアンサー

以前の回答でtest.j2が同じファイルになってしまうので、いいのかな?っと気になっていました。補足しとけばよかったですね。

質問されたように2重ループで回すのもいいですが、このような場合は配列とdict(pythonでは辞書型)を組み合わせるとわかりやすいと思います。2重ループだとコード上直感的にわかりづらくなります。

[parameter.yml]

yaml

1server1: 2 file_num: 2 3 files: 4 - src: a_file_1.txt 5 dest: b_file_1.txt 6 - src: a_file_2.txt 7 dest: b_file_2.txt

filesの配下をjsonで表すとこうなります。
たぶんこっちのほうがわかりやすいと思います。

json

1 2"files": [ 3 { 4 "src": "a_file_1.txt", 5 "dest": "b_file_1.txt" 6 }, 7 { 8 "src": "a_file_2.txt", 9 "dest": "b_file_2.txt" 10 } 11] 12

[test.yml]

filesをloopしてその中のキーを指定することで値を指定することができます。

yaml

1- hosts: all 2 vars_files: 3 - parameter.yml 4 tasks: 5 - copy: 6 src: "/work/a_dir/{{ item.src }}" 7 dest: "/work/b_dir/{{ item.dest }}" 8 loop: "{{ vars[ansible_hostname]['files'] }}"

投稿2020/05/10 13:52

編集2020/05/10 14:03
comefigo

総合スコア1051

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

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

To-mu

2020/05/11 14:16

comefigoさん、毎度のことながらありがとうございます。 配列とdictを組み合わせる方法、丁度私が実装したいものとドンピシャでした。 以前、ご質問させて頂いた際にはsrc側のファイルは1ファイルにして、 templateファイルの中身を変数で書き換えればいいかなと思っていました。 しかしtemplateファイルの中身に別ファイル名(c_file_1.txt, c_file_2.txt...)を記載する必要があり、 今回ご質問させていただきました。 本当にありがとうございます。また何かあれば是非ご質問させてください。
comefigo

2020/05/11 15:41

いえいえ。また何かございましたら私を含めてAnsibleユーザ会のメンバーがサポートしますw
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問