IaC

Build Container Image sử dụng Ansible-Bender

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.

Xem thêm: [Ansible] Thuộc tính selectattr trong playbook

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:

Mọi thắc mắc xin hãy liên hệ
Email: [email protected]

(Nguồn: tel4vn.edu.vn)

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button