AnsibleをDockerコンテナで実行


概要

コントロールノード(ホストOS)からAnsibleを実行し、ターゲットノードのDockerコンテナの環境を構築する。

背景

Dockerコンテナの環境をAnsibleで構築する際に、筆者はこれまでDockerコンテナ内にAnsibleをインストールして試したことしかなかった。
しかしDockerコンテナにAnsibleをインストールせずとも、ホストOSからAnsibleを実行してDockerコンテナの環境を作れることがわかったため、本記事で共有する。

本記事のポイント

  • DockerコンテナにAnsibleはインストール不要。(ホストOSにはインストール必要)
  • 通常Ansibleを実行するのに、デフォルトではコントロールノードからターゲットノードへsshでログイン可能な状態にする必要があるが、予め接続方法をDocker向けにカスタマイズするためssh設定は不要。また、Ansibleを実行するためにDockerコンテナの特定ポートをホストOSに向けて開ける必要も無し。

手順

(1) 元となるDockerコンテナの準備

  • CentOS7のコンテナを使う例
  • 暫定で使うので、コンテナを停止したらコンテナが消える--rmオプションをつけている
  • 対象コンテナを既に立ち上げている場合はこの手順はスキップしてOK
    • 以後に出てくるcentos7も、各自のコンテナ名に置き換えて試していただく必要あり
$ docker run -dit --name centos7 --rm centos:7 /bin/bash

(2) ターゲットノードのホスト情報を記述した設定ファイルの準備

  • カレントディレクトリ(作業するディレクトリ)に、Dockerコンテナのホスト情報を記載した設定ファイルを用意
hosts
[servers]
centos7

[all:vars]
ansible_connection=docker
  • 要点
    • [servers]セクションにターゲットノードのホスト名(つまりDockerコンテナ名)を記載。
    • 変数を定義するセクション[all:vars]に、ターゲットノードがDockerコンテナであることを表すansible_connection=dockerを記載
  • 余談
    • [servers]セクションに複数のホストを指定することも可能。また、セクションはホストを例えばDB向け、AP向けなどのようにグループ化するために利用するもので、どのような名前にするかは任意。今回の例では、コンテナcentos7への接続を確認するだけなので、[servers]というセクションの記載がそもそも無くても(centos7のみ記載していれば)動作する模様。
    • ansible_connectionに関して。ssh無しで自分自身のマシンにAnsibleを適用したい場合は、ansible_connection=localにするといいみたい。

(3) 動作確認

  • 以下コマンドで、Dockerコンテナ内でpingできることを確認
$ ansible centos7 -i hosts -m ping
centos7 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
  • ちなみにカレントディレクトリにansible.cfgを用意して、ターゲットホスト(およびそれに付随する設定)を定義したファイルhostsを参照する旨を記載していれば、上記コマンドで-iオプションは不要。
ansible.cfg
[defaults]
inventory=./hosts

注意点

本記事で扱う内容に限った話ではないが、Ansibleの裏ではpythonが動いているため、対象コンテナ内にpythonが入っていなければ動作しない。
また仮にpythonが入っていても、pythonの実行ファイルパスがAnsibleのデフォルトである/usr/bin/pythonでなければエラーになってしまう。その場合は、先に示したホストの設定ファイルhostsの変数セクションに、下記のようにansible_python_interpreterを追記してあげればOK。

hosts
(ホスト名の定義など)

[all:vars]
ansible_connection=docker
# 以下、追記した例
ansible_python_interpreter=/usr/bin/python3