私は自宅にサーバーをいくつか保有し、そいつらの構成をAnsibleとGitHubのプライベートリポジトリで管理しています。
前まではvagrantのイメージを作っておいて、ローカルPCで起動していたのですが、PCをスイッチする機会が多くなり(Windows/Mac)vagrantのイメージをいちいち移動するのが面倒くさくなりました。
なので、管理リポジトリ上にDockerfileを配置しておいて、コンテナ上で作ったAnsibleサーバーから実行してやることにしました。
フォルダ構成
/
├─.vscode
├─ansible-container
├─group_vars
├─logs
└─roles
├─common
│ ├─files
│ ├─handlers
│ ├─tasks
│ ├─templates
│ └─vars
├─gitlab-install
│ ├─files
│ ├─handlers
│ ├─tasks
│ ├─templates
│ └─vars
├─gpbk_script
│ ├─files
│ ├─handlers
│ ├─tasks
│ ├─templates
│ └─vars
├─nfs-client
│ ├─files
│ ├─handlers
│ ├─tasks
│ ├─templates
│ └─vars
├─nfs-server
│ ├─files
│ ├─handlers
│ ├─tasks
│ ├─templates
│ └─vars
└─wol_script
├─files
├─handlers
├─tasks
├─templates
└─vars
基本的にはansibleお決まりのフォルダ構成+コンテナ用のフォルダとVSCodeの設定フォルダという感じです。直下にはansible.cfg,inventory.txtなどの必要ファイルもおいてあります。
そしてDockerfileはこんな感じ
FROM centos:latest
ENV ANSIBLE_HOST_KEY_CHECKING False
RUN yum -y install openssh openssh-clients
RUN yum install -y epel-release
RUN yum install -y --enablerepo=epel python2-pip
RUN yum install -y ansible
WORKDIR /workdir
CMD /bin/bash
centosをベースにyumでインストールしている感じです。この定義で入れると、2021/9/11現在はansible 2.9.23が入っています。Linuxの構成管理するならsshも必要ですのでお忘れなく。
これに対してdocker-compose.ymlを以下のように作っておいて、起動コマンドをREADMEにメモっています。
version: "3"
services:
ansible-container:
build: ansible-container
container_name: ansible-container
volumes:
- .:/workdir
これで
docker-compose run -p 8080:8080 ansible-container /bin/bash
と打てば、コンテナが起動してシェルに入れます。
Docker上のAnsibleでログを吐かせる
少しはまったのが、vagrantで実行していた時は直下にansible.cfgを置いておけばlogの出力先などを変更できたのですが、docker上だとどうもうまくいきませんでした。
[WARNING]: Ansible is being run in a world writable directory (/workdir), ignoring it as an ansible.cfg source. For more
information see https://docs.ansible.com/ansible/devel/reference_appendices/config.html#cfg-in-world-writable-dir
どうやらVSCodeのプロジェクトルートとdockerコンテナ上の/workdirを接続して使っていたのですが、ここのパーミッションが緩すぎるのが問題の様です。
drwxrwxrwx 1 root root 4096 Sep 9 05:46 workdir
dockerfileでchmod 700とかにしても良かったのですが、ansibleの実行ログのローテートも兼ねて、以下のようなスクリプトをansible-playbook実行前に実行するようにしました。
これで実行時のWARNINGは消えませんが、ログは出力するようになりました。
コメント