⏲️

Ansible + DockerDesktop で使い捨て検証環境

2022/07/08に公開

背景

WSLというか、VMっていうかもう検証とか全部コンテナでいいよね人間です。
でもdockerfile + docker-composeってそれだけで意外に学習コストあるよなーと。

そもそもdockerコマンドのオプションすら覚えるの面倒なので、
ansibleにやってもらえれば楽だよなーと思った次第です。

環境

DockerDesktop + WSL2
(ansibleさえ動けばディストリビューションはなんでもいいんじゃないでしょうか。)
自分はcent8です。

むしろWSL2のセットアップが大変な気がしますが、良記事いっぱいありそうなので割愛します。

手元のversionとか

ansible [core 2.12.6]
Docker version 20.10.17, build 100c701

install

そもそもDocker Desktopを入れた時点でディストリビューション側からdockerは叩けるようになった気がします。
docker --versionとか打って叩ければOK。

ansibleのインストールは公式どおりでOK
ansible --versionとか打って叩ければOK。

python用のモジュールが無いとansibleから叩けなかったと思いますのでそれを入れます。
(ほかにもなんかモジュール必要だった気がしますが忘れました。)

pipX install docker

これであとはPlaybookを書くだけです。

Playbook

サンプル構成

オプション的なのは基本的に抜いてます。

ansible_docker_demo # 実行ディレクトリ
├── demo.yml # コンテナに対して実行するPlaybook
├── inventry # 対象リスト
├── make_container.yml # コンテナ作成用のPlaybook
└── roles # 実処理
    └── apache
        └── tasks
            └── main.yml

別につなげて書いてもいいと思いますが、
わかりにくいので自分は分けて書いて、
実行時に単純にセミコロンでつないじゃってます。

コンテナ作成

- name: Make Container
  gather_facts: no
  hosts: localhost
  connection: local

  vars:
    - container_name_and_hostname: server01

  tasks:
  - name: create container
    docker_container:
       name: '{{ container_name_and_hostname }}'
       hostname: '{{ container_name_and_hostname }}'
       image: almalinux:latest # 特にalmaにしてる意味はないです。
       detach: yes
       privileged: yes
       published_ports:
          - "80:80"
       command: /sbin/init
       auto_remove: yes

イメージはローカルにあればそれを、なければ持ってくるという一般的な動きなので、
外からだとそれなりに時間がかかります。

コンテナに対して実行するplaybook

サンプルとしてhttpdをインストールする感じにしてみました。

- hosts: servers
  gather_facts: no
  connection: docker

  roles:
    - apache

roles配下

- name: install apache
  yum:
    name:
      - httpd
    state: present

- name: start httpd
  service: name=httpd state=started

# 実行結果(WARNINGは消しちゃってます。)

コンテナを作成

# ansible-playbook make_container.yml;
PLAY [Make Container] **************************************************************************************************

TASK [create container] ************************************************************************************************
changed: [localhost]

PLAY RECAP *************************************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

一応DockerDesktopからも確認できます。

作成したコンテナにapacheをインストール(例として)

# ansible-playbook -i inventry demo.yml

PLAY [servers] *********************************************************************************************************

TASK [apache : install apache] *****************************************************************************************
changed: [server01]

TASK [apache : start httpd] ********************************************************************************************
changed: [server01]

PLAY RECAP *************************************************************************************************************
server01                   : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

一応、動いてるよねと。

server01# systemctl  status httpd | grep active
   Active: active (running) since Fri 2022-07-08 02:14:26 UTC; 1min 24s ago

server01# curl -s http://localhost | grep "AlmaLinux website"
                                        <p>For information on AlmaLinux, please visit the <a href="http://www.almalinux.org/">AlmaLinux website</a>.</p>

終わりに

セットアップ自体は年単位で前に実施した内容なので漏れがあったら
後で手順は指しておきます。

完全に備忘というか記憶の中からでまとめてみましたが、
自分にはこの環境で今のところ十分というかめちゃめちゃ応用聞くし
いつの間にかansibleも使えるようになる、と思ってます。
興味ある人はぜひ。もっと簡単なセットアップ方法とか、
使い道あれば教えてください。

Discussion