はじめに
こんにちは。
今回はAnsible検証用にDockerコンテナを利用したお話しになります。
普段ansibleの機能やplaybookの動作確認をする際の環境としてVMを使用していたのですが、なるべく初期状態に近い状態のマシンで試したいとき、検証後使う予定がないときにVMを準備するのはもったいないなと思っていました。これを解消するためにDockerコンテナを利用しました。
やったことはシンプルで以下の2つになります。
- 基本パッケージをインストールし、公開鍵を登録したコンテナイメージを作成する
- playbookからコンテナを起動する
動作環境
CentOS 7.5
Docker 18.06.1-ce
ansible 2.7.10
python 3.6.6
docker-py 1.10.6
作成方法
Dockerfileを準備
CentOS7をベースにcore,baseパッケージをインストールし、ssh用公開鍵の登録をしたイメージを作成します。
“` FROM centos:centos7 RUN yum clean all && \ yum -y groupinstall core && \ yum -y groupinstall base WORKDIR /root RUN mkdir /root/.ssh COPY id_rsa.pub /root/.ssh/authorized_keys RUN chmod 0600 /root/.ssh/authorized_keys EXPOSE 22 CMD /usr/sbin/sshd -D “`
コンテナイメージを作成
Dockerfileからコンテナイメージを作成します。登録する公開鍵はあらかじめ作成し、同じディレクトリに配置しておきます。
“` # cd “Dockerfileがあるディレクトリ” # ls -l -rw-r–r– 1 root root XXX XX XX XXXX Dockerfile -rw-r–r– 1 root root XXX XX XX XXXX id_rsa.pub # docker build . -t “イメージ名”:”タグ” # docker images REPOSITORY TAG IMAGE ID CREATED SIZE “イメージ名” XX XXXXXXXXXXXX XXXXX XXXMB “`
コンテナ起動用playbook作成
with_items で設定したコンテナを特権モードで作成します。作成後、コンテナ情報を出力します。
“` – name: Create container hosts: localhost tasks: – name: Create container docker_container: name: “{{ item.name }}” hostname: “{{ item.host }}” image: “イメージ名”:”タグ” detach: yes privileged: yes ports: – “{{ item.port }}” command: /sbin/init with_items: – { name: “コンテナ名”, host: “ホスト名”, port: “ローカルポート:22” } – { name: “コンテナ名”, host: “ホスト名”, port: “ローカルポート:22” } register: create_docker_container_result – name: print create_docker_container_result debug: msg: “{{ create_docker_container_result }}” “`
playbookからコンテナ起動
コンテナ起動用のplaybookを実行するとコンテナが作成されます。
“` # ansible-playbook “コンテナ起動用playbook” # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES XXXXXXXXXXXX XXXXXXXX “/sbin/init” XXX XXX 0.0.0.0:”ポート”->22/tcp “コンテナ名” “`
作成したコンテナに対してグループとユーザを作成する
インベントリファイルに作成したコンテナのIPアドレスを設定し、playbookを実行します。
“` – name: create user hosts: all vars: – password: “ユーザパスワード” tasks: – name: create group group: name: “グループ名” state: present – name: create user user: name: “ユーザ名” password: “{{ password | password_hash(‘sha512’) }}” groups: “グループ名”,wheel shell: /bin/bash become: yes “`
まとめ
これで少し検証したい場合に使える環境が準備できました。以前と比べて大分手軽に環境を準備できるようになりましたので、今後はこれを活用してAnsibleに対しての理解を深めていこうと思います。
複数コンテナを使用してWeb,DB,APサーバを作成するplaybookの作成や、ベストプラクティスに沿ったplaybookの作成などをやっていきたいと思っています。