- 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
環境によっては、epel-release を先にインストールする必要がある
#SELINUX=enforcing
SELINUX=disabled … システム起動時にSELinuxを無効化
# 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 … 変数を定義する
become と become_user により、rootになって作業ができる
Ansible1.9からはsudo/suの代わりにbecomeを使う - Qiita
https://qiita.com/imoyoukan/items/12832aecd956d14b03f5
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
$ 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 … メイン処理を定義
HTTPDが起動したので、ブラウザから以下にアクセスできる
http://192.168.33.11/
■notifyでhandlersを呼び出す
「この処理が実行された場合にのみ、あの処理を実行する」ができる
例えば「my.cnfの設定を変更した場合のみ、MySQLを再起動する」など
- 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が起動する)
$ cd ..
$ vi ansible/role-common/tasks/main.yml
Ansibleでhandlersとnotifyをつかってみる - かべぎわブログ
https://www.kabegiwablog.com/entry/2018/03/06/090000
■コメント
「#」から始まる行はコメントとして扱われる
- 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で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
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
ローカルで検証
自分自身に対してAnsibleを実行する方法
Ansible自体のインストールと設定は手動で行う必要があるが、それ以降はコード化できる
■Vagrant起動
Vagrantは、通常の方法で1台だけ起動すれば十分
■Ansibleをインストール
$ sudo su -
# yum -y install ansible
# vi /etc/ansible/hosts … ファイルの最後に追記
■Playbookの修正
ローカル接続用に、以下のように修正しておく
site.yml
[localhost]
127.0.0.1
# exit
$ ansible localhost -m ping --connection=local ... ローカル環境へPING(「--connection=local」が無ければ 127.0.0.1 へ認証しようとする)
- 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
■バーチャルホストを使用する場合(もちろんAnsibleで操作するのも有効)
C:/windows/System32/drivers/etc/hosts を編集
<?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());
}
192.168.33.10 vagrant.local
192.168.33.10 test.vagrant.local
# vi /etc/httpd/conf.d/virtualhost.conf
■その他
以下は必要に応じて手動で実行する方がスムーズか
・yum update
・「root宛メールを転送」
・SSHのユーザ作成
・MySQLのデータベース&ユーザ作成
■参考
ansibleで自分自身(localhost)を制御する場合はlocalで - Qiita
https://qiita.com/hotta/items/47a432edacdfbd6a3e3e
<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 を編集
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
■Ansibleインストール
Amazon Linux 2 以外の場合、以下の手順でインストールできる
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
# 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
■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/