DockerでAnsibleの実行環境を作って家のサーバーを管理する

ansible IaC
ansible

私は自宅にサーバーをいくつか保有し、そいつらの構成を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などの必要ファイルもおいてあります。

ちょっとしたテクニックとして、使用していないフォルダもあるけどgitの構成に含めておきたい場合、.keepという空ファイルをフォルダの下に置いておき、そいつをコミットしてあげることで、フォルダをgitの構成管理下に入れることが出来ます。

そして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は消えませんが、ログは出力するようになりました。

この記事を書いた人

渋谷で働くよわよわエンジニア。TypeScript(Next.js/Node.js)/Golang/AWS/Flutterなど
LINE API Expert(2023/1~)

tokkuをフォローする
オススメ記事
在宅ワークが多くなって、デスクの配線周りに困っている方は、拡張デスクの導入がおすすめです。Windows/MacOS/Linuxの複数の機器をスッキリとデスク周りに収める事ができました!リモートからサーバーメンテを行うインフラエンジニアは必見です!
IaC
tokkuをフォローする

コメント

タイトルとURLをコピーしました