Memo

メモ > サーバ > 各論: 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/

Advertisement