WordPress in Docker の環境をansible で作成してみた

docker

こんにちは、前のブログから少し間があきました。最近色々なクラウドを使ってWordpress 環境を個人で立てているのですが、これといったものが定まらないです。色々経験するので、知識が増えて楽しいですが、そろそろこのWordpress のブログも落ち着きたいと言っています。

最近、Wordpress をOCI に移行して、Wordpress をDocker で環境を作ってみたいなと思いまして、それ用のAnsible を作成してみました。ECS みたいなのを使っているのではなく、VM の中にDocker をインストールしている感じになります。

今回はこれを紹介したいと思います。

今回作成した成果物

自分のGithub を参照しています。

GitHub - kentaindeed/wordpress_in_docker: wordpress 環境を自動デプロイしてくれる
wordpress 環境を自動デプロイしてくれる. Contribute to kentaindeed/wordpress_in_docker development by creating an account on GitHub.
GitHub - kentaindeed/docker_my_wordpress
Contribute to kentaindeed/docker_my_wordpress development by creating an account on GitHub.

どんな構成で作成した?

まずはTree でディレクトリ構造をお見せします。

こっちが、Ansible の環境です。大きく3つに分けると、docker をインストールするrole・wordpress の環境を作成するrole・後はshell をDocker の環境をgithub から取得して調整をごにょごにょするものです。

└─wordpress_in_docker
    ├─roles
    │  ├─docker
    │  │  └─tasks
    │  ├─shell
    │  └─wordpress
    │      └─tasks
    └─variables

一方下記がDocker の環境です.Docker の中身のconf ファイルなどを配置したり、docker compose yml を配置しているのが、下記のディレクトリになります。

├─docker_my_wordpress
│  ├─apache2
│  │  └─etc
│  │      └─conf.d
│  └─mysql
│      └─etc

Ansible で環境は作成したものの、ほとんどシェルスクリプトが担っているじゃねと思う所もありましたが、一旦さておき、ディレクトリ構造は上の感じで作成しています。

ansible 環境について

それぞれポイントだけかいつまんで紹介します。今回はAlma Linux 8 の環境で作成しました。

まずはDocker をインストールする時のyml ファイルです。最初にremove でpodman などをアンインストールするのが結構ポイントだったりします。これらは初期からインストールされていて、docker をインストールしようとすると、なぜかエラーが発生しました。なので、podman やrunc をremove する必要がありました。

---

#podman コマンドによってエラーが発生したため
- name: remove podman and related packages
  yum:
    name:
      - podman
      - podman-docker
      - podman-compose
      - podman-tui
      - buildah
      - skopeo
      - skopeo-containers
      - runc
      - containers-common
    state: absent
  ignore_errors: true


- name: Download docker repo
  shell: dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo


- name: install docker in alma 8
  yum:
    name: 
      - docker-ce
      - docker-ce-cli
      - containerd.io
      - docker-compose-plugin
    state: present
  # when: ansible_distribution == "AlmaLinux" and ansible_distribution_major_version == "8"


- name: install docker compose
  ansible.builtin.shell: curl -L
    "https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-$(uname
    -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- name: start docker
  ansible.builtin.service:
    name: docker
    state: started
    enabled: true

Docker がインストールさえすれば、このシェルスクリプトを使ってドキュメントルートなどを作成していきます。プログラムを書くとエラーハンドリングが多くなるのと一緒で、このシェル自体もほとんどエラーハンドリングです。ちょっと見づらいですが、やってることはドキュメントルート作成と、そこにGithub からclone してきたdocker 関連のファイルを置くだけです。

###########################################################################
# document root を作成して、Git repo を引っ張るシェルスクリプト
###########################################################################

# 変数定義
domain_name="blog.dev-tansanken.com"
Document_Root="/var/www/vhosts/${domain_name}/"
ProgramDir="/var/www/vhosts/${domain_name}/"
GitRepo="https://github.com/kentaindeed/docker_my_wordpress.git"


# ドキュメントルート作成
if [ -z "${domain_name}" ]; then
    echo "エラー: 'DOMAIN_NAME' 変数が設定されていません。スクリプトを終了します。" >&2
    exit 1
fi

if [ -z "${Document_Root}" ]; then
    echo "エラー: 'Document_Root' 変数が設定されていません。スクリプトを終了します。" >&2
    exit 1
fi

if [ -d "${Document_Root}" ]; then
    echo "情報: ドキュメントルート '${Document_Root}' は既に存在します。スキップします。"
else
    # 4. ドキュメントルートが存在しない場合、作成する
    echo "情報: ドキュメントルート '${Document_Root}' を作成します..."
    mkdir -p "${Document_Root}"

    # 5. ディレクトリ作成の成否をチェック
    if [ $? -ne 0 ]; then
        echo "エラー: ドキュメントルート '${Document_Root}' の作成に失敗しました。" >&2
        exit 1
    else
        echo "成功: ドキュメントルート '${Document_Root}' を作成しました。"
        cd ${ProgramDir}
    fi
fi


# Git clone 実行
echo " プログラムファイルのデプロイを開始します" 

if [ -z "${GitRepo}" ]; then
    echo "エラー: 'GitRepo' 変数が設定されていません。スクリプトを終了します。" >&2
    exit 1
fi

if [ -d "${ProgramDir}/.git" ]; then
    echo "情報: Git リポジトリが既に存在します。スキップします。"
else
    # Git clone 実行
    echo "情報: Git リポジトリをクローンします..."
    git clone ${GitRepo} ${ProgramDir}
    # Git clone の成否をチェック
    if [ $? -ne 0 ]; then
        echo "エラー: Git リポジトリのクローンに失敗しました。" >&2
        exit 1
    else
        echo "成功: Git リポジトリをクローンしました。"
    fi
fi

wordpress の環境作成@docker-compose

docker compose ファイルのみ紹介すると、パスワードなどは全て.env で書き込んでいて、そこから呼び出す形でかいています。それ以外は特別なことをしていないので、かなりシンプルにかくことができました。

version: "3.7"

services:
  mysql:
    image: mysql
    hostname: mysql8
    container_name: wordpress_mysql
    volumes:
      - ./mysql_data:/var/lib/mysql
      - ./mysql/etc/my.cnf:/etc/my.cnf
    environment:
      MYSQL_ROOT_PASSWORD:${DB_PASSWORD}
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}
    ports:
    - 3306:3306

  wordpress:
    container_name: tansanken_wp
    hostname: wordpress
    image: wordpress
    volumes:
      - ./public/wp/:/var/www/html
      - ./public/log/:/var/log/apache2/
      #- ./apache2/etc/default/apache2.conf:/etc/apache2/apache2.conf
      - ./apache2/etc/conf.d/:/etc/apache2/sites-enabled/
    links:
      - mysql
    depends_on:
      - mysql
    ports:
      - "80:80"
    environment:
      - WORDPRESS_DB_HOST=${WORDPRESS_DB_HOST}
      - WORDPRESS_DB_NAME=${WORDPRESS_DB_NAME}
      - WORDPRESS_DB_USER=${WORDPRESS_DB_USER}
      - WORDPRESS_DB_PASSWORD=${WORDPRESS_DB_PASSWORD}

強いて言うならば、apache のapache2.conf を一度docker を立ち上げてから、コピーする必要があったので、そこが少し面倒な感じではありました。

まとめ

WordPress in docker の環境をある程度自動デプロイできると簡単に検証などもできると思うので、検証したい方もぜひ使ってみてください。

コメント

タイトルとURLをコピーしました