構成管理ツールのAnsibleです。
CentOS7でシンプルなLAMP環境を作ってみました。
もくじ
環境
- VirtualBox 5.1.28
https://www.virtualbox.org/ - Ansible 2.3.2.0
- LANネットワーク:192.168.10.0/24
- ドキュメント
http://docs.ansible.com/ansible/latest/ - 汎用BOXの配布元
VagrantCloud
bento/centos-7.2をダウンロード、vagrantfileの作成
C:\Users\root\Desktop\Vagrant\Ansible_test>vagrant init bento/centos-7.2 A `Vagrantfile` has been placed in this directory. You are now ready to `vagrant up` your first virtual environment! Please read the comments in the Vagrantfile as well as documentation on `vagrantup.com` for more information on using Vagrant.
Vagrantfileを下記に書き換えた。
# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure(2) do |config| config.vm.define "host" do |node| node.vm.box = "bento/centos-7.2" node.vm.hostname = "host" node.vm.network "public_network", ip: "192.168.10.50" end config.vm.define "web" do |node| node.vm.box = "bento/centos-7.2" node.vm.hostname = "web" node.vm.network "public_network", ip: "192.168.10.51" end config.vm.define "db" do |node| node.vm.box = "bento/centos-7.2" node.vm.hostname = "db" node.vm.network "public_network", ip: "192.168.10.52" end end
Vagrant up
C:\Users\root\Desktop\Vagrant\Ansible_test>vagrant up Bringing machine 'host' up with 'virtualbox' provider... Bringing machine 'web' up with 'virtualbox' provider... Bringing machine 'db' up with 'virtualbox' provider... ==> host: Importing base box 'bento/centos-7.2'... ==> host: Matching MAC address for NAT networking... ==> host: Checking if box 'bento/centos-7.2' is up to date... ==> host: Setting the name of the VM: Ansible_test_host_1507558583327_45816 ==> host: Clearing any previously set network interfaces... ==> host: Preparing network interfaces based on configuration... host: Adapter 1: nat host: Adapter 2: bridged ==> host: Forwarding ports... host: 22 (guest) => 2222 (host) (adapter 1) ==> host: Booting VM... ==> host: Waiting for machine to boot. This may take a few minutes... host: SSH address: 127.0.0.1:2222 host: SSH username: vagrant host: SSH auth method: private key host: Warning: Connection reset. Retrying... host: Warning: Remote connection disconnect. Retrying... host: Warning: Connection aborted. Retrying... host: Warning: Remote connection disconnect. Retrying... host: Warning: Connection aborted. Retrying... host: Warning: Remote connection disconnect. Retrying... host: Warning: Connection aborted. Retrying... host: Warning: Remote connection disconnect. Retrying... host: Warning: Connection aborted. Retrying... host: Warning: Remote connection disconnect. Retrying... host: Warning: Connection aborted. Retrying... host: Warning: Connection reset. Retrying... host: Warning: Connection aborted. Retrying... host: host: Vagrant insecure key detected. Vagrant will automatically replace host: this with a newly generated keypair for better security. host: host: Inserting generated public key within guest... host: Removing insecure key from the guest if it's present... host: Key inserted! Disconnecting and reconnecting using new SSH key... ==> host: Machine booted and ready! ==> host: Checking for guest additions in VM... ==> host: Setting hostname... ==> host: Configuring and enabling network interfaces... host: SSH address: 127.0.0.1:2222 host: SSH username: vagrant host: SSH auth method: private key ==> host: Mounting shared folders... host: /vagrant => C:/Users/root/Desktop/Vagrant/Ansible_test ==> web: Importing base box 'bento/centos-7.2'... ==> web: Matching MAC address for NAT networking... ==> web: Checking if box 'bento/centos-7.2' is up to date... ==> web: Setting the name of the VM: Ansible_test_web_1507558660591_30182 ==> web: Fixed port collision for 22 => 2222. Now on port 2200. ==> web: Clearing any previously set network interfaces... ==> web: Preparing network interfaces based on configuration... web: Adapter 1: nat web: Adapter 2: bridged ==> web: Forwarding ports... web: 22 (guest) => 2200 (host) (adapter 1) ==> web: Booting VM... ==> web: Waiting for machine to boot. This may take a few minutes... web: SSH address: 127.0.0.1:2200 web: SSH username: vagrant web: SSH auth method: private key web: Warning: Connection reset. Retrying... web: Warning: Connection aborted. Retrying... web: Warning: Remote connection disconnect. Retrying... web: Warning: Connection aborted. Retrying... web: Warning: Remote connection disconnect. Retrying... web: Warning: Connection aborted. Retrying... web: Warning: Remote connection disconnect. Retrying... web: Warning: Connection aborted. Retrying... web: Warning: Remote connection disconnect. Retrying... web: Warning: Connection aborted. Retrying... web: Warning: Remote connection disconnect. Retrying... web: Warning: Connection aborted. Retrying... web: Warning: Remote connection disconnect. Retrying... web: Warning: Connection aborted. Retrying... web: Warning: Remote connection disconnect. Retrying... web: Warning: Connection aborted. Retrying... web: Warning: Connection reset. Retrying... web: Warning: Connection aborted. Retrying... web: web: Vagrant insecure key detected. Vagrant will automatically replace web: this with a newly generated keypair for better security. web: web: Inserting generated public key within guest... web: Removing insecure key from the guest if it's present... web: Key inserted! Disconnecting and reconnecting using new SSH key... ==> web: Machine booted and ready! ==> web: Checking for guest additions in VM... ==> web: Setting hostname... ==> web: Configuring and enabling network interfaces... web: SSH address: 127.0.0.1:2200 web: SSH username: vagrant web: SSH auth method: private key ==> web: Mounting shared folders... web: /vagrant => C:/Users/root/Desktop/Vagrant/Ansible_test ==> db: Importing base box 'bento/centos-7.2'... ==> db: Matching MAC address for NAT networking... ==> db: Checking if box 'bento/centos-7.2' is up to date... ==> db: Setting the name of the VM: Ansible_test_db_1507558737449_12722 ==> db: Fixed port collision for 22 => 2222. Now on port 2201. ==> db: Clearing any previously set network interfaces... ==> db: Preparing network interfaces based on configuration... db: Adapter 1: nat db: Adapter 2: bridged ==> db: Forwarding ports... db: 22 (guest) => 2201 (host) (adapter 1) ==> db: Booting VM... ==> db: Waiting for machine to boot. This may take a few minutes... db: SSH address: 127.0.0.1:2201 db: SSH username: vagrant db: SSH auth method: private key db: Warning: Connection reset. Retrying... db: Warning: Connection aborted. Retrying... db: Warning: Remote connection disconnect. Retrying... db: Warning: Connection aborted. Retrying... db: Warning: Remote connection disconnect. Retrying... db: Warning: Connection aborted. Retrying... db: Warning: Connection reset. Retrying... db: Warning: Remote connection disconnect. Retrying... db: Warning: Connection aborted. Retrying... db: Warning: Remote connection disconnect. Retrying... db: Warning: Connection aborted. Retrying... db: Warning: Remote connection disconnect. Retrying... db: Warning: Connection aborted. Retrying... db: Warning: Connection reset. Retrying... db: Warning: Connection aborted. Retrying... db: Warning: Remote connection disconnect. Retrying... db: Warning: Connection aborted. Retrying... db: db: Vagrant insecure key detected. Vagrant will automatically replace db: this with a newly generated keypair for better security. db: db: Inserting generated public key within guest... db: Removing insecure key from the guest if it's present... db: Key inserted! Disconnecting and reconnecting using new SSH key... ==> db: Machine booted and ready! ==> db: Checking for guest additions in VM... ==> db: Setting hostname... ==> db: Configuring and enabling network interfaces... db: SSH address: 127.0.0.1:2201 db: SSH username: vagrant db: SSH auth method: private key ==> db: Mounting shared folders... db: /vagrant => C:/Users/root/Desktop/Vagrant/Ansible_test
C:\Users\root\Desktop\Vagrant\Ansible_test>vagrant ssh host [vagrant@host ~]$ [vagrant@host ~]$ sudo yum install epel-release [vagrant@host ~]$ sudo yum install ansible
“the python mysqldb module is required”対策
[vagrant@host ~]$ sudo yum install MySQL-python
ここからは、Teratermでhostサーバにログインし、web, dbホストを操作します。
- 192.168.10.50:22
- ユーザ:vagrant
- パスワード:vagrant
接続先ホストの設定
[vagrant@host ~]$ vi .ssh/config Host web HostName 192.168.10.51 Host db HostName 192.168.10.52
[vagrant@host ~]$ chmod 600 .ssh/config
[vagrant@host ~]$ ssh-keygen -t rsa -b 4096 Generating public/private rsa key pair. Enter file in which to save the key (/home/vagrant/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/vagrant/.ssh/id_rsa. Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub. The key fingerprint is: d7:64:6e:b5:a4:1a:9d:7a:6d:5b:6e:38:53:26:65:01 vagrant@host The key's randomart image is: +--[ RSA 4096]----+ | E. | | . | | o o .| | * = .o| | S o B .o | | . = .. o| | o . o=.| | . .++.| | .+.| +-----------------+
公開鍵を渡します。
[vagrant@host ~]$ ssh-copy-id web The authenticity of host '192.168.10.51 (192.168.10.51)' can't be established. ECDSA key fingerprint is fa:c7:04:e6:3a:97:9d:f2:23:b9:ed:53:09:1b:b8:72. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys vagrant@192.168.10.51's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'web'" and check to make sure that only the key(s) you wanted were added. [vagrant@host ~]$ ssh-copy-id db The authenticity of host '192.168.10.52 (192.168.10.52)' can't be established. ECDSA key fingerprint is fa:c7:04:e6:3a:97:9d:f2:23:b9:ed:53:09:1b:b8:72. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys vagrant@192.168.10.52's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'db'" and check to make sure that only the key(s) you wanted were added.
sshでログインできるか確認
[vagrant@host ~]$ ssh web [vagrant@web ~]$ exit logout Connection to 192.168.10.51 closed. [vagrant@host ~]$ ssh db [vagrant@db ~]$ exit logout Connection to 192.168.10.52 closed.
[vagrant@host ~]$ ansible all -i hosts -m ping 192.168.10.52 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.10.51 | SUCCESS => { "changed": false, "ping": "pong" }
コンフィグの作成
[vagrant@host ~]$ vi ansible.cfg [defaults] hostfile = ./hosts
疎通確認
$ ansible all -m ping 192.168.10.51 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.10.52 | SUCCESS => { "changed": false, "ping": "pong" }
playbook.ymlの作成
[vagrant@host ~]$ vi playbook.yml --- - hosts: all sudo: yes tasks: - name: Yum update yum: name=* state=latest - hosts: web sudo: yes tasks: - name: Firewalldの状態チェック command: systemctl is-active firewalld register: firewalld_result changed_when: False ignore_errors: True - name: Firewalldの起動, 自動起動設定 service: name=firewalld state=started enabled=yes - name: Firewalld設定 80許可 firewalld: permanent=True port=80/tcp state=enabled immediate=true - name: Firewalld設定 443許可 firewalld: permanent=True port=443/tcp state=enabled immediate=true - name: PHPをインストール yum: name="{{item}}" state=latest with_items: - php - php-mysql - php-mbstring - php-gd - php-devel - php-xml - name: PHPのタイムゾーン設定 ini_file: > dest=/etc/php.ini section=Date option=date.timezone value='"Asia/Tokyo"' - name: Apacheのインストール yum: name=httpd state=latest - name: start Apacheの起動, 自動起動設定 service: name=httpd state=started enabled=yes handlers: - name: Firewalldの設定反映 読み込み service: name=firewalld state=restarted - hosts: db sudo: yes vars: - mysql_root_password: rootpassword tasks: - name: MariaDB インストール yum: name={{item}} state=latest with_items: - MySQL-python - mariadb - mariadb-libs - mariadb-server - mariadb-devel - name: MySQL起動, 自動起動 service: name=mariadb state=started enabled=yes - name: DBの作成 mysql_db: name=wpdb state=present - name: DBユーザの作成 localhost, 192.168.10.0/24のみ mysql_user: name=wpdbuser password=wpdbpassword host={{ item }} priv=wpdb.*:ALL state=present with_items: - localhost - 192.168.11.% - name: ローカル接続制限無効化 replace: > dest=/etc/my.cnf regexp='^bind-address' replace='#bind-address' - name: MySQL再起動, 自動起動 service: name=mariadb state=restarted enabled=yes - name: Firewalldの起動, 自動起動設定 service: name=firewalld state=started enabled=yes - name: Firewalld設定 3306許可 192.168.10.0/24のみDBへの接続許可 firewalld: permanent=True port=3306/tcp source=192.168.11.0/24 state=enabled immediate=true - name: Firewalldの再起動, 自動起動設定 service: name=firewalld state=restarted enabled=yes
構文確認
[vagrant@host ~]$ ansible-playbook playbook.yml --syntax-check
ドライラン
[vagrant@host ~]$ ansible-playbook playbook.yml --check
実行
[vagrant@host ~]$ ansible-playbook playbook.yml