PackerとAnsibleでDockerイメージを作成する
はじめに
前回 Ansible と Packer に入門する というブログを書きました。
Packer と Ansible を使って AMI を作成したいとき、毎回 EC2 インスタンスの起動に時間がかかるため、検証に時間がかかります。 今回は Ansible の実行先を EC2 ではなく、Dcoker にすることで検証しやすい環境を作成したいと思います。
成果物
https://github.com/kntks/blog-code/tree/main/2023/12/ansible-packer-docker
環境
バージョン | |
---|---|
Mac | Ventura 13.2.1 |
Packer | v1.10.0 |
Ansible | 2.10.17 |
Docker cli | 24.0.7 |
インストール
バージョン管理に rtx を使用します。
Packer
Ansible
Example1: Packer で Docker Imageを作成する
Docker Plugin を使用する
ドキュメントに書かれている Example をそのままコピペで動かしてみます。
packer build docker.pkr.hcl
packer build が成功すると、pull してきた ubuntu イメージとコミットした myrepo/example:0.1
が作成されています。
ファイル分割
前回、Packer を勉強した際使用しませんでしたが、HCL2 tmplate を使っているのでファイル分割と変数ファイルを作成します。
Packer はディレクトリ内の .pkr.hcl
で終わるすべてのファイルをロードするので、ファイル名は何でもよいです。
Terraform と同じで変数を使用する場合は、あらかじめ variable
を定義する必要があり、変数の参照には、var.
、 local.
でアクセスできます。
先ほど作成した docker.pkr.hcl
を example1/plugin.pkr.hcl
と example1/docker.pkr.hcl
の2つに分割します。
ディレクトリ構造
ついでに changes を追記します。
実行は以下のコマンドでできます。LABEL をつけたことにより、イメージ一覧の filter オプションで検索しやすくなりました。
変数を設定する方法
packer build
コマンドのオプション-var
を使用する。- (例)
packer build -var "weekday=Sunday" -var "flavor=chocolate" .
- (例)
- varファイルを作成し、
packer build
コマンドのオプション-var-file
を使用する。- (例)
packer build -var-file="variables.pkrvars.hcl" .
- (例)
- 変数を自動で渡してくれる
*.auto.pkrvars.hcl
ファイルを使用する。
- 環境変数
PKR_VAR_xxx
を使用する。- (例)
export PKR_VAR_weekday=Monday
- (例)
引用:Input Variables and local variables - Packer Documentation
変数ファイルの作成
variables.auto.pkrvars.hcl
と variables.pkr.hcl
を作成します。
今度は tag を 0.1 から 0.2 にあげてみます
build を実行した後、一覧を取得してみると tag が 0.2 に上がっています。これで値を変数にすることができました。
最後にいらなくなったイメージを削除します。
参考:Input Variables - Packer Documentation
Example2: Ansible Pluginを入れる
先ほどは Packer を使って Docker Image にタグづけをしました。次は Docker Image (Ubuntu) に入れるパッケージを Ansible で定義できるようにファイルを追加します。
ファイルを用意する
variables.*.pkr.hcl は example1 のときと同じなので割愛
example2/plugin.pkr.hcl
example2/docker.pkr.hcl
ansible/playbook.yml
ansible/ansible.cfg
``` [defaults] interpreter_python=/usr/bin/python3 ```example2コンテナを作成する
まず nginx をインストールできたか確認してみる
先にコンテナをバックグラウンドで立ち上げます。
nginx が起動していることを確認できました。
参考: 【ubuntu】Dockerでsystemctlを使えるようにする - Zenn Use custom configuration file for ansible provisioner - stackoverflow
Example3: Ansible で NICE DCV の設定をする
先日、NICE DCV をインストールした EC2 インスタンスに Web ブラウザからアクセスする、という記事を書きました。この記事は、AWSのドキュメントを参考にしながらコマンドを実行しただけの記事です。そのため実行したコマンドを Ansible の Playbook にすることで Image の作成を自動化します。
コードは以下にあります。 https://github.com/kntks/blog-code/tree/main/2023/12/ansible-packer-docker/example3
Example4: Ansible リファクタ (roleの作成)
role は再利用できる単位で定義します。今回は NICE DCV に関するイントールが主な作業だったので、role は1つしか作成しませんが、AMI を作成するときに別の role を作成しやすいようにします。
Once you group your content in roles, you can easily reuse them and share them with other users.
訳)コンテンツをロールでグループ化すれば、簡単に再利用したり、他のユーザーと共有したりできます。
Ansible will look in each directory within a role for a main.yml file for relevant content (also main.yaml and main):
訳)デフォルトでは、Ansibleはロール内の各ディレクトリで、関連するコンテンツのmain.ymlファイルを探します(main.yamlとmainも)
一般的なディレクトリ構造は以下に示す通りです。
example4 では以下のように ansible/roles
配下を作成し role を定義しています。
コードは以下にあります。 https://github.com/kntks/blog-code/tree/main/2023/12/ansible-packer-docker/example4
ただ task を移動させただけなので、 example3 の時と結果は同じです。
さいごに
NICE DCV が M1 Mac ではインストールできなかったので、完全に自動化できませんでした。 しかし Ansible + Packer を使ってある程度、環境を再現できることがわかったので、たとえば、Ansible の挙動を確かめたい場合などで使えるようになりました。
おまけ
ansible_facts を出力する
Docker の Ubuntu Image を使用して ansible_facts
を出力してみた結果
print ansible_facts
変数が多かったため、一部削除