在Docker容器中运行Ansible
总之
从控制节点(主机操作系统)执行Ansible,构建目标节点上的Docker容器环境。
背景 – 背景情况
在使用Ansible构建Docker容器环境时,作者之前只试过在Docker容器内安装Ansible。
然而,作者发现即使不安装Ansible在Docker容器中,也可以通过主机操作系统来执行Ansible来创建Docker容器的环境,因此在本文中分享此方法。
本文的要点 de
-
- 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コンテナのホスト情報を記載した設定ファイルを用意
[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オプションは不要。
[defaults]
inventory=./hosts
请注意
在这篇文章中只讨论了特定的内容,但是在Ansible的背后运行的是Python,所以如果目标容器中没有安装Python,它将无法工作。而且即使安装了Python,如果Python的可执行文件路径不是Ansible的默认路径/usr/bin/python,也会导致错误。在这种情况下,您可以在之前提到的主机配置文件hosts的变量部分中,添加ansible_python_interpreter,如下所示,即可解决问题。
(ホスト名の定義など)
[all:vars]
ansible_connection=docker
# 以下、追記した例
ansible_python_interpreter=/usr/bin/python3