前提・実現したいこと
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

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/29 02:39