- [Ansible] Giới thiệu về Ansible
- [Ansible] Hướng dẫn sử dụng và quản lý Role trong Ansible
- [Ansible] Quản trị Windows Server 2012 với Ansible
- [Ansible] Quản trị Windows Server 2012 với Ansible – Phần 2
Hướng dẫn sử dụng và quản lý
Role trong Ansible
Chao xìn mọi người, lâu quá không gặp. Hôm nay mình sẽ nối tiếp loạt bài viết hướng dẫn về Ansible, mà cụ thể là Ansible Role, dùng để quản lý playbook, các file cấu hình và tận dụng lại các playbook đã viết một cách tối ưu hơn.
Vậy thì ta phải hiểu Ansible Role là gì trước đã ^^.
TL;DR: Cheat sheet như mọi khi cho bạn nào lười đọc: https://github.com/nduytg/ansible_roles
Role là gì?
Trong Ansible, Role là một cơ chế để tách 1 playbook ra thành nhiều file. Việc này nhằm đơn giản hoá việc viết các playbook phức tạp và có thể tái sử dụng lại nhiều lần (như keo dính chuột)
Role không phải là playbook. Role là một bộ khung (framework) để chia nhỏ playbook thành nhiều files khác nhau. Mỗi role là một thành phần độc lập, bao gồm nhiều variables, tasks, files, templates, và modules bên dưới.
Việc tổ chức playbook theo role cũng giúp người dùng dễ chia sẻ và tái sử dụng lại playbook với người khác. Đặc biệt trong môi trường doanh nghiệp khi có từ vài trăm tới vài ngàn playbook thì Role chính là cách quản lý các playbook này.
Nhưng mà….Role là gì mới được….không phải playbook thì nó là gì…? Mình vẫn chưa hiểu…?
Ok, nói hơi dông dài rồi, trăm nói không bằng một thấy, mình sẽ cung cấp một số ví dụ bên dưới cho các bạn.
Ví dụ về Role
Sau đây là ví dụ về 1 role đơn giản để cài đặt Prometheus (Đọc Hướng dẫn cài đặt Prometheus để hiểu Prometheus là gì)
– Trong folder ./roles/prometheus
Một role sẽ có 7 folder với các chức năng khác nhau gồm: vars, templates, handlers, files, meta, tasks và defaults. Mỗi một thư mục cần phải chứa 1 file main.yml. Trong đó thì tasks thường là folder quan trọng nhất, thường dùng để chứa những playbook
Trong đó:
- tasks – chứa danh sách các task chính được thực thi trong role này.
- handlers – chứa các handler, có thể được dùng trong role này hoặc các role khác.
- defaults – chứa các biến được dùng default cho role này
- vars – chứa thông tin các biến dùng trong role, biến trong vars sẽ override biến trong default
- files – chứa các file cần dùng để deploy trong role này, cụ thể như file binary, file cài đặt…
- templates – chứa các file template theo jinja format đuôi *.j2 (có thể là file config, file systemd…).
- meta – định nghĩa 1 số metadata của role này, như là dependencies
Một role phải chứa ít nhất 1 trong 7 thư mục này để Ansible có thể hiểu được đó là 1 role. Nếu có những thư mục nào không cần dùng thì ta có thể bỏ ra. Thường thì mình hay dùng nhất là các thư mục tasks, vars, templates, files. Ngoài ra còn có thêm tests nếu bạn muốn viết unit test cho playbook nhưng không bắt buộc và không nằm trong phạm vi bài viết này.
alertmanager ├── README.md ├── defaults │ └── main.yml ├── files │ ├── alertmanager.service │ └── notifications.tmpl ├── handlers │ └── main.yml ├── tasks │ └── main.yml ├── templates │ └── alertmanager.yml.j2 └── vars └── main.yml
Cây thư mục của 1 role
Để dùng 1 role thì ta có thể liệt kê role cần dùng trong 1 play, cụ thể như sau:
--- - name: Setup Monitoring Services hosts: prometheus_group become: yes become_user: root roles: - prometheus - alertmanager - pushgateway
Trong ví dụ trên, ta sẽ setup 3 role lần lượt là prometheus, alertmanager và pushgateway cho host prometheus_group
Để dùng role thì ta cần liệt kê role đó trong 1 play. Các lệnh như copy, script, template trong 1 role có thể tham chiếu tới roles/x/{files,templates,tasks}/ trong role đó mà không cần phải ghi rõ đường dẫn tuyệt đối ra
Một role thường thì cần phải:
- Chạy được trong check mode ansible-playbook –check targets.yml
- Không chạy lại lần 2 nếu playbook không thay đổi (Idempotent!!)
- Nên dùng lệnh assert trong playbook để kiểm tra các điều kiện khi chạy playbook
- Các file config trong folder template nên dùng lệnh validate trước khi copy file
- Chỉ nên trigger các handler khi file config thay đổi
- Nên có sẵn nhiều biến trong defaults nhất có thể
- Dùng một tool version control (git, svm…) để theo dõi sự thay đổi của role
Hướng dẫn viết Role
Sau đây là các bước để viết 1 role trong ansible
- Tạo folder role trước, nếu chưa có. Folder này phải có tên là roles
- Tạo 1 folder trước một role cụ thể, ví dụ như prometheus
- Tạo folder tasks để chứa playbook setup prometheus
- Tạo folder vars để chứa các biến cần dùng trong khi setup prometheus
- Tạo folder files để chứa các file cho role (file .rpm, .deb hoặc file binary…)
- Tạo folder handlers để chứa các handler cần thiết
- Và cuối cùng nhưng không kém phần quan trọng đó là….viết Readme để dễ dàng chia sẻ role này với mọi người :3
Sau đây là hướng dẫn các bước viết từng folder cụ thể
Tasks
Tasks là nơi ta viết các bước setup cụ thể cho role của chúng ta. Viết như 1 playbook bình thường.
Defaults/Vars
Defaults/Vars là nơi để chứa các biến cần thiết cho role. Lưu ý là các biến trong vars sẽ override các biến trong defaults. Khá dễ hiểu đúng không nào
Templates
Templates là nơi bạn chứa các file config cần điểu chỉnh biến, Ansible sẽ lấy các biến có trong defaults/vars để điền vào file template của các bạn. Dùng folder template bằng module template
Ví dụ ta có file ./vars/main.yml chứa các biến cần thiết để bỏ vào template
--- PROMETHEUS_VERSION: "2.12.0" RETENTION_TIME: "90d" CONSUL_SERVER: "10.0.0.18" ALERTMANAGER_SERVER: "10.0.0.180" THANOS_TEAM: "cloudcraft-devops" THANOS_ENV: "live" THANOS_REPLICA_TAG: "C"
Và đây là file ./templates/prometheus.yml.j2 (chú ý đuôi .j2 để Ansible nhận diện được Jinja template)
global: external_labels: thanos_team: '{{ THANOS_TEAM }}' thanos_env: '{{ THANOS_ENV }}' replica: '{{ THANOS_REPLICA_TAG }}' scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: prometheus file_sd_configs: - files: - targets/*.json - targets/*.yml refresh_interval: 5m - job_name: pushgateway honor_labels: true file_sd_configs: - files: - pushgw_targets/*.json refresh_interval: 5m - job_name: test-sd consul_sd_configs: - server: '{{ CONSUL_SERVER }}:8500'
Files
Ta dùng module copy trong playbook để copy các file cần thiết trong folder files mà không cần phải liệt kê đường dẫn tuyệt đối ra (Ansible tự nhận diện đường dẫn).
Handlers
Handlers dùng để trigger một số thao tác như reload/restart/start stop service khi thực hiện một task nào đó trong playbook bằng lệnh notify
Meta
Chứa các thông tin về metadata của role, thường chỉ dùng khi bạn publish role của mình lên Ansible Galaxy. Đây là một nơi mọi người upload và chia sẻ các role mình viết được. Coi thêm tại: https://galaxy.ansible.com/
Readme
Nơi chứa các thông tin cần thiết để người khác có thể hiểu và sử dụng lại role của bạn/
Mặc định thì ansible sẽ kiếm role mà các bạn đã viết trong folder /etc/ansible/roles. Hoặc nếu bạn chạy playbook tại /home/cloudcraft/run_task.yml và trong file playbook này có gọi 1 số roles, Ansible sẽ dò các role cần dùng trong /home/cloudcraft/roles. Nếu không có thì Ansible mới dò trong /etc/ansible/roles
Qua bài viết này, hy vọng các bạn có thể nắm bắt được cách tổ chức 1 role trong Ansible và sử dụng Ansible một cách hiệu quả hơn. Cảm ơn các bạn đã theo dõi.
Các bạn có thể tham khảo thêm một số roles mình đã publish tại đây: https://github.com/nduytg/ansible_roles
Tham khảo
https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html
https://medium.com/edureka/ansible-roles-78d48578aca1