Ansibleをコンテナで準備 動作編

■はじめに

昨日のエントリではコンテナで作成したAnsible内でping通すところまで確認しました。
本日はDockerfileの作成〜動作確認の完了まで行います。

■Dockerfile

動作確認が取れたDockerfileは以下になります。

# syntax=docker/dockerfile:1.1-experimental
FROM alpine:3.12.0

RUN set -x \
  && apk add --no-cache bash \
  && apk add --no-cache ansible \
  && apk add --no-cache python3 \
  && apk add --no-cache openssh-client \
  && mkdir -p /etc/ansible/selenoid \
  && mkdir -p -m 0700 ~/.ssh \
  && ssh-keyscan selenoid-qa-example-01.eastus.cloudapp.azure.com >> ~/.ssh/known_hosts

COPY inventory_node.ini /etc/ansible
COPY playbook_node_docker.yml /etc/ansible
COPY ansible.cfg /etc/ansible
COPY ./selenoid /etc/ansible/selenoid

WORKDIR /etc/ansible

RUN ssh-keygen -q -N '' -t ed25519 -f ~/.ssh/id_ed25519
RUN --mount=type=secret,id=ssh,target=/root/.ssh/test_key.pem \
  cat ~/.ssh/id_ed25519.pub | ssh -i /root/.ssh/test_key.pem azureuser@selenoid-qa-example-01.eastus.cloudapp.azure.com 'cat >> .ssh/authorized_keys'
RUN ansible -i inventory_node.ini selenoid-qa-example-01.eastus.cloudapp.azure.com -m ping
CMD ["ansible-playbook", "-i", "inventory_node.ini", "playbook_node_docker.yml"]

■ポイント

まずしばらく悩んだのがbuildkitのマウントパスです。

最初~/.ssh/と書いていたのですが、全くうまくマウントされません。
フルパス(/root/.ssh/test_key.pem)を書いたら動きました。
探しても情報出てこなくてまいった。。

あと、playbookの実行はdocker runで動かせるようにCMD化してあります。
playbookの動作もrun(もしくはstart)でlogで確認できます。

それから今回のplaybookは以前準備したplaybookをそのまま使用しています。
このplaybookの中で、selenoidの各種ファイル(docker-compose.ymlとかbrowsers.jsonとか)まで準備しています。
なのでこれらファイルもAnsibleコンテナ内に同梱してやらねばなりません。

selenoidコンテナ周りのファイルはCOPYコマンドで配置していますが、parentのディレクトリは閲覧できない仕様になっているので、Dockerfileと同じディレクトリに配置しなおします。
合わせてselenoidまでの各種パス(playbook内のパスやDockerfile内のパス、等々)を変更します。

■実行

まずはビルドです。

> docker image build -t test/ansible:0.1 --secret id=ssh,src=$HOME/.ssh/test_key.pem .
[+] Building 15.2s (17/17) FINISHED                                                                                                                                                            

(中略)

 => exporting to image                                                                                                                                                                    0.1s 
 => => exporting layers                                                                                                                                                                   0.1s 
 => => writing image sha256:34fa4577686201bc3a786af872b9f5cc66231e567807feb13f88c321b1236ac7                                                                                              0.0s 
 => => naming to docker.io/test/ansible:0.1 

無事ビルドできました。

次、docker runしてコンテナの準備と実行を行います。

>docker container run -itd --name ansible test/ansible:0.1                   
3cbb6c2420f4d5bbe0c21fb906d3d4ffd1cb6b79d1b14c266ee399ddd5bd3a1d

ログを確認しましょう。

> docker container logs -f ansible                                                    

(中略)

PLAY RECAP *********************************************************************
selenoid-qa-example-01.eastus.cloudapp.azure.com : ok=17   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 


無事AnsibleコンテナからSSH経由でAnsibleのSSH公開鍵を配置し、プロビジョニングさせることができました。



今回はここまで。
ではでは。