tl;dr
結論から言うと include_vars を使えばできる。
roles/*/tasks/main.yml:
- include_vars: private_key.yml
- name: prepare private key
copy: dest=~/.ssh/id_rsa content="{{ private_key }}" mode=0600
- name: prepare ssh config
copy: dest=~/.ssh/config src=ssh_config mode=0600
ただし色々とハマりポイントがあった。
vars/main.yml からインクルードしたかった
roles/*/vars/main.yml でこういう風に書きたかったんだけど、 vars はただの YAML なので、これはできないみたい。
- include: private_key.yml
vars_files を使おうとした
ERROR: vars_files is not a legal parameter in an Ansible task or handler
と怒られる。 vars_files
は意味的に vars
と同じなので playbook でしか使えないようだ。
タスクにタグを指定している場合 include_vars にもタグが必要
これが今回一番ハマったポイント。
- include_vars: private_key.yml
- name: prepare private key
copy: dest=~/.ssh/id_rsa content="{{ private_key }}" mode=0600
tags:
- debug
- name: prepare ssh config
copy: dest=~/.ssh/config src=ssh_config mode=0600
みたいにして ansible-playbook の引数に -t debug
を付けて実行した場合、
fatal: [127.0.0.1] => One or more undefined variables: 'private_key' is undefined
というエラーが出る。この場合、 include_vars にもタグが必要。
このせいで include_vars が使えないと思い込んでしまった。
include_vars もタスクの一種なので、分かってしまえば当然の話なのだけど。
(追記) always タグ
ansible 1.9 から追加された always
という特別なタグを使えば特定のタスクを常に実行できるらしいので、こういう場合に使うと便利かもしれない。
Acknowledgements
include_vars が使えることは Twitter で @r_rudi さんに教えてもらいました(それと always
タグについても)。ありがとうございます。
@knzm2015 たしか勝手にはmain.yml以外読んでくれない覚えがありますので、 include_vars を使うのはいかがでしょう http://t.co/Vf4MUGxhUp
— shirou - しろう (@r_rudi) 2015, 4月 13