Đa số các bài viết khác sẽ dùng Ansible để khởi tạo cụm Docker swarm, nhưng đối với bài này để hiểu rõ hơn về Playbook/Ansible nên mình quyết định chỉ dùng cho phần triển khai. Tức là bình thường khi deploy swarm, update image mới thì swarm sẽ lên repository kéo image mới về node để run.
Trong bài này thì mình sẽ dùng Ansible cho việc này, tuy hơi giống “làm lại cái bánh xe” nhưng để hiểu rõ hơn về Playbook thì mình nghĩ đây là ví dụ ổn, cũng như trong một số tình huống triển khai docker swarm, các worker không tự kéo được image mới về, vì các worker node không kéo về được thì không run container trên node đó được.
Điều kiện tiên quyết
- Phải đảm bảo các node cần deploy đã có thông kết nối SSH với máy đích như ở Bài 3 – ví dụ như docker swarm thì từ manager có thể ssh đến các worker node
- Cụm docker swarm phải được thiết lập và create trước một stack (mình sẽ giành bài viết khác để nói về chủ đề này)
- Node manager có kết nối SSH với các node còn lại thì cần cài ansible/ Các node còn lại thì phải có docker
Playbook
---
- hosts: webservers
tasks:
- name: Get ping
command:
cmd: whoami
- name: Login dockerhub
command:
cmd: docker login -u admin -p devopsifypassword http://10.121.xx.xx:xxxx/repository/devopsify-docker-repo
- name: Pull the new image
command:
cmd: docker pull 10.121.xx.xx:xxxx/dcb-"{{ ENVIRONMENT }}":v"{{ BUILD_NUMBER }}"
Giải thích chút, mình có 3 tasks.
- Task 1 – Get Ping: Mục đích để xem bạn đang run với user nào, Ví dụ docker run dưới user A nhưng bạn đang cho kết nối từ manager đến worker là user B trong file hosts (xem bài trước để biết về hosts file) thì lúc nào docker sẽ không thực thi được do thiếu quyền,..bla..bla, nên mình để task này ở đây mục đích để remind, để lỡ có lỗi, mọi người fix cho lẹ 😀
- Task 2 – Login dockerhub: Login vào repository, nơi mà bạn chứa các image mới
- Task3 – Pull the new image: lấy cái image mới về, ở đây mình để 2 biến là ENVIRONMENT – để pull đúng môi trường, BUILD_NUMBER là bản version của image
Hosts
Ở đây mình có 2 nodes nên file hosts mình cấu hình như này. Docker mình run ở user root và dùng SSH
Deployment
Thực thi lệnh sau để pull image về
ansible-playbook -i /u01/app/ansible/hosts --extra-vars 'ENVIRONMENT=prod BUILD_NUMBER=286' /u01/app/ansible/ansible-playbook.yml
Trong đó,
- -i là đường dẫn tới file hosts ở trên
- –extra-vars: gồm 2 biến đã được đặt trong playbook
- /u01/app/ansible/ansible-playbook.yml: đường dẫn đến ansible-playbook.yml mình đã viết
Sau đó, dùng lệnh docker service update để update image mới
Kết quả:
Chúc các bạn thành công!