【Ansible】第4回 Docker Compose編

インフラ・サーバー

どうもわっしょい村です。前回はAnsible Runnerの使い方をEC2にワードプレスを構築しながら解説しました。

今回はEC2への操作ではなくローカルのDockerへの操作でワードプレスを立ち上げていきたいと思います。前回より簡単です。

全体像

今回はAPコンテナ(Webサーバ)とDBコンテナ(データベースサーバ)の2つのコンテナで構成していきます。そしてイメージには公式のphp:7.2-apacheイメージとmariadb:10.2イメージを使用していきます。

この2つのイメージをDocker Composeで立ち上げAnsibleを使ってコンテナ内に操作を加えることでワードプレス環境を作ろうというわけです。

ファイル構成は以下になります。

.
├── env
│   └── settings
├── inventory
│   └── hosts
└── project
    ├── create.yml
    ├── docker-compose.yml
    └── roles
        ├── docker
        │   ├── tasks
        │   │   └── main.yml
        │   └── vars
        │       └── main.yml
        └── wordpress
            ├── tasks
            │   └── main.yml
            └── vars
                └── main.yml

前回同様Ansible Runner構成となります。ただ前回と違い今回はAnsibleの実行環境にDockerは使いません。もしここでコンテナ内でAnsibleを実行する場合Docker内でDockerを使うという複雑な構成になるためです。そのため今回はansible-runnerコマンドで実行はするものの実際に裏で動いているのはansible-coreというやり方で行きます。

実行準備

ansible-runnerをインストールしていない方は前回の記事で導入してください。

またansible-coreが入っていない方は以下コマンドでインストールしてください。

pip3 install ansible

ファイル群

settingsファイルは以下のようにコンテナを使わないように指定します。

container_image: 
process_isolation_executable: 
process_isolation: false

インベントリファイルにはコンテナの指定をします。

[container]
APcontainer  ansible_connection=docker ansible_host=APcontainer
DBcontainer  ansible_connection=docker ansible_host=DBcontainer

docker-composeファイルは以下です。

version: '3.9'

services:

  AP:
    container_name: APcontainer
    image: php:7.2-apache
    environment:
      TZ: 'Asia/Tokyo'
    ports:
      - "8080:80"
      - "443:443"
    networks:
      - internal
      - external

  DB:
    container_name: DBcontainer
    image: mariadb:10.2
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 'your_strong_password'
      MYSQL_DATABASE: wordpress-db
      MYSQL_USER: wordpress-user
      MYSQL_PASSWORD: your_strong_password
      TZ: 'Asia/Tokyo'
    networks:
      - internal
      - external

networks:
  internal:
    internal: true
  external:
    name: localhost

実行の中心となるプレイブックは以下です。今回は2つのロールを使います。docker-composeが入っていない方はここでインストールされます。

#実行コマンド(ansible-runner run . -p create.yml)
# docker exec -it AP-container /bin/bash

- hosts: localhost
  connection: local
  gather_facts: False
  tasks:
    - name: docker-composeインストール
      ansible.builtin.pip: 
        name: docker-compose

#Dockerを立ち上げるロール
- name: create docker
  hosts: localhost
  connection: local
  gather_facts: False
  roles:
    - docker

#APコンテナにワードプレスを立ち上げるロール
- name: create wordpress
  hosts: APcontainer
  connection: docker
  gather_facts: False
  roles:
    - wordpress

Dockerロールではdocker-compose.yml通りのコンテナを立ち上げるのみです。

# コンテナ作成

- name: Docker Compose起動
  community.docker.docker_compose:
    project_name: ansible-compose
    project_src: ./

wordpressロールではワードプレスのダウンロードと設定ファイルの変更などを行っています。Apacheはイメージに元々入っているので導入の必要はありません。

# # wordpress構築

- name: apt-get更新
  ansible.builtin.raw: apt-get update

- name: pythonインストール
  ansible.builtin.raw: apt-get install -y python3

- name: mysqliインストール
  ansible.builtin.shell: docker-php-ext-install mysqli

- name: ワードプレスダウンロード
  ansible.builtin.get_url:
    url: https://wordpress.org/latest.tar.gz
    dest: /var/www/html/wordpress.tar.gz

- name: ワードプレス解凍
  ansible.builtin.unarchive:
    src: /var/www/html/wordpress.tar.gz
    dest: /var/www/html/
    remote_src: yes

- name: ワードプレス設定ファイルコピー
  ansible.builtin.copy:
    src: /var/www/html/wordpress/wp-config-sample.php
    dest: /var/www/html/wordpress/wp-config.php
    remote_src: yes

- name: ワードプレス設定ファイル編集
  ansible.builtin.replace:
    path: /var/www/html/wordpress/wp-config.php
    regexp: "{{ item.before }}"
    replace: "{{ item.after }}"
  with_items: 
    - { before: 'database_name_here', after: 'wordpress-db'}
    - { before: 'username_here', after: 'wordpress-user'}
    - { before: 'password_here', after: 'your_strong_password'}
    - { before: 'localhost', after: 'DBcontainer'}

- name: php設定ファイルコピー
  ansible.builtin.copy:
    src: /usr/local/etc/php/php.ini-development
    dest: /usr/local/etc/php/php.ini
    remote_src: yes

- name: php.ini設定変更
  ansible.builtin.lineinfile:
    path: /usr/local/etc/php/php.ini
    regexp: '^;extension=mysqli'
    line: "extension=mysqli"

- name: apacheリロード
  ansible.builtin.service:
    name: apache2
    state: reloaded

これで準備完了です。変数ファイルも今回は使っていません。

実行(ansible-runner)

それではいつも通り実行します。もう一度言いますがansible-runnerコマンドで実行しますが裏ではansible-coreが動きます。

ansible-runner run . -p create.yml

ansible-playbookコマンドでもできますがインベントリの指定やプレイブック内のパスの変更が必要になるかと思います。

実行が完了したらブラウザでワードプレスにアクセスしてみましょう。

http://localhost:8080/wordpress でアクセスするとワードプレスの画面が表示されます。

コンテナを消したい場合は以下を実行してください。

docker stop APcontainer;docker stop DBcontainer;docker rm APcontainer;docker rm DBcontainer

2023年6月22日にAnsible実践ガイドの最新版が発売されました。ぜひ気になる方は購入してみてはいかがでしょうか!

¥2,530 (2023/06/28 20:40時点 | Amazon調べ)