Ansibleで楽にパスワード設定
こんにちは當間です またまたお久しぶりです
中々どうしてブログ担当の順番が回ってこないのですが、マイペースでゆっくりやっていこうと思います
前回はユーザパスワードを設定する方法について書きましたが、別途ハッシュ化する手間が面倒でした
今回はパスワードを別途hash化しなくても済む方法について、です
パスワードを別途hash化しなくても済む方法
要はAnsibleの処理中にハッシュ化してしまえば良いわけです
saltを用意して、pythonコードでsha-512でハッシュ化します
python -c 'import crypt; print crypt.crypt("PASSWORD", "$6$SALT")'
$6$ 部分が sha-512 を指します
salt自体も、覚えておく必要はありませんのでランダム作成してしまいましょう
ランダムファイル名でテンポラリファイルを作成する mktemp コマンドを dry-run で実行し、文字列の一部(後ろから8文字)を頂きましょう
mktemp -u | awk '{print substr($0, length($0)-8+1)}'
これをAnsibleのPlaybookとして書くと以下の通りです
--- - hosts: target vars: - username: hoge - password: gre-user-w0rd tasks: - name: Create salt shell: "mktemp -u | awk '{print substr($0, length($0)-8+1)}'" register: salt - name: Create hash for password shell: python -c 'import crypt; print crypt.crypt("{{ password }}", "$6${{ salt.stdout }}")' register: hash_password - name: Add User user: name: "{{ username }}" password: "{{ hash_password.stdout }}" become: yes「Create salt」と「Create hash for password」のタスクを追記しています
上記で目的は達成していますが、実行すると shell モジュール部分が毎回 changed となり、 salt がランダムなので hash値 が変わり user モジュールの password も毎回 changed となります
ハッシュが変わってもパスワード自体は同じ文字列なので、ログインは可能ですが changed を失くしたい場合は shell モジュールタスクに changed_when を、 user モジュールに update_password を追記すると良いです
- name: Create salt shell: "mktemp -u | awk '{print substr($0, length($0)-8+1)}'" changed_when: False register: salt - name: Create hash for password shell: python -c 'import crypt; print crypt.crypt("{{ password }}", "$6${{ salt.stdout }}")' changed_when: False register: hash_password - name: Add User user: name: "{{ username }}" password: "{{ hash_password.stdout }}" update_password: on_create become: yes実行すると、3tasksでユーザが追加され、指定ユーザでログインが可能になっているかと思います
$ ssh blog2 -l hoge whoami hoge@blog2's password: hogeAnsibleでもっと楽にパスワード設定
作成したランダムSaltを元にパスワードをハッシュ化して、userモジュールで指定する…
必要とはいえ、いきなりPythonコードだったり普段利用頻度の低い mktemp コマンドだったり、awk での文字列操作が出てきて戸惑ってしまいますね実は user モジュールの password 指定を工夫する事で、この工程を短縮できます
Pythonコードを書かなくても良いのです
新たにpyoユーザを追加するPlaybookとして書きます--- - hosts: target vars: - username: pyo - password: super-ultra-hyper-miracle-passw0rd tasks: - name: Add User user: name: "{{ username }}" password: "{{ password | password_hash('sha512') }}" update_password: on_create become: yespassword 指定部分に追記があります
Hashing filters
Ansible 1.9 から利用できる方法です
password_hash(‘sha512′,’salt’)でsaltを指定できますが、省略した場合はランダムなものが利用されますこの方法なら1taskで実行でき、shellモジュールでPythonコードを書く必要もなくPlaybookとして非常に見通しが良いです
書き手としては、ハッシュ化処理を意識する事なく、 スムーズにユーザ追加処理を書く事ができますいかがでしょうか
次回は実際の利用ケースに寄って、追加ユーザのssh-key の設定と、複数ユーザ追加方法について書いていきます