ろーてくxyz blog

ローテクを駆使してIT関係でサヴァイヴしようとする人による備忘録

AnsibleでユーザPasswordを変更していくPlaybook.

前回はアカウントを作成するPlaybookをやってみましたが、 今回はPasswordを一斉に更新するときに使えそうなものを作ってみたいと思います。
よくある、定期的に変更しなさいと言う話を耳にしたりしなかったりしますが、 その際に使いたいと思います。

rotek.hateblo.jp

試した環境

# ansible --version
ansible 2.4.1.0

# 対象clientOS
CentOS 6.X

前提条件

  • Root PasswordはAnsibleの管理対象全てで同じ
  • 一般ユーザ系のPasswordも今回は全て同じ(Rootとは別)
  • Inventoryのとあるホストグループ内で同じユーザ名がつかわれている
  • 一部のホストはホスト単体の固有のユーザ名がつかわれている

例なのでセキュリティ的な事はおいておき、 今回はこの前提でPlaybookを書いてみます。

今回の作業対象インベントリイメージと対象のユーザ

[web-servers]
web1 # 変更対象ユーザ:apache
web2 # 変更対象ユーザ:apache

[db-servers]
db1 # 変更対象ユーザ:mysql
db2 # 変更対象ユーザ:mysql
dbb # 変更対象ユーザ:mysql, backup, super.backup

AnsibleのPlaybookのディレクトリ構成

今回はPlaybookは、前提条件のとおり、 ホストグループやホスト単体でのユーザの指定などを行いたい為に、 以下のようなディレクトリ構成を取っています。
group_varsに属するホストをhost_varsで記載した場合は、 そちらの記述が優先されます。(変数の適用優先度があります)

└── Password-change/
    ├── playbook.yml
    ├── host_vars/
    │   └── dbb.yml 
    └── group_vars/
        ├── all.yml
        ├── web-servers.yml
        └── db-servers.yml

yamlの中身

playbook.yml

Rootユーザとgroup_varsもしくはhost_varsに記述された 一般ユーザ名を変数として利用してPasswordを変更していきます。
when: not(users_list is none)は特に必須では無いので無視してください。
(例えば特定のgroup,hostのみRootのPasswordのみ変更の場合は varsでusers_listを定義しなければtaskがskipされます)

---
- hosts: all
  gather_facts: no

  tasks:
  - name: All Passwod Changes application accounts.
    user: name={{  item.name   }} password={{  users_passwd   }} update_password=always
    with_items: '{{ users_list  }}'
    when: not(users_list is none)
    tags: app_user

  - name: All Passwod Changes root account.
    user: name=root password={{  root_passwd   }} update_password=always
    tags: root_user

all.yml

ここにはPasswordをhashを使って記載をしておきます。
python等でもsha512 encryptできますので生成しておきます。

---
# root password
root_passwd: '$6$qnhTULkNL/auiTuxY0'
# users password
users_passwd: '$6$X.zqVHQTlll/QPJ3sn0.'

web-servers.yml

インベントリwebのグループのサーバはrootユーザと apacheユーザのPasswordも変更していきます。

---
users_list:
- name: apache

db-servers.yml

インベントリdbのグループのサーバはrootユーザと mysqlユーザのPasswordも変更していきます。

---
users_list:
- name: mysql

dbb.yml

dbbホストは、インベントリでdbグループに属していますが、 こいつは特殊用途という事で複数のユーザのPasswordを変更する事にします。

---
users_list:
- name: mysql
- name: backup
- name: super.backup

実行

# ansible-playbook playbook.yml
PLAY [all] ***************************************************************************************************************************************************

TASK [All Passwod Changes application accounts.] *************************************************************************************************************
changed: [web1] => (item={u'name': u'apache'})
changed: [web2] => (item={u'name': u'apache'})
changed: [db1] => (item={u'name': u'mysql'})
changed: [db2] => (item={u'name': u'mysql'})
changed: [dbb] => (item={u'name': u'mysql'})
changed: [dbb] => (item={u'name': u'backup'})
changed: [dbb] => (item={u'name': u'super.backup'})

TASK [All Passwod Changes root account.] *********************************************************************************************************************
changed: [db1]
changed: [db2]
changed: [dbb]
changed: [web1]
changed: [web2]

PLAY RECAP ***************************************************************************************************************************************************
db2                         : ok=2    changed=2    unreachable=0    failed=0
dbb                         : ok=2    changed=2    unreachable=0    failed=0
web2                        : ok=2    changed=2    unreachable=0    failed=0
db1                         : ok=2    changed=2    unreachable=0    failed=0
web1                        : ok=2    changed=2    unreachable=0    failed=0

これで流し込みができました。