メモ > サーバ > 各論: Ansible > Ansibleでrsyncの双方向同期を行う方法
Ansibleでrsyncの双方向同期を行う方法
rsyncでの双方向同期環境をAnsibleで構築する
■準備
Vagrantで3台のサーバを起動
controllerから他2台のサーバにSSH接続できることを確認
# vi /etc/ansible/hosts
2台のサーバが対象となるので、両方のサーバを指定する
[webservers]
192.168.33.11
192.168.33.12
$ ansible all -m ping
$ ansible webservers -m ping
の結果は2台分表示される
Playbookを実行する前のこの時点で、
同期元&同期先でrsyncユーザの「ユーザを作成」「キーを作成」「キーの設定」「接続確認」を行っておくと良さそう
$ cd /var/code/apache_php7_mysql_for_rsync/
$ ansible-playbook site.yml --check
$ ansible-playbook site.yml
の結果は2台分表示される。1台ずつ順番に…ではなく同時に実行される
http://192.168.33.11/
http://192.168.33.12/
それぞれのサーバにブラウザからアクセスできるようになる
■rsync
※ユーザの作成と疎通確認は手動で行っている
※詳細な作業内容は Etcetera.txt の「rsync(一方向同期)」を参考に
すでに同期元&同期先で「ユーザを作成」などができている場合はもちろん作業不要
Ansible: rsyncをインストール
Ansible: 作業領域を作成
同期元&同期先: ユーザを作成
同期元&同期先: キーを作成
同期元&同期先: キーの設定
同期元&同期先: 接続確認(ポート番号は環境に応じて調整する)
# ssh -p 22 rsync@192.168.33.11
$ exit
# rsync -e "ssh -p 22" -avz --delete /var/www/test/html/sync rsync@192.168.33.11:/var/www/test/html
「rsync error: some files/attrs were not transferred」のエラーが表示されるが、以下のようにすれば表示されないみたい
# rsync -e "ssh -p 22" -avzO --delete /var/www/test/html/sync rsync@192.168.33.11:/var/www/test/html
「O」は「ディレクトリのタイムスタンプを保持しない」みたい
rsyncでエラーが出たけどコピーはできてる - ごずろぐ
http://gozuk16.hatenablog.com/entry/2014/09/30/224900
以下でApacheユーザになって /var/www/test/html/sync 内にファイルを作成し、
rootユーザに戻って rsync コマンドで同期して、双方向に手動同期できることを確認する
Ansible: rsyncで双方向自動同期ができるように設定
■補足
必要に応じて、以下などでファイル作成時の権限を調整するといい
# mkdir /var/www/test/html/sync/wordpress
# chown apache. /var/www/test/html/sync/wordpress
# chmod 777 /var/www/test/html/sync/wordpress
# chmod g+s /var/www/test/html/sync/wordpress
Apacheになってファイルの作成確認などをしたい場合、以下でApacheになれる
# su -s /bin/bash - apache
環境によって差はあるかもしれないが、apacheユーザが作成したファイルの初期パーミッションは 644 となる
この状態だと双方向同期先のユーザがファイルを編集できない可能性がある
VagrantのCentOS7.2環境で確認すると、umaskの初期値は
$ umask … vagrantユーザで実行
0002
$ umask … apacheユーザで実行
0022
# umask … rootユーザで実行
0022
となっている
apacheユーザの状態で以下を実行
$ umask 0002
これにより、以下の状態になる
$ umask … apacheユーザで実行
0002
これでapacheユーザが作成したファイルの初期パーミッションは 664 となる(グループに書き込み権限が与えられる)
「{{ inventory_hostname }}」を参照すればサーバのホスト名を取得でき、これをもとにサーバごとに処理を分岐できる
Ansible マジック変数の一覧と内容 - Qiita
https://qiita.com/h2suzuki/items/15609e0de4a2402803e9