Ansibleのsudoパスワードをリポジトリに残さないために
Posted on 2014/08/28(Thu) 00:40 in technical
一体、何の話か。
以前、RhodecodeにPushしたら自動的にPelicanをmake htmlするためのhook(https://www.ainoniwa.net/pelican/2014/0319a.html)を書いた。
Ansibleを使うのにも慣れた感じがあるので、pelicanそのもののインストールとタグを分けたplaybookを書いたら良いんじゃないかと思った。
まぁ、とりあえず書いたのね。大して長くもないし。
で。
ansible-playbookを非対話バッチとして実行する際にsudoで別ユーザ権限実行とかを使う必要に迫られたのだけど、hookで実行するからパスワード聞かれるタイミングとか無いわけ。ログインは公開鍵だし。
サーバごとにsudoersを設定するとか受け入れられないし、ask-pass使いたいけどRhodecodeのhookバッチで非対話だゲロゲロー。
ってわけ。
とりあえず方法はある。
Ansibleには、ansible_sudo_passと言うそのものズバリな設定項目がある。:
ansible_sudo_pass The sudo password to use (this is insecure, we strongly recommend using --ask-sudo-pass)
See: http://docs.ansible.com/intro_inventory.html#list-of-behavioral-inventory-parameters
こいつを hosts とかに書いておけば問題なく実行できる。
つまりこうだ:
$ echo "192.168.0.1 ansible_sudo_pass=xxxxxxxx" >> hosts $ ls hosts main.yml $ ansible-playbook main.yml -i hosts -t update
ヒュー、オッケー片付いた。
でもそれリポジトリに入れるの?
「忘れると面倒だし、hostsファイルはリポジトリに入れておこうかな、うん、それがいい」
「そうだね、やめようね」
パスワード文字列だけ他のファイルに書いておく。
そこで、lookupを使ってファイルの中身をテキストとして読み込ませる。
See: http://docs.ansible.com/playbooks_lookups.html
要所要所で使っていけば微妙にグレーな部分を切り離すのに一役買ってくれる気がする。
と言うわけでこうなる。:
$ echo xxxxxxxx > secret $ chmod 400 secret $ echo "192.168.0.1 ansible_sudo_pass=\"{{ lookup('file','./secret') }}\"" >> hosts $ ls hosts main.yml secret $ ansible-playbook main.yml -i hosts -t update
で、secretはリポジトリに入れなければいい。
仮にこの仕組みを忘れてもhostsの設定があからさまだから、分かるだろう。分かれ、未来の僕。
そういうわけさ。