概要
Ansible入門として,Amazon Linuxイメージを展開したDockerコンテナ上にWordPress環境を構築するplaybookを作成する. また,ローカルでのDockerコンテナ生成からplaybook適用後のDocker Imageの生成までを,Packerを用いて一括して行うようにする.
今回はAWS上に展開することを想定して各種ファイルを作成したが,実際にWordpressをAWS上に展開する場合はAWS Marketplaceを利用した方が圧倒的に楽なのでそちらを使うべきだろう.
Docker
amazonlinuxイメージをpullしておく. テスト環境として,
% docker run -i -t -d --name aws -p 3000:80 amazonlinux
としてコンテナを生成し,ここに向けてansibleを実行する.
Ansible
下準備
playbook.ymlをローカルで作成し,上記で作成したdockerコンテナ上に流し込む. 実行前にansibleで使用するhostsファイルを作成する. Ansible 2.0以降はDocker Connectionが使用できるので,下記のようなファイルをローカルに作成する.
[docker] aws
上記をdockerHostsというファイル名で保存しておく.ansible-playbook時に使用する.
playbook
実際のplaybookを作成する. 今回は下記のようなplaybookになる. wordpress周りの各種設定はAWSのガイドラインそのままなので,適宜変更・追加が必要になる.
- hosts: all connection: docker # 初期設定 # mysql周りのパラメーター vars: mysql_user: "wordpress-user" mysql_password: "hogehogehoge" mysql_database: "wordpress_db" tasks: # 各種パッケージのインストール(vimは趣味) - name: install yum packages yum: name={{item}} state=latest with_items: - vim - httpd - mysql - mysql-devel - mysql-server - php - php-devel - php-mysql - php-mbstring - php-gd - MySQL-python27 - MySQL-python # wordpressのダウンロードと展開 - name: wordpress download get_url: url="https://wordpress.org/latest.tar.gz" dest=/ - name: unarchive wordpress command: tar -xzf /wordpress-4.7.2.tar.gz chdir=/var/www/html # mysqld起動のためのネットワーク設定,mysqld起動 - name: network settings for mysql shell: echo "NETWORKING=yes" >/etc/sysconfig/network - name: enable mysqld service: name=mysqld state=started enabled=yes # dbとuserの作成,権限設定 - name: create mysql database mysql_db: name: "{{mysql_database}}" state: present - name: create mysql user shell: | mysql << " _EOF_" CREATE USER "{{mysql_user}}"@'localhost' IDENTIFIED BY "{{mysql_password}}"; GRANT ALL PRIVILEGES ON `{{mysql_database}}`.* TO "{{mysql_user}}"@"localhost"; FLUSH PRIVILEGES; _EOF_ # wordpress設定ファイルの作成 - name: config wordpress lineinfile: dest: /var/www/html/wordpress/wp-config.php create: yes insertafter: yes line: | <?php define('DB_NAME', '{{mysql_database}}'); define('DB_USER', '{{mysql_user}}'); define('DB_PASSWORD', '{{mysql_password}}'); define('DB_HOST', 'localhost'); define('DB_CHARSET', 'utf8'); define('DB_COLLATE', ''); define('AUTH_KEY', 'put your unique phrase here'); define('SECURE_AUTH_KEY', 'put your unique phrase here'); define('LOGGED_IN_KEY', 'put your unique phrase here'); define('NONCE_KEY', 'put your unique phrase here'); define('AUTH_SALT', 'put your unique phrase here'); define('SECURE_AUTH_SALT', 'put your unique phrase here'); define('LOGGED_IN_SALT', 'put your unique phrase here'); define('NONCE_SALT', 'put your unique phrase here'); $table_prefix = 'wp_'; define('WP_DEBUG', false); if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/'); require_once(ABSPATH . 'wp-settings.php'); # apacheの設定 - name: "modify httpd.conf" shell: >- c='/etc/httpd/conf/httpd.conf' && k='<Directory "\/var\/www\/html">' && s='AllowOverride None' && r='AllowOverride All' && mv $c $c.backup && awk "/$k/{f=1} f==1&&/$s/{sub(/.+/,\"$r\"); f=0} 1" $c.backup > $c # apache userのグループ設定 - name: creat a group group: name: www state: present - name: add user to group shell: usermod -aG www apache - name: change user auth file: path=/var/www/html/ owner=apache group=www mode=2755 state=directory recurse=yes # httpd起動 - name: enable apache service: name=httpd state=started enabled=yes
playbook実行と確認
先程作成したDockerコンテナに向けて,上記playbookを実行する.
% ansible-playbook -i dockerHosts playbook.yml
無事に展開が終わったら,localhost:3000/wordpress にむけてアクセスすると,wordpressの初期設定画面にアクセスできる.
Packer
上記で,playbookを用いてDockerコンテナ上にWordPress環境が構築できるところまで確認できた. 最後に,Packerを用いてコンテナ生成から,環境構築後のDocker Image生成まで行う.
下記のようなjsonファイルを作成する(ファイル名はpacker.jsonとする).
{ "builders":[{ "type": "docker", "image": "amazonlinux", "export_path": "controller.tar", "run_command": ["-d", "-i", "-t", "--name", "aws", "-p", "3000:80", "{{.Image}}"], "pull": false }], "provisioners":[{ "type": "ansible", "playbook_file": "./playbook.yml", "extra_arguments": ["-i", "dockerHosts"] }], "post-processors": [{ "type": "docker-import", "repository": "wordpress-aws", "tag": "aws" }] }
上記のjsonファイルを用いて,次のように実行する.
% packer build packer.json
これで,Wordpress環境が構築されたDocker Imageが生成される.
さいごに
Wordpress環境を構築した状態のDocker Imageを一通り生成するところまでが確認できた. AnsibleとPackerは初体験だったが,まずは使ってみることができたので満足した. 上記で生成されたDocker Imageを,例えばECRに登録して適宜デプロイされるようにしておく,などが次のゴールになる.
間違いや,より効率的な書き方があると思われるので適宜ご指摘いただけますと幸いです.