Nếu bạn đã quen thuộc với Ansible thì bạn cũng đã biết cách cơ bản để viết các tác vụ và sử dụng ansible-playbook để thực thi chúng. Như ở bài viết trước mình đã xây dựng CI/CD cùng Ansible, Docker và Drone. Nhưng ngoài ra, bạn cũng có thể thực thi các câu lệnh bên trong môi trường container và có được kết quả tương tự nếu bạn viết một Dockerfile và build bằng podman với ansible-bender
Xem thêm: [Ansible] Xử lý ngoại lệ trong Ansible Playbooks với block và rescue
Dưới đây là một ví dụ:
- name: Serve our file using httpd
hosts: all
tasks:
- name: Install httpd
package:
name: httpd
state: installed
- name: our file to httpd's webroot
copy:
src: our-file.txt
dest: /var/www/html/
Tuy bạn có thể chạy đoạn trên ở server hoặc container đều được, nhưng bạn phải tạo file our-file.txt trước và httpd của bạn phải được bật bởi vì lúc đó các file config mới có thể được đọc và áp dụng. Đây là điểm khác biệt giữa môi trường container build và infrastructure provisioning.
Ngoài ra, bạn có thể đính kèm thẻ metadata với một container image để nói với nó những câu lệnh nào mặc định cần phải chạy? ansible-bender là công cụ có thể giải quyết được vấn đề đó:
$ ansible-bender build the-playbook.yaml fedora:30 our-httpd
Đoạn lệnh trên sẽ dùng ansible-bender để thực thi playbook. Dựa trên image Fedora 30 và đặt tên container được tạo ra sau đó là our-httpd
Xem thêm: [Ansible] Ansible Role
Nhưng khi bạn chạy container này, nó không thể tự bật được httpd. Vì vậy, bạn có thể fix bằng cách thêm một số metadata vào playbook như bên dưới:
- name: Serve our file using httpd
hosts: all
vars:
ansible_bender:
base_image: fedora:30
target_image:
name: our-httpd
cmd: httpd -DFOREGROUND
tasks:
- name: Install httpd
package:
name: httpd
state: installed
- name: Listen on all network interfaces.
lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen '
line: Listen 0.0.0.0:80
- name: our file to httpd's webroot
copy:
src: our-file.txt
dest: /var/www/html
Bây giờ, bạn có thể build image sử dụng playbook trên:
# ansible-bender build the-playbook.yaml
PLAY [Serve our file using httpd] ****************************************************
TASK [Gathering Facts] ***************************************************************
ok: [our-httpd-20191004-131941266141-cont]
TASK [Install httpd] *****************************************************************
loaded from cache: 'f053578ed2d47581307e9ba3f64f4b4da945579a082c6f99bd797635e62befd0'
skipping: [our-httpd-20191004-131941266141-cont]
TASK [Listen on all network interfaces.] *********************************************
changed: [our-httpd-20191004-131941266141-cont]
TASK [ our file to httpd's webroot] **********************************************
changed: [our-httpd-20191004-131941266141-cont]
PLAY RECAP ***************************************************************************
our-httpd-20191004-131941266141-cont : ok=3 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
Getting image source signatures
Copying blob sha256:4650c04b851c62897e9c02c6041a0e3127f8253fafa3a09642552a8e77c044c8
Copying blob sha256:87b740bba596291af8e9d6d91e30a01d5eba9dd815b55895b8705a2acc3a825e
Copying blob sha256:82c21252bd87532e93e77498e3767ac2617aa9e578e32e4de09e87156b9189a0
Copying config sha256:44c6dc6dda1afe28892400c825de1c987c4641fd44fa5919a44cf0a94f58949f
Writing manifest to image destination
Storing signatures
44c6dc6dda1afe28892400c825de1c987c4641fd44fa5919a44cf0a94f58949f
Image 'our-httpd' was built successfully
Sau khi build xong, bạn hoàn toàn có thể sử dụng podman để chạy image trên:
# podman run our-httpd
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.2.106. Set the 'ServerName' directive globally to suppress this message
Container đã chạy, thực hiện tìm địa chỉ ip của container đó:
# podman inspect -f '{{ .NetworkSettings.IPAddress }}' 7418570ba5a0
10.88.2.106
Check lại với curl ta có kết quả:
$ curl http://10.88.2.106/our-file.txt
Ansible is ❤
Về chủ đề ansible, bạn đọc nên theo dõi thêm bài viết bên dưới:
- Sử dụng Ansible để cài đặt và thiết lập Docker trên Ubuntu 18.04
- Sử dụng Ansible để cài đặt và thiết lập Docker trên Ubuntu 20.04
- Top 10 tips khi sử dụng Ansible
- Hướng dẫn cài đặt Kubernetes trên CentOS 7 tự động hoá với Ansible
- Tự động hóa các tác vụ Kubernetes với Ansible module
- Tự động hóa PostgreSQL với Ansible
Mọi thắc mắc xin hãy liên hệ
Email: [email protected]
(Nguồn: tel4vn.edu.vn)