ansibleでユーザとグループの設定する
イベントリファイルの作成
dev-serverという親グループを作成し、共通設定としてcommon-baseという子グループを作成し、dev-serverを包含させる。
親グループを複数作成し、子グループへ属させことで、実行タスクを振り分けPlayBookの再利用性を高めたいのでこの構成を組む。
[dev-server]
dev002
[common-base:children]
dev-server
マスタープレイブック作成
実行ホストと実行タスクが増えた時に修正が容易になるように、マスタープレイブックはシンプルにする。
今回は1つのymlのみinculuedさせる
---
- include: common-base.yml
グループのプレイブック作成
実行ホストをイベントリで設定したグループを指定し、変数を定義したymlファイルとタスクを定義したymlファイルをinculdeする
---
- hosts: common-base
vars_files:
- ./vars/usergroup.yml
tasks:
- include: ./tasks/user-group-setting.yml
変数定義ファイルの作成
いろいろなサイトをみたところkey名にユーザー名を当てているものがあったが、拡張性が悪くなるので以下のように定義。
usergroup:
user:
name: hoge
group: hoge
uid: 4519
gid: 4519
password: $6$hoge$zOyVU7p6q2aLNjyi7.WZy8sgiSqUPRnQBYruV9iAIdBr5p3tqipt9ZscPHlwe8wBEW91jb4mB2fLGPY7dsRBA/
group:
name: hogegroup
gid: 1919
パスワードの作成
AnsibleのUSERモジュールで設定するパスワードはハッシュ化されたものを記載する必要がある。
以下でハッシュ化して変数ファイルのpasswordに設定
python -c 'import crypt; print crypt.crypt("123456789", "$6$hogehoge$")'
※ pythonではcrypt.crypt("ここにパスワード","$6$ここにハッシュkey")
でHASH化できるのでそれをprintさせて取得する
タスクファイルの作成
構築対象のサーバーの設定をタスクとして定義する。ユーザ作成とグループ作成を行う場合は
userモジュールとgroupモジュールを利用して変数定義ファイルから設定値を取得してユーザとグループを設定する
- name: create group
group: name={{usergroup.group.name}} gid={{usergroup.group.gid}}
- name: add users that join to group (wheel and usergroup)
user: name={{usergroup.user.name}} uid={{usergroup.user.uid}} state=present password={{usergroup.user.password}} groups={{usergroup.user.group}},wheel
- name: user join to other group
user: name={{usergroup.user.name}} append=yes groups={{usergroup.group.name}}
- name: ~/.ssh for users exist
file: path="/home/{{usergroup.user.name}}/.ssh" state=directory owner={{usergroup.user.name}} group={{usergroup.user.group}} mode=0700
実行
テストをして問題ないことを確認したら実行する
シンタックステスト
$ ansible-playbook -i ~/ansible/playbook/common-playbook/staging ~/ansible/playbook/common-playbook/site.yml --syntax-check
実行タスクリストを確認
$ ansible-playbook -i ~/ansible/playbook/common-playbook/staging ~/ansible/playbook/common-playbook/site.yml --list-task
リハーサル(dry-rub)
$ ansible-playbook -i ~/ansible/playbook/common-playbook/staging ~/ansible/playbook/common-playbook/site.yml --check
本番
$ ansible-playbook -i ~/ansible/playbook/common-playbook/staging ~/ansible/playbook/common-playbook/site.yml
参考
http://docs.ansible.com/ansible/playbooks_best_practices.html#top-level-playbooks-are-separated-by-role
http://knowledge.sakura.ad.jp/tech/3084/