ansible-builder
轉貼去年 12 月時寫的 ansible-builder。
看到這篇:紅帽推出IT自動化工具Ansible Builder以加速執行環境創建 | iThome,所以就來試試看。
就我試用過以後,我的理解是,這工具可以幫忙創建出一個具有 Ansible 環境的 container image。
環境是定義在 execution-environment.yml 裡,讓我們直接看範例
---
version: 1
# 即基礎 image,目前來說,都是用 quay.io/ansible/ansible-runner:stable-2.9-devel
base_image: 'quay.io/ansible/ansible-runner:stable-2.9-devel'
# 需要自訂 ansible.cfg 的話,這邊就是填 ansible.cfg 的路徑檔名
ansible_config: 'ansible.cfg'
# 相依
# galaxy 是填 requirements.yml,檔案裡描述 playbook 會用到的 role/collection,沒用到可以不填
# python 則是填 requirements.txt,檔案裡描述會使用到的 Python modules,沒用到可以不填
dependencies:
galaxy: requirements.yml
python:
# 額外要加入的 docker image 建置步驟
# prepend 會在預定的建置步驟之前
# append 則是在預定的建置步驟之後
additional_build_steps:
prepend: |
RUN whoami
RUN cat /etc/os-release
append:
- RUN echo This is a post-install command!
- RUN ls -la /etc
有了 execution-environment.yml 之後,就可以用 ansible-builder 來建置。
首先,得先安裝 ansible-builder 這工具:
pip3 install ansible-builder
接著就可以建置了
ansible-builder build --tag=example
建置完成,會有 container image,在目錄下則會出現 context 資料夾,這個資料夾裏面就是 ansible-builder 建置過程中所產出的 Dockerfile 以及建置 container image 所需的檔案。
打開 Dockerfile ,就會看到 ansible-builder 幫我們產出了什麼。
FROM quay.io/ansible/ansible-runner:stable-2.9-devel as galaxy
ADD ansible.cfg ~/.ansible.cfg
ADD requirements.yml /build/
RUN ansible-galaxy role install -r /build/requirements.yml --roles-path /usr/share/ansible/roles
RUN ansible-galaxy collection install -r /build/requirements.yml --collections-path /usr/share/ansible/collections
RUN mkdir -p /usr/share/ansible/roles /usr/share/ansible/collections
FROM quay.io/ansible/python-builder:latest as builder
ADD requirements_combined.txt /tmp/src/requirements.txt
RUN assemble
FROM quay.io/ansible/ansible-runner:stable-2.9-devel
RUN whoami
RUN cat /etc/os-release
COPY --from=galaxy /usr/share/ansible/roles /usr/share/ansible/roles
COPY --from=galaxy /usr/share/ansible/collections /usr/share/ansible/collections
COPY --from=builder /output/ /output/
RUN /output/install-from-bindep && rm -rf /output/wheels
RUN echo This is a post-install command!
RUN ls -la /etc
大抵來說,
- 使用了 multi stage build 以減少 docker image 的大小
- 使用 ansible-galaxy 安裝相依的 role/collection
- 會看到 additional_build_steps 裡描述的步驟
好,那建置出 docker image 以後,怎麼使用呢?
假設 playbook 是放在 project 目錄下,那麼就這樣執行
docker run --rm -v /runner/project:$(pwd)/project -it example:latest ansible-playbook -i localhost, -c local /runner/project/test.yml
這邊稍微取了點巧,只簡單用 local connection (-i localhost, -c local) 在本機執行,你也可以在這邊使用自己的 inventory。
建置出 Ansible 執行環境的 docker image 以後,除了可以固定住執行 Ansible playbook 的環境,也有利於打造出標準化的 CD 環境,進而減少開發與佈署的時間。