■目次
Ansibleとは環境構築Playbookで構成管理AnsibleでSELinuxを無効化する方法Ansibleでロケールを作成する方法Ansibleでrsyncの双方向同期を行う方法ローカルで検証EC2で検証EC2 テスト用サーバ構築メモEC2 環境構築メモトラブル検証メモ
■Ansibleとは
構成管理ツール あらかじめ用意しておいた設定ファイルに従って、 ソフトウェアのインストールや設定ファイルの修正、サービスの起動/停止、ネットワーク設定 といったサーバーの各種設定を自動的に実行する 以下の特徴がある ・エージェントレス ・Pythonで書かれている ・設定ファイルが少なく記述がシンプル 「エージェントレス」というのは、設定したいサーバに専用ツールをインストールしなくても使える、ということ この場合、Ansibleを実行するサーバを別途用意しておき、SSH経由で対象サーバを自動操作する (自身にAnsibleをインストールして、自身を操作する…という使い方もできる) サーバ構築を自動化するツールではあるが、構築するためのコードを作成するのはそれなりに手間がかかる また、「CentOS7では動いたのにAmazonLinuxでは動かない」などは珍しくない どちらかといえば「サーバの構築内容をコード化することでGit管理を可能とし、変更履歴を管理できるようになる」という面が大きい サーバ手動構築とAnsibleでの自動構築を、ある程度把握している人がコードをメンテナンスし続ける必要はある 「これがあれば何も知らなくてもサーバを立ち上げられるツール」では無いが、 「比較的単純な似たようなサーバを何度も構築する」場合には作業効率が飛躍的に上がる 他の手段として「シェルスクリプトで管理する」「ChefやPuppetなど他のツールを使う」などが考えられるが、 Ansibleは ・操作対象サーバに何もインストールしなくても使える ・RedHatがメンテナンスしている ・YAMLでシンプルに記述できる という点で広く使われるようになってきている ■参考ページ Ansible is Simple IT Automation https://www.ansible.com/ Ansibleをはじめる人に。 - Qiita https://qiita.com/t_nakayama0714/items/fe55ee56d6446f67113c エージェントレスでシンプルな構成管理ツール「Ansible」入門 | さくらのナレッジ https://knowledge.sakura.ad.jp/3124/ マンガでわかるAnsible https://redhat.lookbookhq.com/jp_ansible_comic/ansible_manga_2 ある程度慣れたら、改めて以下を読んで内容を整理したい Ansible実践入門 | DevelopersIO https://dev.classmethod.jp/server-side/ansible/practice_ansible/ Ansibleで始めるインフラ構築自動化 https://www.slideshare.net/dcubeio/ansible-72056386 WebUI版として Ansbile AWX もある Ansible AWX をインストールしてみよう | DevelopersIO https://dev.classmethod.jp/server-side/ansible/rk-20180220-ansible-awx/ Ansible AWXを使ってみよう! | DevelopersIO https://dev.classmethod.jp/server-side/ansible/ansible-awx_rk-20180225/ サービスごとに分散してしまった Ansible のコードを共通化する - WILLGATE tech blog https://tech.willgate.co.jp/entry/2019/04/10/115500 無理をしないansible - Qiita https://qiita.com/suicacello/items/ab5c80cb52bb9ff92704 「Infrastructure as Codeに疲れたので、僕たちが本来やりたかったことを整理する」を1年掛けて整理した https://medium.com/@shogomuranushi/infrastructure-as-code%E3%81%AB%E7%96%B2%E3%82%8C%E3%81%9F%E3%81%... AnsibleとVagrantで開発環境を構築する | さくらのナレッジ https://knowledge.sakura.ad.jp/2882/ Ansibleで始めるインフラ構築自動化 https://www.slideshare.net/dcubeio/ansible-72056386 DockerとAnsibleの使い分けを手探りで考えてみた - Taste of Tech Topics http://acro-engineer.hatenablog.com/entry/2015/12/01/120500 GitHub - ansible/ansible-examples https://github.com/ansible/ansible-examples ■シンプルな使い方 自分自身に対してAnsibleを実行できる Ansible自体のインストールと設定は手動で行う必要があるが、それ以降はコード化できる ■より高度な使い方 Ansible実行用に専用のサーバを建て、そこからリモートサーバを一から構築することもできる (サーバに接続するための設定を、最初に行う必要はある) サーバ構築を完全にコードで制御することもできるが、 ただし ・ポート番号の変更など、一筋縄ではいかないものがある ・Ansibleが対応していない(Amazon Linux 2のExtrasリポジトリなど)機能がある ・手動で設定すれば一瞬でも、コード化するとなると難しい場合がある ・例えば4台のWebサーバが動いているサービスでも、その4台のサーバ設定を同時に書き換えることができる ただし間違ったコードを反映すると「4台同時にサーバが停止する」という事態になる などがあるので注意 ■無理をしない構築 手間を考えずに理想を追求すれば、恐らく ・Ansible実行用に専用のサーバを建てる ・Webサーバなどを半分ずつ一斉設定できるように、などの仕組みを作る ・AnsibleのコードテストのためにCIを用意し、Gitにプッシュすると自動でテストを走らせる のような運用方法になると思われる ただし会社の規模によっては、毎回これをやるのはなかなか大変。だと思っている 最先端を追うなら「DockerをAWSなどのマネージドサービスで本番運用」だと思われるが、 サービスが乱立している最中(と思っている)なのでまだ手を出していない AWSだけでも「Docker自前運用」「ECS」「Fargate」「Kubernetes自前運用」「EKS」などの選択肢がある いくつかは、1年後には早くも負債となっている可能性があるのでは 小規模な会社での最適な方法は何か、は日々考え中 ポート番号の変更やExtrasリポジトリなど、最低限の操作を手動で対応し、その後Ansibleで自動構築する …という手段が現実的だと思われるのでそうしている Ansible実行用サーバを用意して一括設定もできるが、 直近の案件では 「それぞれのサーバ内にAnsibleをインストールして、内部で1台ずつ実行する。都度結果も確認してから次へ行く」 としている 本番環境と検収環境と開発環境、同じリポジトリで管理する方法を目指したが難しそう 「検収環境はサーバの都合で特殊な設定が必要」「検収環境は他案件も含まれたサーバ」 などは珍しくないので、リポジトリ自体を分ける方がスムーズと思われる 特殊な設定を行う一台きりのサーバなら、手動で設定することも考える 「似たようなサーバを短期に大量に立ち上げて、しばらく管理し続ける必要がある」 という場合に、Ansibleは力を発揮する。と思っている Gitからのプログラム配置と設定、データベースと作業ユーザの作成 …などもAnsibleで自動化することは不可能では無いが、それらは別管理とする方が無難。と思っている コード化&自動化にこだわりすぎると、逆にメンテナンスが難しくなるので注意 Ansible自体が負債の技術となる可能性も常に考えておく すでに構築されているサーバの場合、過去のやりかたを踏襲している ■作成済みPlaybook Ansibleの理解がある程度進んだ後、以下に使いまわし用のPlaybookを作成した サーバは1台だけ立ち上げて、自身のサーバを操作する方式としている refirio/ansible-apache_php7_mariadb https://github.com/refirio/ansible-apache_php7_mariadb refirio/ansible-nginx_php7_mariadb https://github.com/refirio/ansible-nginx_php7_mariadb refirio/ansible-eccube https://github.com/refirio/ansible-eccube
■環境構築
■Vagrant起動 ※サーバを2台立ち上げ、一方のサーバからもう一方のサーバを操作する例 1台だけ立ち上げて、自身のサーバを操作する場合はこのファイルの「ローカルで検証」を参照 以下のようにVagrantfileを作成する
Vagrant.configure(2) do |config| config.vm.box = "centos72" config.vm.box_check_update = false config.vm.define "controller" do |node| node.vm.hostname = "controller.localhost" node.vm.synced_folder "./controller", "/var/code" node.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2210 node.vm.network "private_network", ip: "192.168.33.10" end config.vm.define "target" do |node| node.vm.hostname = "target.localhost" node.vm.synced_folder "./target", "/var/code" node.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2211 node.vm.network "private_network", ip: "192.168.33.11" end end
通常通り vagrant up を実行すると、controller と target の2台サーバが起動される それぞれ以下でアクセスできる(起動直後はもちろん、HTTPではアクセスできない) ポート: 2210 鍵: C:/vagrant/multi/.vagrant/machines/controller/virtualbox/private_key ポート: 2211 鍵: C:/vagrant/multi/.vagrant/machines/target/virtualbox/private_key http://192.168.33.10/ http://192.168.33.11/ なお、このサーバは vagrant halt のコマンドで停止することができ、 vagrant destroy のコマンドで破棄することができる その後再度 vagrant up を実行すると、再度まっさらなサーバを起動できる ■controllerからtargetへのSSH接続を確認 $ hostname controller.localhost $ ssh -p 22 vagrant@192.168.33.11 … targetに接続 The authenticity of host '192.168.33.11 (192.168.33.11)' can't be established. ECDSA key fingerprint is 7a:f6:47:1b:a9:04:c8:c6:90:d5:8c:48:14:03:d3:64. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.33.11' (ECDSA) to the list of known hosts. vagrant@192.168.33.11's password: vagrant Last login: Tue Sep 18 13:21:48 2018 from 10.0.2.2 $ hostname target.localhost $ exit … targetから抜ける 以降、すべてcontrollerでの操作 ■Ansibleのインストール $ sudo su - 環境によってはSELinuxが有効になっているので、あらかじめ無効化しておく必要がある Ansibleで無効化する方法は、後述の「SELinuxを無効化」を参照 # getenforce Enforcing … SELinuxが有効 # setenforce 0 … SELinuxを無効化 # getenforce Permissive … SELinuxが無効 # vi /etc/sysconfig/selinux
#SELINUX=enforcing SELINUX=disabled … システム起動時にSELinuxを無効化
環境によっては、epel-release を先にインストールする必要がある # yum -y install epel-release 以下の手順でAnsibleをインストールできる # python --version … Python2.6以降がインストールされていることを確認 Python 2.7.5 # yum -y install ansible … Ansibleをインストール # ansible --version ansible 2.7.1 … 以下の手順は2.7の際に作成したが、2.8でも変化は同じように使えるみたい # exit ※管理対象のサーバにもPython2.4以降が必要 ■Ansibleの接続テスト(vagrantユーザでの接続) $ ssh-keygen -t rsa … RSAで鍵を作成。デフォルトの場所に作成。今回パスフレーズは入力しない $ ssh-copy-id vagrant@192.168.33.11 … 対象サーバに公開鍵を渡す(渡す際に vagrant のパスワードを入力する) $ ssh vagrant@192.168.33.11 … targetに接続(パスワード無しで接続できる) $ exit … targetから抜ける Linuxコマンド【 ssh-keygen 】認証用の鍵を生成 - Linux入門 - Webkaru https://webkaru.net/linux/ssh-keygen-command/ ssh-copy-idで公開鍵を渡す - Qiita https://qiita.com/kentarosasaki/items/aa319e735a0b9660f1f0 ■管理対象の登録 $ sudo su - # vi /etc/ansible/hosts … webserversの項目と、管理対象のIPアドレスを追加
[webservers] 192.168.33.11
# exit ■疎通確認 $ ansible all -m ping … vagrantユーザで、すべてのサーバにPINGを実行 192.168.33.11 | SUCCESS => { "changed": false, "ping": "pong" } $ ansible webservers -m ping … WebサーバにPINGを実行 $ ansible webservers -a "/bin/date" … 日時を表示する場合 $ ansible webservers -m copy -a "src=/home/vagrant/from.txt dest=/home/vagrant/to.txt" … ファイルを転送する場合(from.txt はあらかじめ作成しておく) $ ansible webservers -a "mkdir /home/vagrant/test" … ディレクトリを作成する場合 ※「-m」オプションは「指定したモジュールを実行」の意味 「-a」オプションは「指定したコマンドを実行」の意味 ※「"mkdir /root/test"」の指定で実行はできるが、「fileモジュールを使いましょう」と表示される fileモジュールを使って後述のPlaybookを記述すると、変更がない場合はディレクトリの再作成は行われない ただし自力でコマンドを記述していると、実行のたびにディレクトリは再作成される 冪等性を保つためにも、可能なものは用意されているモジュールを使うことを推奨 ただし、shellモジュールやcommandモジュールはAnsible側で冪等性を担保できないため、利用には注意が必要 ここまで来れば、Ansibleでサーバを操作できる サーバの操作は1コマンドごと実行することもできるが、Playbookと呼ばれるファイルに作業内容をまとめて実行するといい
■Playbookで構成管理
Playbookにサーバの状態を定義しておけば、それに沿ってサーバが構成される 内容はテキストファイルなので、このファイル自体をGitで管理することもできる ■Playbookを試す $ mkdir ansible $ mkdir ansible/group_vars $ vi ansible/group_vars/webservers.yml … 変数を定義する
message: "Hello Ansible !" fruits: apples: amount: 10 bananas: amount: 20 oranges: amount: 30
$ vi ansible/test.yml … 実行内容を定義する
- hosts: webservers user: vagrant tasks: - name: output message. debug: msg="{{ message }}" - name: output fruits debug: msg="We want {{ item.value.amount }} {{ item.key }} !" with_dict: "{{ fruits }}"
$ ansible-playbook ansible/test.yml … Playbookを指定して実行 PLAY [webservers] ************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************* ok: [192.168.33.11] TASK [output message.] ********************************************************************************************************************************* ok: [192.168.33.11] => { "msg": "Hello Ansible !" } TASK [output fruits] *********************************************************************************************************************************** ok: [192.168.33.11] => (item={'value': {u'amount': 10}, 'key': u'apples'}) => { "msg": "We want 10 apples !" } ok: [192.168.33.11] => (item={'value': {u'amount': 30}, 'key': u'oranges'}) => { "msg": "We want 30 oranges !" } ok: [192.168.33.11] => (item={'value': {u'amount': 20}, 'key': u'bananas'}) => { "msg": "We want 20 bananas !" } PLAY RECAP ********************************************************************************************************************************************* 192.168.33.11 : ok=3 changed=0 unreachable=0 failed=0 ■色々な機能を試す $ vi ansible/group_vars/webservers.yml … 変数を定義する
message: "Hello Ansible !" fruits: apples: amount: 10 bananas: amount: 20 oranges: amount: 30
$ mkdir ansible/files $ vi ansible/files/hoge.txt … 静的ファイルを配置する
hoge hoge
$ mkdir ansible/templates $ vi ansible/templates/fuga.txt.j2 … 動的ファイルを配置する
This is a jinja template file. {{ message }} jinja template can extract variables. like, ... {% for key,value in fruits.iteritems() %} We want {{ value.amount }} {{ key }} ! {% endfor %}
$ vi ansible/site.yml … 実行内容を定義する
- hosts: webservers user: vagrant become: yes become_user: root tasks: - name: install packages from yum yum: name: - jq - ruby - httpd - name: register cron job cron: name="check ping" day="*/2" hour="12" minute="0" job="ping -c 3 192.168.33.10" - name: create directories file: path={{ item.path }} owner={{ item.owner }} group={{ item.group }} mode=0{{ item.mode }} state=directory with_items: - { "path":"/opt/ansible", "owner":"root", "group":"root", "mode":"755" } - { "path":"/opt/vagrant", "owner":"vagrant", "group":"vagrant", "mode":"755" } - name: copy files copy: src=files/hoge.txt dest=/opt/ansible/hoge.txt owner=root group=root mode=0755 - name: copy template files template: src=templates/fuga.txt.j2 dest=/opt/ansible/fuga.txt owner=root group=root mode=0755
become と become_user により、rootになって作業ができる Ansible1.9からはsudo/suの代わりにbecomeを使う - Qiita https://qiita.com/imoyoukan/items/12832aecd956d14b03f5 $ cd ansible $ ansible-playbook site.yml --check … Playbookを指定してチェックモードで実行 $ ansible-playbook site.yml --check -v … Playbookを指定してチェックモードで実行(詳細なメッセージを表示) $ ansible-playbook site.yml --check -vv … Playbookを指定してチェックモードで実行(もっと詳細なメッセージを表示) $ ansible-playbook site.yml --check -vvv … Playbookを指定してチェックモードで実行(もっともっと詳細なメッセージを表示) $ ansible-playbook site.yml … Playbookを指定して実行 ※「--check」を付けると、実際のサーバ設定を変更しない。処理内容のチェックのみ行う ただし「httpdをインストールしてからhttpd.confを編集する」というPlaybookがあった場合、 チェックモードだと実際にhttpdはインストールされないため、「httpd.confを編集できません」というエラーになるので注意 このエラーは「こういうものだ」として妥協すべきなのか、なにか対応方法があるのかは要調査 PLAY [webservers] ************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************* ok: [192.168.33.11] TASK [install packages from yum] *********************************************************************************************************************** changed: [192.168.33.11] TASK [register cron job] ******************************************************************************************************************************* changed: [192.168.33.11] TASK [create directories] ****************************************************************************************************************************** changed: [192.168.33.11] => (item={u'owner': u'root', u'path': u'/opt/ansible', u'group': u'root', u'mode': u'755'}) changed: [192.168.33.11] => (item={u'owner': u'vagrant', u'path': u'/opt/vagrant', u'group': u'vagrant', u'mode': u'755'}) TASK [copy files] ************************************************************************************************************************************** changed: [192.168.33.11] TASK [copy template files] ***************************************************************************************************************************** changed: [192.168.33.11] PLAY RECAP ********************************************************************************************************************************************* 192.168.33.11 : ok=6 changed=5 unreachable=0 failed=0 [vagrant@controller ansible]$ ansible-playbook site.yml PLAY [webservers] ************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************* ok: [192.168.33.11] TASK [install packages from yum] *********************************************************************************************************************** changed: [192.168.33.11] TASK [register cron job] ******************************************************************************************************************************* changed: [192.168.33.11] TASK [create directories] ****************************************************************************************************************************** changed: [192.168.33.11] => (item={u'owner': u'root', u'path': u'/opt/ansible', u'group': u'root', u'mode': u'755'}) changed: [192.168.33.11] => (item={u'owner': u'vagrant', u'path': u'/opt/vagrant', u'group': u'vagrant', u'mode': u'755'}) TASK [copy files] ************************************************************************************************************************************** changed: [192.168.33.11] TASK [copy template files] ***************************************************************************************************************************** changed: [192.168.33.11] PLAY RECAP ********************************************************************************************************************************************* 192.168.33.11 : ok=6 changed=5 unreachable=0 failed=0 site.yml でCronの実行間隔を変更してから再度 ansible-playbook を実行すると、target サーバのCron設定も書き換わった target サーバでCronの設定を編集してから再度 ansible-playbook を実行すると、編集内容を残して再度設定が追加された なお上記の「register cron job」の方法でCronを登録した場合、target サーバの /var/spool/cron/root に登録された ■roleでファイル分割 「サーバの基本設定」「Webサーバに関する設定」「DBサーバに関する設定」 などで分割することにより、管理をしやすくなる $ cd $ vi ansible/site.yml … メイン処理を定義
- hosts: webservers user: vagrant become: yes become_user: root tasks: - name: register cron job cron: name="check ping" day="*/2" hour="12" minute="0" job="ping -c 3 192.168.33.10" roles: - role-common - role-web
$ mkdir -p ansible/role-common/tasks $ vi ansible/role-common/tasks/main.yml … rolesに指定した名前内の /tasks/main.yml が実行される
- name: install packages from yum yum: name: - jq - ruby - name: create directories file: path={{ item.path }} owner={{ item.owner }} group={{ item.group }} mode=0{{ item.mode }} state=directory with_items: - { "path":"/opt/ansible", "owner":"root", "group":"root", "mode":"755" } - { "path":"/opt/vagrant", "owner":"vagrant", "group":"vagrant", "mode":"755" } - name: copy files copy: src=files/hoge.txt dest=/opt/ansible/hoge.txt owner=root group=root mode=0755
$ mkdir -p ansible/role-web/tasks $ vi ansible/role-web/tasks/main.yml … rolesに指定した名前内の /tasks/main.yml が実行される
- name: install packages from yum yum: name: - httpd - name: copy template files template: src=templates/fuga.txt.j2 dest=/opt/ansible/fuga.txt owner=root group=root mode=0755
$ cd ansible $ ansible-playbook site.yml … Playbookを指定して実行 $ vi role-web/tasks/main.yml … 編集してみる
- name: install packages from yum yum: name: - httpd - name: http service state … 追加 service: name=httpd state=started enabled=yes … 追加 - name: copy template files template: src=templates/fuga.txt.j2 dest=/opt/ansible/fuga.txt owner=root group=root mode=0755
$ ansible-playbook site.yml … Playbookを指定して実行(HTTPDが起動する) HTTPDが起動したので、ブラウザから以下にアクセスできる http://192.168.33.11/ ■notifyでhandlersを呼び出す 「この処理が実行された場合にのみ、あの処理を実行する」ができる 例えば「my.cnfの設定を変更した場合のみ、MySQLを再起動する」など $ cd .. $ vi ansible/role-common/tasks/main.yml
- name: copy files copy: src=files/hoge.txt dest=/opt/ansible/hoge.txt owner=root group=root mode=0755 notify: - copy files handler
$ mkdir -p ansible/role-web/handlers $ vi ansible/role-web/handlers/main.yml … role-webのハンドラを指定する
- name: copy files handler copy: src=files/hoge.txt dest=/opt/ansible/hoge_handler.txt owner=root group=root mode=0755
$ cd ansible $ ansible-playbook site.yml … Playbookを指定して実行(files/hoge.txt を /opt/ansible/hoge.txt へ複製する際、ファイルに変化があると /opt/ansible/hoge_handler.txt にも複製される) Ansibleでhandlersとnotifyをつかってみる - かべぎわブログ https://www.kabegiwablog.com/entry/2018/03/06/090000 ■コメント 「#」から始まる行はコメントとして扱われる
■AnsibleでSELinuxを無効化する方法
Ansible入門者向け学習ガイド(CentOS編) | 株式会社アイティードゥ http://c.itdo.jp/technical-information/ansible/ansible-tutorial/ ■Playbook
- name: disable selinux selinux: state: disabled policy: targeted
■実行結果 $ ansible-playbook site.yml --connection=local PLAY [setup the webservers] *********************************************************************************************************************** TASK [Gathering Facts] **************************************************************************************************************************** ok: [127.0.0.1] TASK [role-common : disable selinux] ************************************************************************************************************** [WARNING]: SELinux state temporarily changed from 'enforcing' to 'permissive'. State change will take effect next reboot. changed: [127.0.0.1] PLAY RECAP **************************************************************************************************************************************** 127.0.0.1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 SELinuxについて「State change will take effect next reboot.」とWARNINGが表示されているが、 再起動しなくても公開ディレクトリは /var/www/main/html に変更できた 再起動しないとWARNINGは表示されたままだが、再起動すると表示されなくなった
■Ansibleでロケールを作成する方法
- name: create locale command: localedef -f UTF-8 -i ja_JP ja_JP when: "'LANG=ja_JP.UTF-8' not in localectl_result.stdout"
Ansibleのcommandモジュールで冪等性を担保する - goodbyegangsterのブログ https://goodbyegangster.hatenablog.com/entry/2019/05/02/053303 Ansible で コマンド実行結果の特定文字列有無で処理をスキップしたり、エラー(failed)させる 〜 セキュリティパッチ当てのサンプルプレイブック(block:/rescue:/always:有り)で検証 - Qiita https://qiita.com/tbuchi888/items/6807894368ad5b2a874d
■Ansibleでrsyncの双方向同期を行う方法
rsyncでの双方向同期環境をAnsibleで構築する ■準備 Vagrantで3台のサーバを起動 controllerから他2台のサーバにSSH接続できることを確認 # vi /etc/ansible/hosts
[webservers] 192.168.33.11 192.168.33.12
2台のサーバが対象となるので、両方のサーバを指定する $ 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
■ローカルで検証
自分自身に対してAnsibleを実行する方法 Ansible自体のインストールと設定は手動で行う必要があるが、それ以降はコード化できる ■Vagrant起動 Vagrantは、通常の方法で1台だけ起動すれば十分 ■Ansibleをインストール $ sudo su - # yum -y install ansible # vi /etc/ansible/hosts … ファイルの最後に追記
[localhost] 127.0.0.1
# exit $ ansible localhost -m ping --connection=local ... ローカル環境へPING(「--connection=local」が無ければ 127.0.0.1 へ認証しようとする) ■Playbookの修正 ローカル接続用に、以下のように修正しておく site.yml
- name: setup the webservers hosts: localhost ... localhost(後に定義)へ接続 # user: "{{ ssh.username }}" ... ローカル環境へ接続するので不要 become: yes become_user: root roles: - role-common - role-web - role-db
group_vars/localhost.yml
title: "local: Apache+PHP+MySQL" #ssh: ... ローカル環境へ接続するので不要 # username: vagrant ... ローカル環境へ接続するので不要 web: username: vagrant
■Ansibleを実行 $ cd /var/code/apache_php_mysql_for_local $ ansible-playbook site.yml --connection=local ... ローカル環境へ実行(「--connection=local」が無ければ 127.0.0.1 へ認証しようとしてしまう) 以下でアクセスできる http://192.168.33.10/ ■MySQLを使用する場合 AnsibleでMySQLをインストール済みでユーザは未作成の場合、以下のようにして作成できる # mysql -u root -p mysql> GRANT ALL PRIVILEGES ON test.* TO webmaster@localhost IDENTIFIED BY 'gV0+8k6BM#z7'; mysql> FLUSH PRIVILEGES; mysql> CREATE DATABASE test DEFAULT CHARACTER SET utf8mb4; … データベースも作成する場合 mysql> QUIT; # mysql -u webmaster -p 以下で動作確認できる # vi /var/www/test/html/mysql.php
<?php try { $pdo = new PDO( 'mysql:dbname=test;host=localhost', 'webmaster', 'gV0+8k6BM#z7' ); $stmt = $pdo->query('SELECT NOW() AS now;'); $data = $stmt->fetch(PDO::FETCH_ASSOC); echo "<p>" . $data['now'] . "</p>\n"; $pdo = null; } catch (PDOException $e) { exit($e->getMessage()); }
■バーチャルホストを使用する場合(もちろんAnsibleで操作するのも有効) C:/windows/System32/drivers/etc/hosts … hostsファイルを編集
192.168.33.10 vagrant.local 192.168.33.10 test.vagrant.local
# vi /etc/httpd/conf.d/virtualhost.conf
<VirtualHost *:80> ServerName vagrant.local DocumentRoot /var/www/test/html <Directory "/var/www/test/html"> Options Includes ExecCGI FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> <VirtualHost *:80> ServerName test.vagrant.local DocumentRoot /var/www/vhosts/test/html <Directory "/var/www/vhosts/test/html"> Options Includes ExecCGI FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost>
# systemctl restart httpd # vi /var/www/vhosts/test/html/index.php … もしくは C:\vagrant\centos7\code\test\html\index.php を編集 ■その他 以下は必要に応じて手動で実行する方がスムーズか ・yum update ・「root宛メールを転送」 ・SSHのユーザ作成 ・MySQLのデータベース&ユーザ作成 ■参考 ansibleで自分自身(localhost)を制御する場合はlocalで - Qiita https://qiita.com/hotta/items/47a432edacdfbd6a3e3e
■EC2で検証
AmazonLinux2にNginxを導入する - Qiita https://qiita.com/ashbrain/items/4de51ff33e4bddf1278b Using Ansible on AWS - EC2インスタンスを作成する | DevelopersIO https://dev.classmethod.jp/cloud/aws/using-ansible-on-aws/ 想ひ出14: Amazon Linux2でAnsibleがコケたじゃん? | 想ひ出のへっぽこBlog from35 http://moqrin3.de/2018/09/27/post-311/ Amazon EC2にAnsibleのコマンド一発でWordPress環境を作った話 - Qiita https://qiita.com/rednes/items/5b95a26749217d269ab5 [速報]5年長期サポートのAmazon Linux 2が一般公開されました | DevelopersIO https://dev.classmethod.jp/cloud/aws/amazon-linux-2-lts-ga/ AWSが「Amazon Linux 2」の正式版を公開、5年間の長期サポート(LTS)が付属:Amazon EC2に最適化、オンプレミスでの開発、テストにも使用可能 - @IT http://www.atmarkit.co.jp/ait/articles/1807/02/news103.html AWSのEC2で行うAmazon Linux2の初期設定 - Qiita https://qiita.com/2no553/items/e87485e3fc4199bd5dcb ■Playbook nginx_php_mysql\site.yml の以下の部分を本番環境に合わせて書き換える ユーザ名は設定ファイルに移動させるほうが良さそう /var/www/html/index.php の所有者部分は、専用の設定にする方が良さそう MySQLのユーザ名などは設定ファイルから削除しておく
- name: setup the webservers hosts: webservers user: ec2-user ... EC2用に変更した例
ansible-playbookのremote_userの設定について - Qiita https://qiita.com/drwtsn64/items/e3f32aef77f04b1cf259 nginx_php_mysql\role-web\tasks\main.yml
- name: create the index file template: src=role-web/templates/index.php.j2 dest=/var/www/html/index.php owner=ec2-user group=ec2-user mode=0644 ... EC2用に変更した例
nginx_php_mysql\role-db\tasks\main.yml
- name: install mysql yum: name: - mariadb-server - MySQL-python インストールするものは以下のように変更した - name: install mysql yum: name: - mysql56-server - MySQL-python27
AnsibleでAmazon LinuxにMySQL5.6とMySQL-pythonをインストールする - Qiita https://qiita.com/kotaroito/items/5b2dc270ea7a109ea8ca C:\vagrant\ansible\controller\nginx_php_mysql\role-db\handlers\main.yml
- name: restart mysql service: name=mariadb state=restarted ↓ - name: restart mysql service: name=mysqld state=restarted
■EC2 テスト用サーバ構築メモ
AMI: Amazon Linux 2 AMI Type: t2.micro VPC: Study Subnet: Study-Trust-A 自動割り当てパブリックIP: 有効化 ※テストとして test_ansible_controller と test_ansible_target という名前を付けた test_ansible_controller にAnsibleをインストールし、test_ansible_target を自動設定する ■初期設定 デプロイ用サーバを basis.txt をもとに設定 デプロイ用サーバのIPアドレス(EIPではないので、サーバを停止させると変わる) 3.112.57.115 ■デプロイ対象サーバに接続 あらかじめ、対象サーバの22番ポートをIP制限つきで空けておく(デプロイ用サーバのIPを許可する) デプロイ用サーバで以下の設定を行う $ vi /home/ec2-user/.ssh/id_rsa
AWS.pem の内容を貼り付け
$ chmod 600 /home/ec2-user/.ssh/id_rsa $ ssh -p 22 -i /home/ec2-user/.ssh/id_rsa ec2-user@3.112.57.115 $ ssh ec2-user@3.112.57.115 ■Ansibleインストール Amazon Linux 2 以外の場合、以下の手順でインストールできる # yum -y install ansible --enablerepo=epel # ansible --version Amazon Linux 2 の場合、Extrasリポジトリからインストールできる バージョンが低いのは一応注意だが、2.7用に作成したPlaybookは問題なく動いた # amazon-linux-extras list # amazon-linux-extras install ansible2 -y # ansible --version ansible 2.4.6.0 # vi /etc/ansible/hosts
[webservers] 3.112.57.115
接続確認 $ ansible all -m ping $ ansible webservers -m ping ■ポートの変更(必要に応じて) デプロイ先にSSH接続し、ポートを10022に変更しておく デプロイ対象のファイヤーウォールを調整(デプロイサーバからのSSHアクセスを許可する) 以降はデプロイ用サーバから操作 接続確認 $ ssh -p 10022 ec2-user@3.112.57.115 以下にデプロイ対象のIPアドレスとポートを追加 # vi /etc/ansible/hosts
[webservers] 3.112.57.115:10022
接続確認 $ ansible all -m ping $ ansible webservers -m ping ■デプロイ 以下にAnsible用のファイルを配置 /home/ec2-user/ansible/apache_php_mysql Ansibleを実行 $ cd /home/ec2-user/ansible/apache_php_mysql $ ansible-playbook site.yml 接続確認 http://3.112.57.115/ http://3.112.57.115:8080/ ■追加の手順例 php.ini をきちんと調整したり(Playbook) MySQLのユーザを作成したり(手動で作成すべきかも) など、引き続き調整する ■参考 Vagrant+ansibleでLAMP環境構築(4) - Qiita https://qiita.com/k-serenade/items/0ab59f9563493f0cf293 ansibleでphp composerをインストール - Qiita https://qiita.com/oppara/items/4bb65607bb40e6ac4814 ディレクトリのグループだけ変えたい場合はどうするか commandを使うと冪等性を保てないようなので、以下のようにするか - name: change group session directory file: path=/var/lib/php/session state=directory group=nginx はじめてAnsibleを使う人が知っておきたい7つのモジュール | 株式会社インフィニットループ技術ブログ https://www.infiniteloop.co.jp/blog/2013/08/ansible/ AnsibleのScriptモジュールで冪等性をいい感じに担保したい - Qiita https://qiita.com/Gustav/items/cbc937cfdfb1ba6efd42 [Ansible] ディレクトリが無かったら作成する - Qiita https://qiita.com/hnakamur/items/b5a17d8cb289432014d5
■EC2 環境構築メモ
バーチャルホスト、PHP7のインストール、php.iniの編集、Composerのインストール などを終えれば、以降はDeployerなど別ツールの担当となるはず いったん以降は手動で作業する(nginxユーザになってLaravelのインストールを行う) /var/www/vhosts/laravel はいったん削除し、改めて laravel という名前でプロジェクトを作成する ■データベースにユーザを作成(手動) >CREATE USER laravel@localhost IDENTIFIED BY 'hYe82BepQJ'; >CREATE DATABASE laravel DEFAULT CHARACTER SET utf8mb4; >GRANT ALL PRIVILEGES ON `laravel`.* TO laravel@localhost IDENTIFIED BY 'hYe82BepQJ'; Laravelプロジェクトを作成する場合 composer create-project --prefer-dist "laravel/laravel=5.5.*" laravel 完了したらDNS(Route53)を設定する ■nginx用の鍵を作成 $ cd $ mkdir /var/lib/nginx/.ssh $ chown -R nginx:nginx /var/lib/nginx/.ssh/ $ ssh-keygen -t rsa $ vi /var/lib/nginx/.ssh/id_rsa $ vi /var/lib/nginx/.ssh/id_rsa.pub ■Cron $ sudo su -s /bin/bash - nginx $ cd /var/www/vhosts/laravel $ git clone git@bitbucket.org:test/web.git /var/www/vhosts/laravel $ git pull $ git checkout develop デプロイできたら、引き続き以下のように設定 $ cd /var/www/vhosts/laravel $ cp .env.local .env $ vi .env $ composer install ひととおり完了したら、あとは以下のコマンドで最新のコードを取得 $ git pull
■トラブル
■OSにログインするたびに「LC_CTYPE: cannot change locale」のようなエラーが表示される trouble.txt の同項目を参照 Ansibleで無効化する方法は、このファイル内の「ロケールの作成」を参照 ■MySQLの起動失敗 初回構築時にMySQLのユーザやデータベースも作成しようとするとエラーになってMySQLが起動しない notifyでの再起動は最後にまとめて1回行われる仕様みたい MySQL以外も含めたすべてのタスクが完了してから、まとめて再起動が行われる つまり、MySQLの再起動を行う前にデータベースやユーザを作ろうとするためエラーになるみたい Ansible: notify と handlers の使い方について調べた - CUBE SUGAR CONTAINER https://blog.amedama.jp/entry/2015/09/01/214912 対策に - name: restart mysql service: name=mariadb state=restarted で再起動はできるが、必ず再起動してしまう問題がある そもそも、データベース作成とユーザ作成はAnsibleの管轄外とする方がいいか Deployerで「setup」のようなタスクを用意して、MySQLにユーザとDBを作成して、トップページのサンプルも更新するか もしくはこれは単なるデータ登録だしパスワードも含むので、特にコード管理する必要は無いか gitからのPULLやそのための鍵登録などもその際に行うか DeployerでLaravelをデプロイする - Qiita https://qiita.com/shalman/items/c09eb23137a9d5269f10 Deployer自体のインストールはtargetではなくcontrollerにインストールするので、Deployer自体のインストールは問題ないはず 以下のコマンドでMySQLを削除できる。データベースのインストールだけ再度試す場合に # rpm -qa | grep aria # yum remove mariadb-libs-5.5.60-1.el7_5.x86_64 Ansibleの事例とちょっとしたTips - Qiita https://qiita.com/volanja/items/d38fe0678848bae6902f MySQLのバージョンは関係ないと思うが一応 AnsibleでMySQLの新しいバージョンをインストールしてDB・ユーザ作成する時の注意点 - Qiita https://qiita.com/bboobbaa/items/d2288724bdefeff1c550 ■MySQLのユーザを手動で作る MySQLのユーザを手動で作る場合、targetサーバのMySQLにrootでパスワードなしでログインして以下を実行する $ mysql -u root >CREATE USER vagrant@localhost IDENTIFIED BY 'abcd1234'; データベースも作成する場合、以下を実行する >CREATE DATABASE test DEFAULT CHARACTER SET utf8mb4; 以下のコードで、PHPからMySQLに接続できる
<?php try { $pdo = new PDO( 'mysql:dbname=test;host=localhost', 'vagrant', 'abcd1234' ); $stmt = $pdo->query('SELECT NOW() AS now;'); $data = $stmt->fetch(PDO::FETCH_ASSOC); echo "<p>MySQL=" . $data['now'] . "</p>\n"; $pdo = null; } catch (PDOException $e) { exit($e->getMessage()); }
■検証メモ
■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 ■引き続き ・以下などを参考に、汎用的な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/