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

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

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

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

Ansible

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

Q&A

解決済

2回答

1076閲覧

Ansibleを使用し、[変数]個のテンプレートファイルを配置したい

To-mu

総合スコア8

CentOS

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

Ansible

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

0グッド

0クリップ

投稿2020/05/09 07:58

前提・実現したいこと

 Ansible(ver2.7)を使用し、某システム構築のためのplaybook等資材を作成しております。
その中でtemplateモジュールを使用し、jinja2仕様のファイルをターゲットサーバに配置しようとしています。
ターゲットサーバ毎に配置するファイル数が異なるため、パラメタファイルにサーバ毎の作成ファイル数を記載して
読み込みを行おうとしていますがその方法についてご教授頂きたいです。

■システム前提条件
コントロールサーバ(Ansibleインストール済)
OS: CentOS7.6
Ansible ver2.7
ipv4: 192.168.0.1
hostname: server1

ターゲットサーバ
OS: CentOS7.6
ipv4: 192.168.0.2
hostname: server2

■コントロールサーバ上Ansible資材

作業用ディレクトリ: /tmp/work

インベントリファイル: ./inventory

[server] 192.168.0.2 ansible_user=root ansible_password=<パスワード>

パラメタファイル: ./param/parameter.yml

server2: file_num: 3

ymlファイル: ./create_file.yml

- hosts: all vars_files: - param/parameter.yml tasks: - template: src: ./test.j2 dest: /tmp/outputs.....←★この辺りの記載が不明★

今回の場合では、パラメタファイルから読み込んだ (server2: file_num: 3)の値により
ターゲットサーバ上のディレクトリ(/tmp/outputs)上に、test1, test2, test3の3ファイルを作成したいです。

この辺り詳しい方ご教授頂けますでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

コメントだとコードが書きづらいので別回答にさせて頂きます。

ファイル名が固定値ならば一番手っ取り早い方法としては、以下になります。
一応ansible 2.9.7で動作確認済みです。

[parameter.yml]

パラメータファイルの各ホスト名の上位にtemplates(変数名はなんでもよい)を追加します。
ホスト名配下にファイル名を配列で定義します。

yaml

1templates: 2 server2: 3 - test1.txt 4 - test2.txt 5 server3: 6 - test1.txt 7 - test2.txt 8 - test3.txt 9 - test4.txt 10 - test5.txt

create_file.yml

ansible_facts['nodename']から接続中のホスト名が取得できるので、
loopを用いてファイル配列を抽出します。各ホスト名が異なるので、それぞれの配列の要素数に従ってファイルが生成される仕組みになります。

yaml

1- hosts: all 2 vars_files: 3 - param/parameter.yml 4 tasks: 5 - template: 6 src: ./test.j2 7 dest: "/tmp/output/{{ item }}" 8 loop: "{{ templates[ansible_facts['nodename']] }}"

理解されているかと思いますが、一応変数の指定方法について補足
templates.server2[0]はtemplates.server2のtest1.txtを指します。
templates['server2'][0]も同じようにtemplates.server2のtest1.txtを指します。
上記のようにホスト名が動的な場合(ansible_facts['nodename'])は、templates.変数名ではなくtemplates[変数名]で指定します。

投稿2020/05/09 14:00

編集2020/05/09 16:40
comefigo

総合スコア1045

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

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

To-mu

2020/05/10 09:42

ご教授いただきありがとうございます。 仰る通りターゲットサーバのホスト名をkeyとする配列を新規作成すれば、サーバ毎の処理が可能ですね。 その方針で検討させて頂きます。 因みに、”test1、test2、test3はfile_numに従ってナンバリングされるイメージですか?” → そうですね。file_numに従って1からインクリメントされるため、   パラメタファイルを作成するためのテンプレート作成することで、ファイル名の入力の手間が省略できそうです。 丁寧に回答頂きありがとうございました。
guest

0

回答する前に確認させてください。
サーバごとに/tmp/outputsが複数ファイルになるということでしょうか?

例のようにserver2ならfile_numに従って、/tmp/outputsが3つ出力されるイメージでしょうか?

投稿2020/05/09 12:53

comefigo

総合スコア1045

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

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

To-mu

2020/05/09 13:00

ご質問いただきありがとうございます。 概ねその認識で合っています。 ただ厳密には、/tmp/outputs はディレクトリだと思って書いたため、 /tmp/outputs 配下に3ファイル"test1" "test2" "test3"を作成したいです。 今回の例ではターゲットサーバは一台(server2)のみで書いていますが、 実際にやりたい事は、複数台のターゲットサーバがあり、 パラメタファイルに server2: file_num: 3 server3: file_num: 5 .... などと書くことで、 server2の/tmp/outputs 配下に3ファイル server3の/tmp/outputs 配下に5ファイル... とサーバ毎に異なる数のファイルを作成したいです。
comefigo

2020/05/09 13:16

test1、test2、test3はfile_numに従ってナンバリングされるイメージですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問