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の設定があからさまだから、分かるだろう。分かれ、未来の僕。

そういうわけさ。