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

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

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

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ansible

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

Q&A

解決済

1回答

4889閲覧

Ansible Jinja2テンプレートへの任意の変数埋め込み

Rabiusagi

総合スコア7

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ansible

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

0グッド

0クリップ

投稿2018/08/29 00:51

前提・実現したいこと

AnsibleでLinuxユーザの作成をしています。
グループ変数ymlとしてユーザ定義(パスワード以外)を作成し、
別ymlにAnsible Vaultで暗号化したパスワード定義を行っています。

ユーザが新規作成された際に該当ユーザにメールを送る処理をAnsibleで作成したいですが
メールを送ることはできるのですが、そこにパスワード情報を埋め込むことができません。
メール送信はmailモジュールを使用し、メールBodyのテンプレートファイル(Jinja2テンプレート)
を参照してメールを作っています。

以下ソースです。

  • commom.yml(ユーザ定義)

yml

1user: 2 - name: user_a 3 uid: 5001 4 groups: subgroup 5 state: present 6 append: yes 7 generate_ssh_key: yes 8 comment: 'user_a@example.com' 9 - name: user_b 10 uid: 5002 11 groups: subgroup 12 state: present 13 append: yes 14 generate_ssh_key: yes 15 comment: 'user_b@example.com'
  • secret.yml(パスワード定義)

yml

1secret: 2 - user: user_a 3 password: 'abcdefg' 4 - user: user_b 5 password: 'hijklmn'
  • main.yml(ユーザ作成ロール)

yml

1# ユーザ作成 2- name: "ユーザ作成" 3 include_tasks: user.yml 4 with_items: "{{ user }}" 5 loop_control: 6 loop_var: user_item 7 8# パスワード設定 9- name: "パスワード設定" 10 include_tasks: password.yml 11 with_items: "{{ secret }}" 12 loop_control: 13 loop_var: secret_item
  • user.yml(main.ymlからincludeしているタスク)

yml

1# ユーザ作成 2- name: "{{ user_item.name }} ユーザ作成" 3 user: 4 name: "{{ user_item.name }}" 5 uid: "{{ user_item.uid }}" 6 groups: "{{ user_item.groups }}" 7 state: "{{ user_item.state }}" 8 append: "{{ user_item.append }}" 9 generate_ssh_key: "{{ user_item.generate_ssh_key }}" 10 register: _user 11 12# メール送信 13- name: "{{ user_item.name }} メール送信" 14 mail: 15 subject: "サーバアクセス情報の送付({{ user_item.name }})" 16 from: no-reply@example.com 17 to: "{{ user_item.comment }}" 18 body: "{{ lookup('template', 'mail_template.j2') }}" 19 when: _user.create_home is defined # 新規作成時のみメール送付

ここで「mail_template.j2」へユーザのパスワード情報を埋め込みたいのですが、
「user」変数内にパスワードが無いため、うまく参照することができていません。

試したこと

  • json_queryフィルタ

https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#json-query-filter
ここにあるjson_queryフィルタを使って、テンプレート内に以下の様に書いてみました。

パスワード:{{ secret | json_query('[?user==user_item.name].password') }}

結果は、埋め込んだ場所に「[]」という空のリストのようなものが入っただけでした。

パスワード:[]
  • json_queryフィルタその2

json_queryフィルタでユーザ名を「user_item.name」で指定している個所に直接ユーザ名を書いてみました。
実際には直接ユーザ名を書くわけにはいかないので実験です。

パスワード:{{ secret | json_query('[?user=='user_a'].password') }}

結果は、パスワードは取り出せましたが、前後に余計な文字列([u'、])がくっついてきました。

パスワード:[u'abcdefg']

jinja2のフィルターの使い方がよくわかってないだけかもしれませんが・・・。

パスワードだけ暗号化のために外出しする、というのはよくある手法なのかと思うのですが、
その場合、ユーザに対応したパスワードをうまく参照するのに、皆さんどうやっているのでしょう?
変数のシーケンス、マッピングの作り方が悪いのか、Roleの作り方が悪いのか・・・。
知恵をお貸しください!

・暗号化せずにuser変数内にパスワードを定義するか
・user変数にパスワードを定義してまるっと全部暗号化するか
のどちらかでは簡単に実現できそうですが、最後の手段としたいです。

補足情報(FW/ツールのバージョンなど)

Ansibleバージョン:2.6.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

これでできると思います。

jinja2

1パスワード:{{ secret | json_query("[?user=='" + user_item.name + "'].password") | join }}
  • json_queryの引数は文字列なので、直接変数は使えない。文字列連結で対応。
  • [u'abcdefg']は配列を出力したようなので、joinで文字列にする。

参考にしたページは以下になります。

検索キーワード: ansible template u

検索キーワード: ansible json_query variable

パスワードだけ暗号化のために外出しする、というのはよくある手法なのかと思うのですが、

その場合、ユーザに対応したパスワードをうまく参照するのに、皆さんどうやっているのでしょう?

あまり詳しくないですが、Ansible Vaultを使えばまあ問題ないかなと。。。

投稿2018/08/29 02:15

ikemo

総合スコア332

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

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

Rabiusagi

2018/08/29 02:39

ありがとうございます! 教えて頂いた方法で実現することができました。 大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問