積極的後進

後ろ向きに全力ダッシュ

AnsibleとPackerを使ってAWS上にWordPressを展開するDocker Imageを作成する

概要

Ansible入門として,Amazon Linuxイメージを展開したDockerコンテナ上にWordPress環境を構築するplaybookを作成する. また,ローカルでのDockerコンテナ生成からplaybook適用後のDocker Imageの生成までを,Packerを用いて一括して行うようにする.

今回はAWS上に展開することを想定して各種ファイルを作成したが,実際にWordpressAWS上に展開する場合は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=/wordpress-latest.tar.gz
  - name: unarchive wordpress
    command: tar -xzf /wordpress-latest.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に登録して適宜デプロイされるようにしておく,などが次のゴールになる.

間違いや,より効率的な書き方があると思われるので適宜ご指摘いただけますと幸いです.

2017 5/29 追記

ダウンロードしたwordpressを解凍する際にバージョンが固定になっていたので,最新バージョンをダウンロード・解凍するように変更しました.