前回はアカウントを作成するPlaybookをやってみましたが、
今回はPasswordを一斉に更新するときに使えそうなものを作ってみたいと思います。
よくある、定期的に変更しなさいと言う話を耳にしたりしなかったりしますが、
その際に使いたいと思います。
試した環境
# 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
これで流し込みができました。