テックブログ

技術ネタ

Ansibleで楽にパスワード設定

こんにちは當間です またまたお久しぶりです
中々どうしてブログ担当の順番が回ってこないのですが、マイペースでゆっくりやっていこうと思います

  1. Ansible 2.0 導入
  2. Ansibleでユーザ追加
  3. 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:
hoge

Ansibleでもっと楽にパスワード設定

作成したランダム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: yes

password 指定部分に追記があります

Hashing filters
Ansible 1.9 から利用できる方法です
password_hash(‘sha512′,’salt’)でsaltを指定できますが、省略した場合はランダムなものが利用されます

この方法なら1taskで実行でき、shellモジュールでPythonコードを書く必要もなくPlaybookとして非常に見通しが良いです
書き手としては、ハッシュ化処理を意識する事なく、 スムーズにユーザ追加処理を書く事ができます

いかがでしょうか
次回は実際の利用ケースに寄って、追加ユーザのssh-key の設定と、複数ユーザ追加方法について書いていきます

実績数30,000件!
サーバーやネットワークなど
ITインフラのことならネットアシストへ、
お気軽にご相談ください