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ư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
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: Copy 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
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: Copy 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 [Copy 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:
Nguồn bài viết: https://opensource.com