メモ > サーバ > 各論: Ansible > 検証メモ
検証メモ
■Playbookのリポジトリ管理
Playbookをリポジトリで管理し、「masterは本番環境の設定、developはテスト環境の設定」のようにすると良さそう
ただし「本番環境でのみ、この設定は厳しく」「テスト環境は低スペックなので、この数値は低く」などは発生しそうなので要検証
数値くらいなら設定ファイルに切り出して管理できそうだが、
「本番環境ではRDSとElastiCacheを使う、テスト環境ではローカルのMySQLのみ」
のような場合は構成が大きく変わるので管理しづらいか
インフラに関するテストプログラムは、このリポジトリに含めると良さそう
(タイムアウトのテストやアップロードのテストなど)
その場合、アクセス制限をかけておくのを忘れずに
■Playbookの実行対象指定
以下のように定義しておけば
apache_php_mysql/production
[webservers]
192.168.33.11
192.168.33.12
apache_php_mysql/staging
[webservers]
192.168.34.11
実行時に「-i 実行対象のファイル名」と指定することで
ansible-playbook site.yml … /etc/ansible/hosts で指定した webservers が参照される
ansible-playbook -i production site.yml … apache_php_mysql/production で指定した webservers が参照される
ansible-playbook -i staging site.yml … apache_php_mysql/staging で指定した webservers が参照される
のようにできる
これによって「本番環境のみを対象にする」「本番環境のWeb1のみを対象にする」などの管理ができる
上記は production と staging をファイルとしてプロジェクト直下に置いているが、
フォルダにするかなどはプロジェクトの規模などによって変更するといい
Ansibleのインベントリファイルでステージを切り替える - Qiita
https://qiita.com/NewGyu/items/5de31d76d2488ab27ed6
Ansible の inventory 指定はディレクトリが良い - Qiita
https://qiita.com/prsdnt_hanage/items/447813fb566c1c582849
■Playbookで実行内容を分岐
j2テンプレート内では {{ inventory_hostname }} でサーバごとの分岐を作れる
具体的な例を挙げると、以下のように分岐できる。Playbook実行の際に実行対象を指定する必要も無い
group_vars/webservers.yml
sync:
target1: 192.168.33.11
target2: 192.168.33.12
role-sync/templates/lsyncd.conf.j2
sync {
default.rsync,
source = "/var/www/test/html/sync",
target = "rsync@{% if inventory_hostname == sync.target1 %}{{ sync.target2 }}{% else %}{{ sync.target1 }}{% endif %}:/var/www/test/html/sync",
■Playbookの正しさと冪等性の検証
Playbookを作成&編集したときに「その内容は本当に正しいのか?冪等性は担保されているのか?」を検証する方法の例
CIと組み合わせて
・Playbookを管理するリポジトリにCI用のファイルを含める
・CIから自動でテストできるようにする
・テストを実行すると、Dockerで環境が自動構築され、そこに対してPlaybookを新規実行される。再度実行して冪等性を検証する
のようにする
以下はサンプルリポジトリ。詳細は「Software Design 2018年12月号」の「超速入門Ansible」を参照
Travis CI を使用しているが、今なら CircleCI でいいかもしれない
irixjp/sd2018-ansible-ci: Sample playbooks for SD2018
https://github.com/irixjp/sd2018-ansible-ci
https://github.com/irixjp/sd2018-ansible-ci/blob/master/.travis.yml
https://github.com/irixjp/sd2018-ansible-ci/blob/master/web_svr/tests/test.yml
以下はCircleCIで参考になりそうなサイトのメモ
いまさらだけどCircleCIに入門したので分かりやすくまとめてみた - Qiita
https://qiita.com/gold-kou/items/4c7e62434af455e977c2
CircleCIで出来るコト - Qiita
https://qiita.com/noboru_i/items/7d300eb63ae667bf8dc2
Ansible Playbook の CI をまわす - Qiita
https://qiita.com/toVersus/items/02a7f33f4437bd738bc5
でも今は「Jenkins → CircleCI → Wercker」という流れもあるらしい?
■ロケールの変更
Ansibleのcommandモジュールで冪等性を担保する - goodbyegangsterのブログ
https://goodbyegangster.hatenablog.com/entry/2019/05/02/053303
■スワップの設定
以下が参考になりそう
Ansibleでswap領域を設定する - Qiita
https://qiita.com/youcune/items/ae8ba3a53cd91c490ad6
■設定の書き換え
lineinfile
は必ず書き換えが発生してnginxなどが再起動される?
replace
は書き換えが発生しないみたい
書き換えない場合は changed ではなくすべて ok にしておかないと、余計な変更を加えてしまったときに気づけない
lineinfileの方が柔軟ではあるらしい
Ansibleでファイルの行を書き換える3つの方法 - Qiita
https://qiita.com/cognitom/items/57de72b739642041dcd5
コードフォーマットを統一する
今は一行で書いたり複数行で書いたりが混在している
開発環境の構築用として使うか。テスト環境や本番環境の構築にも使うか
ある程度手動での構築を混在させるか、できる限りコードでの構築を目指すか
■nginxのインストール例
PHP7.1 + Laravel5.x + Nginx + php-fpmな仮想環境構築 - けけずんセルフハッキング
http://kkznch.hatenablog.com/entry/2017/11/28/114958
■EC2での使用例
Ansibleでnginx+php構築 - Qiita
https://qiita.com/uogokoro/items/2c20e0607bac593e61a5
■firewalldの調整
Ansible firewalldを使ってみた - Qiita
https://qiita.com/m0riiiii/items/62340b18fc64b45bd02e
■特殊文字のエスケープ
フィルター - Ansible Documentation
https://docs.ansible.com/ansible/2.9_ja/user_guide/playbooks_filters.html
[Ansible]特殊文字をエスケープ処理する方法 - Qiita
https://qiita.com/nemo-u/items/382ce62eddc858ba359a
■引き続き
・以下などを参考に、汎用的なLAMP環境を試したい
ansible-examples/lamp_simple at master - ansible/ansible-examples
https://github.com/ansible/ansible-examples/tree/master/lamp_simple
・rootで直接操作しているので、vagrantユーザで操作してsudoする…という流れを試したい
・以下などを参考に、Laravel環境の構築を試したい
Vagrant * Ansible Local で Laravel環境を作る|開発室ブログ|株式会社アクセスジャパン
https://access-jp.co.jp/blogs/development/31
・以下も参考になるかも
Ansibleで光の速さのWEBサーバーを光の速さで構成してみる。 - Qiita
https://qiita.com/sak_2/items/7dd3dcd864f93103f0db
AnsibleでNginx+PHP7+mariadb+Let’s encrypt(certbot)+wordpressでwordpress環境を構築 - akashisnの日記
https://blog.akashisn.info/entry/2017/04/03/133423
CentOS 7 に PHP 7.0, nginx, MariaDB を Ansible でインストールする | Serima Blog
https://serima.co/blog/?p=513
ansible/ansible-examples: A few starter examples of ansible playbooks, to show features and how they work together. See http://galaxy.ansible.com for example roles from the Ansible community for deploying many popular applications.
https://github.com/ansible/ansible-examples
AnsibleのRole入門 | DevelopersIO
https://dev.classmethod.jp/server-side/ansible/introduction_about_role/
Ansibleでサーバ毎にユニークな処理を行う - Qiita
https://qiita.com/tanuki_mujina/items/43aa769c2ddc8a3a98f9
Ansible応用編:より実践的なPlaybookを作り上げる | Think IT(シンクイット)
https://thinkit.co.jp/article/9871
・以下はトラブル時の参考になるかも
Ansible 2.7でyum + with_itemsを使うと出る警告の直し方 - Qiita
https://qiita.com/ikemo/items/9b563db81bba1a2fdc94
AnsibleでMySQLの新しいバージョンをインストールしてDB・ユーザ作成する時の注意点 - Qiita
https://qiita.com/bboobbaa/items/d2288724bdefeff1c550
ansible2.1でmysqldをインストールする - ARCHIVESDRIVE HB
https://donbulinux.hatenablog.jp/entry/2016/07/07/184104
Ansible: MariaDB エラー解決法 - 1045, Access denied for user 'root'@'localhost' (using password: YES) - Yukun's Blog
https://yukun.info/ansible-mariadb-access-denied/
Ansible gathering facts でフリーズ | Rutakeの技術メモ
http://blogcdn.rutake.com/techmemo/2017/06/17/ansible-gathering-facts-%E3%81%A7%E3%83%95%E3%83%AA%E3...
■コマンドメモ
起動
cd C:\vagrant\ansible
vagrant up
Playbook実行
cd /var/code/nginx_php_mysql
ansible-playbook site.yml
HTTPアクセス
http://192.168.33.11/
http://192.168.33.11:8080/
終了
cd C:\vagrant\ansible
vagrant halt
破棄
cd C:\vagrant\ansible
vagrant destroy
■AmazonLinux2を試そうとしたときのメモ
# localectl set-locale LANG=ja_JP.UTF-8
# hostnamectl set-hostname deploy.refirio.net
# vi /etc/hosts
# vi /etc/sysconfig/network
# hostnamectl status
# timedatectl set-timezone Asia/Tokyo
# yum -y install yum-fastestmirror
# yum -y update
# yum -y install yum-cron
# systemctl start yum-cron
# systemctl enable yum-cron
# yum -y groupinstall "Base" "Development tools"
HTTPアクセスを試すなら
# yum -y install nginx
# systemctl start nginx
# chkconfig nginx on
# systemctl enable nginx
…と思ったが、Amazon Linux 2 だとyumではインストールできない
AmazonLinux2にNginxを導入する - Qiita
https://qiita.com/ashbrain/items/4de51ff33e4bddf1278b
# amazon-linux-extras list
# amazon-linux-extras install nginx1.12 -y
# systemctl start nginx
# systemctl enable nginx
http://54.64.18.216/
■テスト環境用サーバ
AMI: Amazon Linux AMI
Type: t2.micro
VPC: Develop
Subnet: Develop-DMZ-A
自動割り当てパブリックIP: 有効化
Name: Test1
hostnameを変えてもあまり意味がないか。原則としてデフォルトのままにするか
Ansibleで操作する前に、一番はじめにポート番号だけ変更しておくか
Ansible用の作業ユーザが必要なら、この時点で手動で作るしか無いかも。通常はec2-userなどで良さそう
# vi /etc/ssh/sshd_config
■調整したい箇所
・「owner="apache"」と「owner=apache」のような表記ゆれを統一したい
・yum update の実行をどうするか
「すべてアップデートすると、ミドルウェアの挙動が変わらないか」「そもそもCronで深夜に自動実行すべきでは」を考えれば、自動化に含めるべきでは無いかも
実行結果が頻繁に「changed」となりそうなのも煩わしそう
一度は実行しておきたいので、Ansibleで構築後に一度手動で実行すると良さそう
・Basis.txtの「root宛メールを転送」はまだ含んでいない
これは自動実行の対象にすべきか
php.ini の要領で編集編集できるかも
newaliases は httpd restart などの要領で必要に応じて反映できるかも
メールが飛ぶかどうかは、自動構築後に手動で要テスト
・MySQLのデータベース&ユーザ作成は、Ansibleの実行には含めない方がいいか
そもそもRDSなど外部サーバを使うことも多い
SSHユーザやFTPユーザの追加も、管理に含めないほうがいいか。ユーザ関連はツールで追加されることが多いかも
・SSHのポート番号変更やサーバ自体の再起動も、管理に含めるとややこしそうなので除外すると良さそう
・php.ini の初期値はPHPのバージョンによって差異がある
regexpでの置換設定が意図した動作にならないことがあるが、汎用的なものを作れるか
・apache_php_mysql、apache_php_mysql_for_ec2、apache_php_mysql_for_local、apache_php_mysql_for_rsync
など過去に作成したPlaybookをもとに、現状の手順を整備したい
apache_php7_mysql_for_local の内容が一番先進的かも
・「- name: install mysql」はコメントというより「実行内容のラベル」程度と思って、別途日本語で詳細なコメントを追加する方がいいかも
Ansibleでyum updateした|Ewig Leere(Lab)
http://lab.ewigleere.net/blog/blog_entry/blog_201709/ansible_yum-20170927.html
■その他
インストールすべきものが色々と変わるので、あくまでも「EC2用」に作ることになりそう
「どこの環境でもセットアップできる」は目指さないほうが良さそう
むしろ「EC2用」に作っても実行した時期によって使えるかどうかは変わりそう
新しい環境で実行しても、恐らく「このライブラリは使えないから調整が必要」が出てくる
CentOS6ではMySQLが標準だが、CentOS7ではMariaDBが標準…などもある
MySQLのユーザを手動で作る場合、rootにパスワードなしでログインして以下を実行する
CREATE USER vagrant@localhost IDENTIFIED BY 'abcd1234';
謎エラーが出たが「mysql_upgrade -uroot」で解消できた
MySQLで「Column count of mysql.user is wrong.」というエラーが | 趣味グラマの覚え書き
https://blog.mrym.tv/archives/65
MySQLのインストールは以下も参考になりそう
Amazon Linux2にMySQLクライアントを4バージョンいれてみた。Ansible Playbookを添えて | DevelopersIO
https://dev.classmethod.jp/cloud/aws/amazon-linux2-mysqlclient/