Ansibleの概要は下記を参照
01c. 開発環境構築(Windows 10+Ubuntu18.04+Ansible)
さくらのクラウド
コントロールパネルにログイン
ワークショップ当日は会場先でさくらのクラウドを提供して頂けるのですが、準備を兼ねて自分でも使用してみました。アカウント開設後、コントロールパネルログインします。
サーバの追加
石狩第2ゾーンを選択し(近い東京第1ゾーンは少し割高なので)、サーバを選択し追加
今回はディスクイメージはCentOS7.6を選択しました。
最小構成プランを選択
公開鍵はなしを選択(後で作成)
ホスト名と作成数を入力
1ホスト(1GB)/月あたり2000円程度(データ転送料不要/SSD20GB)
同スペックのAWS EC2は1500円程度(データ転送料込み/HDD8GB)
検証で2-3日使用したい時は、さくらのクラウドを利用するのもありかなと思います。
※ 2017年3月よりサーバー停止中の利用料金が無料化されました(ディスク料金別)
作成ボタンをクリック
サーバが作成されます。
暫くすると、サーバが起動されます。
※ ansible-02は、web-01に変更しました。
SSH公開鍵認証
ansible-01上で作業していきます。
# vi /etc/hosts # Webサーバをhostsファイルに追加 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 # Webサーバ 153.XX.XX.XX web-01 153.XX.XX.XX web-02 : # ssh-keygen -t ecdsa # 楕円曲線暗号を用いた方式(RSAよりも解読が困難) Generating public/private ecdsa key pair. Enter file in which to save the key (/root/.ssh/id_ecdsa): Enter passphrase (empty for no passphrase): # パスフレーズは今回無し Enter same passphrase again: Your identification has been saved in /root/.ssh/id_ecdsa. # 秘密鍵 Your public key has been saved in /root/.ssh/id_ecdsa.pub. # 公開鍵 : # ls -l .ssh # 公開鍵と秘密鍵が作成されていることを確認 -rw------- 1 root root 227 6月 2 20:29 id_ecdsa -rw-r--r-- 1 root root 177 6月 2 20:29 id_ecdsa.pub # ssh-copy-id web-01 # 公開鍵の転送 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_ecdsa.pub" : root@web-01's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'web-01'" and check to make sure that only the key(s) you wanted were added. # ssh web-01 # パスワード無しでログインできることを確認 # hostname # 該当ホストにログインできたことを確認 web-01 # cat .ssh/authorized_keys # 公開鍵が転送されていることを確認 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCbobnxvHLTER7LaJWfaZD1tsq7zlC+jsuKBSga7HY96Z6pkMcz+qZTDsX76H1UfC95qvEfvmhb1iFwCECpC3YQ= root@ansible-01 # exit # 後で必要になるので、localhostに対しても公開鍵を転送しておく # ssh-copy-id localhost
Ansibleのインストール
# yum update # インストール済みのパッケージをアップデート # yum install epel-release # EPELリポジトリのインストール(アドオンパッケージ群:Ansibleのインストールで必要) # yum repolist -q # epelリポジトリが有効になっていることを確認 リポジトリー ID リポジトリー名 状態 base/7/x86_64 CentOS-7 - Base 10,019 elrepo ELRepo.org Community Enterprise Linux Repository - el7 122 epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 13,195 extras/7/x86_64 CentOS-7 - Extras 413 updates/7/x86_64 CentOS-7 - Updates 1,945 # python --version # python3がインストールされている場合は、ansibleが対応しているか確認が必要 Python 2.7.5 # yum install ansible # Ansibleのインストール # ansible --version ansible 2.8.0 # ansible localhost -m ping -o localhost | SUCCESS => {"changed": false, "ping": "pong"} # pingモジュールがpongと応答を返すことを確認 # ansible web-01 -m ping -o # 下記インベントリファイルをまだ作成していないので、WARNINGが出力される [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' [WARNING]: Could not match supplied host pattern, ignoring: web-01
インベントリファイル作成
$ vi /etc/ansible/hosts # 最下行に以下のように追記 : [localhost] 127.0.0.1 [web] web-01 web-02 : # ansible web-01 -m ping -o # WARNING出力が無くなったことを確認 web-01 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
vimが苦手な人は、ドットインストールで学習できます。
vim入門 (全18回:無料)
クレデンシャル
下記のようにユーザ認証情報を付与することもできます。
# ansible web-01 -m ping -o -u root -k SSH password: # パスワードを入力
簡単なPlaybookの作成
・Playbookのサンプル
# vi sample_playbook.yml # Playbookの作成 - hosts: web-01 vars: message: "Hello Ansible!!" # message変数を設定 tasks: - shell: uptime register: result # 実行結果をresult変数に格納 - debug: msg: "{{ result.stdout }}" # 上記実行結果の標準出力を表示 - debug: msg: "{{ message }}" # message変数を表示
・実行結果
# --ask-become-passを付与することで、sudo実行の際のパスワードを入力できる(今回は特に不要) # ansible-playbook sample_playbook.yml --ask-become-pass # Playbookの実行 BECOME password: # sudo実行の際のパスワードを入力 PLAY [web-01] ******************************************************************************************************************* TASK [Gathering Facts] ********************************************************************************************************** ok: [web-01] TASK [shell] ******************************************************************************************************************** changed: [web-01] TASK [debug] ******************************************************************************************************************** ok: [web-01] => { "msg": " 16:32:11 up 2:37, 2 users, load average: 0.00, 0.01, 0.05" } TASK [debug] ******************************************************************************************************************** ok: [web-01] => { "msg": "Hello Ansible!!" } PLAY RECAP ********************************************************************************************************************** web-01 : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Ansibleについては、ドットインストールで詳しく説明されています。
Ansible入門(全15回:有料会員)
LAMP環境を構築するPlaybook作成&実行(ansibleサーバ上)
事前準備
テンプレートとして配布するファイルを事前作成する
# vi phpinfo.php # 先頭行が"< ?php"と表示されてしまっていますが、正しくは"<?php"です < ?php phpinfo(); ?> # vi my.cnf.j2 [client] user=root password=wpadmin
LAMP環境用Playbook作成
Update PHP | WordPress.org にて、PHP5.4はサポートされなくなってましたので、Remiリポジトリを追加後にPHP7.3をインストールする内容に更新しました(2019/8/1)
# vi web-01_lamp_playbook.yml - name: LAMP環境構築(さくらのクラウド) hosts: "{{ hostname }}" #become: true # 今回はrootユーザで実行するのでsudo不要 vars: hostname: web-01 # hostname変数を設定 database_name: wp db_username: wpadmin db_password: wpadmin tasks: #- name: 'yum update' # 時間が掛かるので今回のワークショップでは省略 # yum: # name: '*' # state: latest # パッケージを最新の状態に更新 - name: EPELリポジトリを追加 yum: name: ['epel-release-7-11'] - name: Remiリポジトリを追加(PHP7用) yum: name: ['http://rpms.famillecollet.com/enterprise/remi-release-7.rpm'] - name: PHPインストール yum: name: ['php', 'php-mbstring', 'php-mysqlnd', 'php-pdo'] enablerepo: remi,remi-php73 state: present # パッケージがインストールされていなければインストール # php-mbstring: マルチバイト文字列拡張モジュール # php-mysqlnd: MariaDB用ドライバ - name: MariaDBインストール yum: name: ['mariadb-5.5.60', 'mariadb-server-5.5.60'] state: present - name: 最新のRubyインストール用パッケージインストール yum: name: ['centos-release-scl-rh-2-3*', 'centos-release-scl-2-3*'] state: present # centos-release-scl-rh: RHELSC互換の各種パッケージ # centos-release-scl: CentOS SCLo SIGが提供するパッケージ - name: Rubyインストール yum: name: ['rh-ruby25-ruby', 'rh-ruby25-ruby-devel'] state: present - name: 環境設定ファイル追記 lineinfile: dest: ~/.bashrc line: 'source /opt/rh/rh-ruby25/enable' - name: 環境設定ファイル再読み込み shell: source ~/.bashrc - name: Railsで必要なパッケージインストール yum: name: ['libxml2-devel', 'sqlite-devel', 'nodejs'] # nodejs: railsで必要なGemパッケージ(therubyracer)がインストールされる - name: Ruby Gems インストール gem: name: "{{ item }}" user_install: no # システム領域にインストール state: present with_items: - bundler - rake # Serverspecに必要なライブラリ - serverspec # サーバ構成テストツール - rails - name: Python3インストール yum: name: ['python36', 'python36-pip', 'MySQL-python-1.2.5'] state: present - name: pipアップグレード済みなら実施しない stat: path: /usr/bin/pip3 register: pip3 - name: pipのアップグレード pip: name: pip executable: /usr/bin/pip3 state: latest # 最新のバージョンにアップデート when: pip3.stat.exists - name: phpテストページの作成 copy: src: phpinfo.php dest: /var/www/html/phpinfo.php - name: httpプロトコル開放 firewalld: service: http state: enabled permanent: true - name: 3000番ポート開放 firewalld: port: 3000/tcp state: enabled permanent: true - name: 各種サービスを再起動し、自動起動を有効化 service: name: "{{ item }}" state: restarted enabled: yes with_items: - httpd - mariadb - firewalld - name: ~/.my.cnfを配置(MySQL設定ファイル) become_user: root # 該当ユーザへsudo template: src: my.cnf.j2 dest: ~/.my.cnf mode: 0600 - name: MySQL rootユーザのパスワードを設定 mysql_user: name: root password: "{{ db_password }}" check_implicit_admin: yes # ノンパスでrootログインを試みる - name: MySQL DB作成 mysql_db: login_user: root login_password: "{{ db_password }}" name: "{{ database_name }}" state: present # 存在しない場合のみ作成 - name: MySQLユーザの作成及びDBへの権限付与 mysql_user: login_user: root login_password: "{{ db_password }}" name: "{{ db_username }}" password: "{{ db_password }}" priv: "{{ database_name }}.*:ALL" state: present
実際の業務では複数のバージョンでプログラムを書くことになると思うので、バージョン管理ツールであるrbenvやpyenvもインストールしてあげるといいと思います。
モジュールの使い方については、Ansible公式サイトで詳しく記載されています。
Module Index — Ansible Documentation
Playbookの内容確認
# ansible-playbook web-01_lamp_playbook.yml --syntax-check # 構文チェック playbook: localhost_lamp_playbook.yml # エラーが表示されないことを確認 # ansible-playbook web-01_lamp_playbook.yml --list-task # タスクの一覧を取得 playbook: web-01_lamp_playbook.yml play #1 (web-01): LAMP環境構築(さくらのクラウド) TAGS: [] tasks: EPELリポジトリを追加 TAGS: [] Remiリポジトリを追加(PHP7用) TAGS: [] PHPインストール TAGS: [] MariaDBインストール TAGS: [] 最新のRubyインストール用パッケージインストール TAGS: [] Rubyインストール TAGS: [] 環境設定ファイル追記 TAGS: [] 環境設定ファイル再読み込み TAGS: [] Railsで必要なパッケージインストール TAGS: [] Ruby Gems インストール TAGS: [] Python3インストール TAGS: [] pipアップグレード済みなら実施しない TAGS: [] pipのアップグレード TAGS: [] phpテストページの作成 TAGS: [] httpプロトコル開放 TAGS: [] 3000番ポート開放 TAGS: [] 各種サービスを再起動し、自動起動を有効化 TAGS: [] ~/.my.cnfを配置(MySQL設定ファイル) TAGS: [] MySQL rootユーザのパスワードを設定 TAGS: [] MySQL DB作成 TAGS: [] MySQLユーザの作成及びDBへの権限付与 TAGS: [] # ansible-playbook web-01_lamp_playbook.yml --check # ドライラン PLAY [LAMP環境構築(さくらのクラウド)] ******************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************** ok: [web-01] TASK [EPELリポジトリを追加] ************************************************************************************************************** ok: [web-01] TASK [Remiリポジトリを追加(PHP7用)] ******************************************************************************************************* changed: [web-01] TASK [PHPインストール] ***************************************************************************************************************** fatal: [web-01]: FAILED! => {"changed": false, "msg": "Error setting/accessing repos: Error getting repository data for remi, repository not found"} PLAY RECAP *********************************************************************************************************************** web-01 : ok=3 changed=1 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
ドライランなので、[Remiリポジトリを追加(PHP7用)]が実際には実行されていない為、[PHPインストール]のところでエラーとなります。
実行結果
# ansible-playbook web-01_lamp_playbook.yml PLAY [LAMP環境構築(さくらのクラウド)] ******************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************** ok: [web-01] TASK [EPELリポジトリを追加] ************************************************************************************************************** ok: [web-01] TASK [Remiリポジトリを追加(PHP7用)] ******************************************************************************************************* changed: [web-01] TASK [PHPインストール] ***************************************************************************************************************** changed: [web-01] TASK [MariaDBインストール] ************************************************************************************************************* changed: [web-01] TASK [最新のRubyインストール用パッケージインストール] ************************************************************************************************* changed: [web-01] TASK [Rubyインストール] **************************************************************************************************************** changed: [web-01] TASK [環境設定ファイル追記] **************************************************************************************************************** changed: [web-01] TASK [環境設定ファイル再読み込み] ************************************************************************************************************* changed: [web-01] TASK [Railsで必要なパッケージインストール] ****************************************************************************************************** changed: [web-01] TASK [Ruby Gems インストール] ********************************************************************************************************** changed: [web-01] => (item=bundler) changed: [web-01] => (item=rake) changed: [web-01] => (item=serverspec) changed: [web-01] => (item=rails) TASK [Python3インストール] ************************************************************************************************************* changed: [web-01] TASK [pipアップグレード済みなら実施しない] ******************************************************************************************************* ok: [web-01] TASK [pipのアップグレード] *************************************************************************************************************** changed: [web-01] TASK [phpテストページの作成] ************************************************************************************************************** changed: [web-01] TASK [httpプロトコル開放] *************************************************************************************************************** changed: [web-01] TASK [3000番ポート開放] **************************************************************************************************************** changed: [web-01] TASK [各種サービスを再起動し、自動起動を有効化] ****************************************************************************************************** changed: [web-01] => (item=httpd) changed: [web-01] => (item=mariadb) changed: [web-01] => (item=firewalld) TASK [~/.my.cnfを配置(MySQL設定ファイル)] ************************************************************************************************* changed: [web-01] TASK [MySQL rootユーザのパスワードを設定] **************************************************************************************************** changed: [web-01] TASK [MySQL DB作成] **************************************************************************************************************** changed: [web-01] TASK [MySQLユーザの作成及びDBへの権限付与] ***************************************************************************************************** changed: [web-01] PLAY RECAP *********************************************************************************************************************** web-01 : ok=22 changed=19 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Serverspecを使用してサーバ構成のテストをしたいので、上記Playbookをlocalhost(ansible-01)用にコピーして編集後、実行してServerspecをインストールしておきます。
Serverspecを使用してLAMP環境が構築されていることをテスト(ansibleサーバ上)
serverspec-initを実行
# source ~/.bashrc # 環境設定ファイル再読み込み(Serverspecを使用する為) # mkdir serverspec # 任意のディレクトリを作成 # cd serverspec # serverspec-init Select OS type: 1) UN*X # CentOSなのでこちらを選択 2) Windows Select number: 1 Select a backend type: 1) SSH # SSHを選択 2) Exec (local) Select number: 1 Vagrant instance y/n: n # Vagrantは使用していないので n を選択 Input target host name: web-01 # テスト対象ホストを入力 + spec/ # specディレクトリが作成される + spec/web-01/ + spec/web-01/sample_spec.rb + spec/spec_helper.rb
テストファイル作成
# cd spec/web-01 # rm sample_spec.rb # サンプルファイルは削除 # vi check_spec.rb # httpdサービスのテストファイルを作成 require 'spec_helper' #describe package('httpd') do # Resource(何をテストするか) # it { should be_installed } # Matcher(どうあるべきか) #end # eachメソッドを使用 %w(httpd php-7.3.7 mariadb-server-5.5.60 rh-ruby25-ruby python36 python36-pip).each do |pkg| describe package(pkg) do it { should be_installed } # 該当パッケージがインストールされていること end end #describe service('httpd') do # it { should be_running } # httpdサービスが起動していること # it { should be_enabled } # httpdサービスが起動時に有効になること #end %w(httpd mariadb firewalld).each do |src| describe service(src) do it { should be_running } # 該当サービスが起動していること it { should be_enabled } # 該当サービスが起動時に有効になること end end describe port(80) do it { should be_listening } # 80番ポートが空いていること end describe command('firewall-cmd --list-ports') do its(:stdout) { should match /3000\/tcp/ } # 3000番ポートが空いていること end describe command('mysql -uwpadmin -pwpadmin -e"show databases;"') do its(:stdout) { should match /wp/ } # wpデータベースが作成されている end describe file('/var/www/html/phpinfo.php') do it { should be_file } # /var/www/html/phpinfo.phpというファイルが存在すること it { should be_owned_by 'root' } # ファイルオーナーがrootであること it { should be_grouped_into 'root' } # グループがrootであること its(:content) { should match /phpinfo/ } # "phpinfo"という文字列にマッチする end describe file('/root/.my.cnf') do it { should be_file } its(:content) { should match /\[client\]/ } # "[client]"という文字列にマッチする end describe file('/root/.bashrc') do it { should be_file } its(:content) { should match /\/opt\/rh\/rh-ruby25\/enable/ } # 左記の文字列にマッチする end
テスト実行
# rake -T rake spec:web-01 # Run serverspec tests to web-01 # ホストごとにタスクが定義されてる # rake spec:web-01 (in /root/serverspec) /opt/rh/rh-ruby25/root/usr/bin/ruby -I/opt/rh/rh-ruby25/root/usr/local/share/gems/gems/rspec-support-3.8.2/lib:/opt/rh/rh-ruby25/root/usr/local/share/gems/gems/rspec-core-3.8.2/lib /opt/rh/rh-ruby25/root/usr/local/share/gems/gems/rspec-core-3.8.2/exe/rspec --pattern spec/web-01/\*_spec.rb Package "httpd" should be installed Package "php-7.3.7" should be installed Package "mariadb-server-5.5.60" should be installed Package "rh-ruby25-ruby" should be installed Package "python36" should be installed Package "python36-pip" should be installed Service "httpd" should be running should be enabled Service "mariadb" should be running should be enabled Service "firewalld" should be running should be enabled Port "80" should be listening Command "firewall-cmd --list-ports" stdout should match /3000\/tcp/ Command "mysql -uwpadmin -pwpadmin -e"show databases;"" stdout should match /wp/ File "/var/www/html/phpinfo.php" should be file should be owned by "root" should be grouped into "root" content should match /phpinfo/ File "/root/.my.cnf" should be file content should match /\[client\]/ File "/root/.bashrc" should be file content should match /\/opt\/rh\/rh-ruby25\/enable/ Finished in 2.69 seconds (files took 0.43978 seconds to load) 23 examples, 0 failures
Serverspecについては、ドットインストールで詳しく説明されています。
Serverspec入門 (全11回:有料会員)
Serverspec公式サイト
LAMP環境が構築されたことを確認(ansibleサーバ上)
確認スクリプト作成
# vi lamp_check.sh #!/bin/sh echo "### version ###" httpd -v; echo php -v; echo mysql --version; echo python --version python3 --version; echo ruby -v; echo echo "### 環境設定ファイル確認 ###" tail -2 ~/.bashrc echo echo "### pip list ###" pip list echo echo "### firewall設定確認 ###" firewall-cmd --list-services echo echo "### auto start ###" systemctl list-unit-files | egrep "httpd|mariadb|firewalld" echo echo "### service status ###" systemctl status httpd mariadb firewalld | egrep " httpd.service | mariadb.service | firewalld.service |Active" echo echo "### DB確認 ###" mysql -uwpadmin -pwpadmin -e'show databases;' echo echo "### Webサーバ確認 ###" echo http://localhost echo http://localhost/phpinfo.php
確認スクリプト実行
# chmod u+x lamp_check.sh # 実行権付与 # ./lamp_check.sh ### version ### Server version: Apache/2.4.6 (CentOS) Server built: Apr 24 2019 13:45:48 PHP 5.4.16 (cli) (built: Oct 30 2018 19:30:51) Copyright (c) 1997-2013 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies mysql Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_64) using readline 5.1 Python 2.7.5 Python 3.6.8 ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux] ### 環境設定ファイル確認 ### fi source /opt/rh/rh-ruby25/enable ### pip list ### Package Version ---------- ------- pip 19.1.1 setuptools 39.2.0 ### firewall設定確認 ### ssh dhcpv6-client http ### auto start ### firewalld.service enabled httpd.service enabled mariadb.service enabled ### service status ### ● httpd.service - The Apache HTTP Server Active: active (running) since 火 2019-05-21 02:31:19 JST; 3min 6s ago ● mariadb.service - MariaDB database server Active: active (running) since 火 2019-05-21 02:31:24 JST; 3min 0s ago ● firewalld.service - firewalld - dynamic firewall daemon Active: active (running) since 火 2019-05-21 02:31:26 JST; 2min 58s ago ### DB確認 ### +--------------------+ | Database | +--------------------+ | information_schema | | test | | wp | +--------------------+ ### Webサーバ確認 ### #http://localhost #http://localhost/phpinfo.php
Webサイトのサービス起動確認
Apacheのテストページ
下記URLにアクセスして、Apacheのテストページが表示されることを確認
http://WebサーバのIPアドレス/
PHP情報
下記URLにアクセスして、PHP情報が表示されることを確認
http://WebサーバのIPアドレス/phpinfo.php
Rails起動ページ
web-01上でRailsアプリを作成します。
# rails new hello_app # railsのアプリを作成 # cd hello_app # rails s -b 0.0.0.0 # 起動(全てのIPアドレスからアクセス可能)
下記URLにアクセスして、Rails起動ページが表示されることを確認
http://WebサーバのIPアドレス:3000
WordPress設定のPlaybook
今まではWordPressのテーマ/プラグインのインストールはGUIから実施していましたが、WP-CLIコマンドを使用することで、コマンドでインストールできるようになりました!プラグインを一つづつインストールするのは結構大変だったので、だいぶ楽になりましたね。
モジュール名 | どのような時に使用するか |
---|---|
replace | 複数の文字列を一括置換したい時 |
lineinfile | 特定の文字列を含む行の特定個所を変更したい時 |
# vi web-01_wp_playbook.yml - name: WordPress環境構築 hosts: "{{hostname}}" become: true vars: hostname: web-01 # ホスト名を記載 IP: 153.XXX.XXX.X # IPアドレスを記載 database_name: wp db_username: wpadmin db_password: wpadmin wordpress_ver: wordpress-5.1.1-ja.tar.gz wp_path: /var/www/wordpress wp_owner: root # apacheユーザが理想(今回はユーザの作成は省略) wp_group: root # apacheグループが理想(今回はグループの作成は省略) title: Ansbile入門 # Webサイトのタイトルを記載 email: XXXXXXXXX@gmail.com # Webサイト管理者のメールアドレスを記載 tasks: - name: WordPressのダウンロード get_url: url: "https://ja.wordpress.org/{{wordpress_ver}}" dest: "/tmp/{{wordpress_ver}}" - name: WordPressが展開済みなら実施しない stat: path: "{{wp_path}}" register: wordpress - name: WordPressの展開 unarchive: src: "/tmp/{{wordpress_ver}}" dest: /var/www/ remote_src: yes # リモートにダウンロードデータがある場合はyes when: not wordpress.stat.exists - name: WordPressの所有権をapacheに変更 # 今回はroot file: path: "{{wp_path}}" owner: "{{wp_owner}}" group: "{{wp_group}}" recurse: yes - name: WP-CLIコマンドのダウンロード get_url: url: https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar dest: /usr/local/bin/wp owner: "{{wp_owner}}" group: "{{wp_group}}" mode: 0755 - name: configファイル設定済みなら実施しない stat: path: "{{wp_path}}/wp-config.php" register: wpconfig - name: WordPressのconfigファイル設定(DB設定情報) become_user: "{{wp_owner}}" shell: /usr/local/bin/wp core config --dbhost=localhost --dbname="{{database_name}}" --dbuser="{{db_username}}" --dbpass="{{db_password}}" --path="{{wp_path}}" when: not wpconfig.stat.exists - name: WordPressのインストール become_user: "{{wp_owner}}" shell: /usr/local/bin/wp core install --title="{{title}}" --url="{{IP}}" --admin_user=admin --admin_password=admin --admin_email="{{email}}" --path="{{wp_path}}" when: not wpconfig.stat.exists - name: DocumentRootの変更 lineinfile: dest: /etc/httpd/conf/httpd.conf regexp: '^DocumentRoot "/var/www/html"$' line: 'DocumentRoot "/var/www/wordpress"' backrefs: yes # マッチしなかった場合もEOFに追記しない - name: httpdサービスの再起動 service: name: httpd state: restarted - name: Theme(habakiri)がインストール済みなら実施しない stat: path: "{{wp_path}}/wp-content/themes/habakiri" register: habakiri - name: Theme(habakiri)のインストール become_user: "{{wp_owner}}" shell: /usr/local/bin/wp theme install habakiri --path="{{wp_path}}" --activate when: not habakiri.stat.exists - name: Theme(cocoon-master)のダウンロード get_url: url: https://wp-cocoon.com/download/791/ dest: /tmp/cocoon-master-1.7.4.9.zip - name: Theme(cocoon子テーマ)のダウンロード get_url: url: https://wp-cocoon.com/download/726/ dest: /tmp/cocoon-child-master-1.0.6.zip - name: Theme(cocoon-master)が展開済みなら実施しない stat: path: "{{wp_path}}/wp-content/themes/cocoon-master" register: cocoon - name: Theme(cocoon-master)の展開 unarchive: src: /tmp/cocoon-master-1.7.4.9.zip dest: "{{wp_path}}/wp-content/themes/" remote_src: yes # リモートにダウンロードデータがある場合はyes when: not cocoon.stat.exists - name: Theme(cocoon子テーマ)が展開済みなら実施しない stat: path: "{{wp_path}}/wp-content/themes/cocoon-child-master" register: cocoonchild - name: Theme(cocoon子テーマ)の展開 unarchive: src: /tmp/cocoon-child-master-1.0.6.zip dest: "{{wp_path}}/wp-content/themes/" remote_src: yes # リモートにダウンロードデータがある場合はyes when: not cocoonchild.stat.exists #- name: themes配下の所有権をapacheに変更 # 今回はrootのまま # file: # path: "{{wp_path}}/wp-content/themes" # owner: "{{wp_owner}}" # group: "{{wp_group}}" # recurse: yes - name: Theme(cocoon) Activate become_user: "{{wp_owner}}" shell: /usr/local/bin/wp theme activate cocoon-master --path="{{wp_path}}" - name: wp-config.phpの変更(localhostから実際のIPアドレスに) lineinfile: dest: /var/www/wordpress/wp-config.php regexp: "^define\\( 'DB_HOST', 'localhost' \\);" line: "define( 'DB_HOST', '{{IP}}' );" backrefs: yes # マッチしなかった場合もEOFに追記しない - name: Webサーバからwpdbへのアクセスを許可(wpadminユーザ) shell: mysql -uroot -p{{db_password}} -e'GRANT ALL PRIVILEGES ON {{database_name}}.* TO {{db_username}}@"{{IP}}" IDENTIFIED BY "{{db_password}}";' - name: 設定を反映 shell: mysql -uroot -p"{{db_password}}" -e'FLUSH PRIVILEGES;' - name: plugin install become_user: "{{wp_owner}}" shell: /usr/local/bin/wp plugin install "{{item}}" --path="{{wp_path}}" --activate with_items: - all-in-one-seo-pack # SEO(検索エンジン最適化)対策ツール - backwpup # WordPressのファイルとデータベースのバックアップを取得 - broken-link-checker # リンク切れを自動でチェック - classic-editor # WordPressの旧エディターのスタイルの投稿編集画面レイアウトを有効化 - contact-form-7 # お問い合わせフォームプラグイン(メール機能は下記Gmail SMTPで実装 - flickr-pick-a-picture # 著作権リンク付きの写真を挿入 - gmail-smtp # GmailのSMTPサーバー経由でメールを送信 - google-analytics-dashboard-for-wp # ダッシュボードでアナリティクスを確認 - google-sitemap-generator # サイトマップをGoogleに送信してインデックスへの登録漏れを防ぐ - ml-slider # 簡単に使えるスライドショープラグイン - pixabay-images # パブリックドメイン(知的財産権のない)画像を簡単に挿入 - polylang # WordPress に多言語機能を追加 - siteorigin-panels # 固定ページにもサイドバーウィジェットを作成 - syntaxhighlighter # ソースコードを綺麗に表示 - table-of-contents-plus # 自動的に目次を生成 - wordpress-importer # WordPressエクスポートファイルからインポートするツール - wp-multibyte-patch # 日本語版WordPressのマルチバイト文字の取り扱いに関する不具合の修正 - wp-scroll-depth # 記事がどこまで読まれたかを計測(25%、50%、75%、100%)
(2019/07/28追記)セキュリティ対策として、以下のプラグインも追加しておくといいと思います。
数々の有効なセキュリティ対策がたった1つのプラグインで出来てしまう「SiteGuard WP Plugin」
Playbookの内容確認
# ansible-playbook web-01_wp_playbook.yml --syntax-check # 構文チェック playbook: localhost_wp_playbook.yml # エラーが表示されないことを確認 # ansible-playbook web-01_wp_playbook.yml --list-task # タスクの一覧を取得 playbook: web-01_wp_playbook.yml play #1 (web-01): WordPress環境構築 TAGS: [] tasks: WordPressのダウンロード TAGS: [] WordPressが展開済みなら実施しない TAGS: [] WordPressの展開 TAGS: [] WordPressの所有権をapacheに変更 TAGS: [] WP-CLIコマンドのダウンロード TAGS: [] configファイル設定済みなら実施しない TAGS: [] WordPressのconfigファイル設定(DB設定情報) TAGS: [] WordPressのインストール TAGS: [] DocumentRootの変更 TAGS: [] httpdサービスの再起動 TAGS: [] Theme(habakiri)がインストール済みなら実施しない TAGS: [] Theme(habakiri)のインストール TAGS: [] Theme(cocoon-master)のダウンロード TAGS: [] Theme(cocoon子テーマ)のダウンロード TAGS: [] Theme(cocoon-master)が展開済みなら実施しない TAGS: [] Theme(cocoon-master)の展開 TAGS: [] Theme(cocoon子テーマ)が展開済みなら実施しない TAGS: [] Theme(cocoon子テーマ)の展開 TAGS: [] Theme(cocoon) Activate TAGS: [] wp-config.phpの変更(localhostから実際のIPアドレスに) TAGS: [] Webサーバからwpdbへのアクセスを許可(wpadminユーザ) TAGS: [] 設定を反映 TAGS: [] plugin install TAGS: [] # ansible-playbook web-01_wp_playbook.yml --check # ドライラン PLAY [WordPress環境構築] ************************************************************************************************************* TASK [Gathering Facts] *********************************************************************************************************** ok: [web-01] TASK [WordPressのダウンロード] ********************************************************************************************************** changed: [web-01] TASK [WordPressが展開済みなら実施しない] ***************************************************************************************************** ok: [web-01] TASK [WordPressの展開] ************************************************************************************************************** fatal: [web-01]: FAILED! => {"changed": false, "msg": "Source '/tmp/wordpress-5.1.1-ja.tar.gz' does not exist"} PLAY RECAP *********************************************************************************************************************** web-01 : ok=3 changed=1 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
ドライランなので、[WordPressのダウンロード]が実際にはダウンロードされていない為、[WordPressの展開]のところでエラーとなります。
実行結果
# ansible-playbook web-01_wp_playbook.yml PLAY [WordPress環境構築] ************************************************************************************************************* TASK [Gathering Facts] *********************************************************************************************************** ok: [web-01] TASK [WordPressのダウンロード] ********************************************************************************************************** changed: [web-01] TASK [WordPressが展開済みなら実施しない] ***************************************************************************************************** ok: [web-01] TASK [WordPressの展開] ************************************************************************************************************** changed: [web-01] TASK [WordPressの所有権をapacheに変更] *************************************************************************************************** changed: [web-01] TASK [WP-CLIコマンドのダウンロード] ********************************************************************************************************* changed: [web-01] TASK [configファイル設定済みなら実施しない] ***************************************************************************************************** ok: [web-01] TASK [WordPressのconfigファイル設定(DB設定情報)] ******************************************************************************************** changed: [web-01] TASK [WordPressのインストール] ********************************************************************************************************** changed: [web-01] TASK [DocumentRootの変更] *********************************************************************************************************** changed: [web-01] TASK [httpdサービスの再起動] ************************************************************************************************************* changed: [web-01] TASK [Theme(habakiri)がインストール済みなら実施しない] ******************************************************************************************* ok: [web-01] TASK [Theme(habakiri)のインストール] **************************************************************************************************** changed: [web-01] TASK [Theme(cocoon-master)のダウンロード] *********************************************************************************************** changed: [web-01] TASK [Theme(cocoon子テーマ)のダウンロード] ************************************************************************************************** changed: [web-01] TASK [Theme(cocoon-master)が展開済みなら実施しない] ****************************************************************************************** ok: [web-01] TASK [Theme(cocoon-master)の展開] *************************************************************************************************** changed: [web-01] TASK [Theme(cocoon子テーマ)が展開済みなら実施しない] ********************************************************************************************* ok: [web-01] TASK [Theme(cocoon子テーマ)の展開] ****************************************************************************************************** changed: [web-01] TASK [Theme(cocoon) Activate] **************************************************************************************************** changed: [web-01] TASK [wp-config.phpの変更(localhostから実際のIPアドレスに)] *********************************************************************************** changed: [web-01] TASK [Webサーバからwpdbへのアクセスを許可(wpadminユーザ)] ***************************************************************************************** changed: [web-01] TASK [設定を反映] ********************************************************************************************************************* changed: [web-01] TASK [plugin install] ************************************************************************************************************ changed: [web-01] => (item=all-in-one-seo-pack) changed: [web-01] => (item=backwpup) changed: [web-01] => (item=broken-link-checker) changed: [web-01] => (item=classic-editor) changed: [web-01] => (item=contact-form-7) changed: [web-01] => (item=flickr-pick-a-picture) changed: [web-01] => (item=gmail-smtp) changed: [web-01] => (item=google-analytics-dashboard-for-wp) changed: [web-01] => (item=google-sitemap-generator) changed: [web-01] => (item=ml-slider) changed: [web-01] => (item=pixabay-images) changed: [web-01] => (item=polylang) changed: [web-01] => (item=siteorigin-panels) changed: [web-01] => (item=syntaxhighlighter) changed: [web-01] => (item=table-of-contents-plus) changed: [web-01] => (item=wordpress-importer) changed: [web-01] => (item=wp-multibyte-patch) changed: [web-01] => (item=wp-scroll-depth) PLAY RECAP *********************************************************************************************************************** web-01 : ok=24 changed=18 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
WordPressのインストールが完了すると、下記メールが届きます。
新しい WordPress サイトの設置に成功しました:
http://153.XXX.XXX.X以下の情報を使って、管理者としてログインできます:
ユーザー名: admin
パスワード: インストール中に選択したパスワード。
ログイン先: http://153.XXX.XXX.X/wp-login.php
チェックスクリプト作成
※以降はweb-01上で作業
# vi wp_check.sh #!/bin/sh echo -e "### wp --info ###" wp --info echo -e "### theme status ###" wp theme status --path=/var/www/wordpress wp theme list --path=/var/www/wordpress echo -e "### plugin status ###" wp plugin status --path=/var/www/wordpress wp plugin list --path=/var/www/wordpress
チェックスクリプト実行
# ./wp_check.sh ### wp --info ### OS: Linux 3.10.0-957.5.1.el7.x86_64 #1 SMP Fri Feb 1 14:54:57 UTC 2019 x86_64 Shell: /bin/bash PHP binary: /usr/bin/php PHP version: 7.3.7 php.ini used: /etc/php.ini WP-CLI root dir: phar://wp-cli.phar/vendor/wp-cli/wp-cli WP-CLI vendor dir: phar://wp-cli.phar/vendor WP_CLI phar path: /root WP-CLI packages dir: WP-CLI global config: WP-CLI project config: WP-CLI version: 2.2.0 ### theme status ### 6 installed themes: I cocoon-child-master 1.0.8 A cocoon-master 1.9.1 I habakiri 2.5.2 UI twentynineteen 1.3 UI twentyseventeen 2.1 UI twentysixteen 1.9 Legend: I = Inactive, A = Active, U = Update Available +---------------------+----------+-----------+---------+ | name | status | update | version | +---------------------+----------+-----------+---------+ | cocoon-child-master | inactive | none | 1.0.8 | | cocoon-master | active | none | 1.9.1 | | habakiri | inactive | none | 2.5.2 | | twentynineteen | inactive | available | 1.3 | | twentyseventeen | inactive | available | 2.1 | | twentysixteen | inactive | available | 1.9 | +---------------------+----------+-----------+---------+ ### plugin status ### 19 installed plugins: UI akismet 4.1.1 A all-in-one-seo-pack 3.1.1 A backwpup 3.6.10 A classic-editor 1.5 A contact-form-7 5.1.3 A flickr-pick-a-picture 1.2.6 A gmail-smtp 1.1.8 A google-analytics-dashboard-for-wp 5.3.8 A google-sitemap-generator 4.1.0 UI hello 1.7.1 A ml-slider 3.14.0 A siteorigin-panels 2.10.6 A pixabay-images 3.4 A polylang 2.6.2 A syntaxhighlighter 3.5.0 A table-of-contents-plus 1601 A wordpress-importer 0.6.4 A wp-multibyte-patch 2.8.2 A wp-scroll-depth 1.5.1 Legend: I = Inactive, A = Active, U = Update Available +-----------------------------------+----------+-----------+---------+ | name | status | update | version | +-----------------------------------+----------+-----------+---------+ | akismet | inactive | available | 4.1.1 | | all-in-one-seo-pack | active | none | 3.1.1 | | backwpup | active | none | 3.6.10 | | classic-editor | active | none | 1.5 | | contact-form-7 | active | none | 5.1.3 | | flickr-pick-a-picture | active | none | 1.2.6 | | gmail-smtp | active | none | 1.1.8 | | google-analytics-dashboard-for-wp | active | none | 5.3.8 | | google-sitemap-generator | active | none | 4.1.0 | | hello | inactive | available | 1.7.1 | | ml-slider | active | none | 3.14.0 | | siteorigin-panels | active | none | 2.10.6 | | pixabay-images | active | none | 3.4 | | polylang | active | none | 2.6.2 | | syntaxhighlighter | active | none | 3.5.0 | | table-of-contents-plus | active | none | 1601 | | wordpress-importer | active | none | 0.6.4 | | wp-multibyte-patch | active | none | 2.8.2 | | wp-scroll-depth | active | none | 1.5.1 | +-----------------------------------+----------+-----------+---------+
WordPress起動確認
WordPressサイトの表示
下記URLにアクセスして、サイトが表示されることを確認
http://WebサーバのIPアドレス
管理画面の表示
下記URLにアクセスして、ログイン後に管理画面が表示されることを確認
http://WebサーバのIPアドレス/wp-admin/
WordPressについては、ドットインストールで学習できます。
WordPress入門 (全23回:無料)
今回使用したファイル一覧
下記で取得できます。
# git clone https://github.com/hideame/ansible
Ansibleで3分クッキング
上記と同じ内容です。