Ansible: Các mẹo giúp tăng tốc độ thực thi của Ansible

Ansible: Các mẹo giúp tăng tốc độ thực thi của Ansible | Chào các bạn chúng ta sẽ cùng bàn luận về một chủ đề liên quan đến tối ưu hoá hoạt động của chương trình Ansible (tự động hoá tác vụ). Khi bản thân mình thường quản trị Ansible để tự động hoá tác vụ thì có một vấn đề thường ưu tiên đó là làm thế nào để cải thiện tốc độ thực thi các tác vụ (task) Ansible trên các máy chủ remote tốt nhất có thể.

Thông thường thì sau đây là 2 lý do cơ bản làm cho Ansible thực thi tác vụ chậm hơn so với các đối thủ khác như Puppet:

  • Linear execution: mặc định Ansible sẽ thực thi các tác vụ hành động theo thứ tự sắp xếp, chứ không chạy đồng thời các các bước cùng một lúc.
  • SSH Connection: tất cả các lệnh Ansible Ad-hoc hay playbook tác vụ đều được thực thi thông qua giao thức kết nối SSH từ Ansible SSH Client đến máy chủ remote.

Vậy trong bài viết này chúng ta sẽ tìm hiểu các cách có thể giúp tăng tốc độ thực thi của Ansible trên các máy chủ remote nhé.

tăng tốc độ thực thi ansible

Có thể bạn cũng quan tâm bài viết khác
Hướng dẫn liệt kê các biến của một host trong Ansible
Hướng dẫn sử dụng lệnh Ansible Ad-Hoc
Ebook Mastering Ansible PDF

Contents

Các mẹo giúp tăng tốc độ thực thi của Ansible

Kiểm tra thời gian thực thi task Ansible với Profiling

Điều đầu tiên bạn cần làm là làm sao đo đạt được kết quả thực thi của các tác vụ nhằm có được giá trị để so sánh giữa cấu hình đã tối ưu hoá và chưa tối ưu hoá. May mắn thay chúng ta đã có plugin “profile_tasks” hỗ trợ Ansible 2.x trở lên, bạn chỉ cần kích hoạt nó trong cấu hình Ansible.

# vi /etc/ansible/ansible.cfg
callback_whitelist = profile_tasks

Giờ bạn thử thực hiện chạy playbook của bạn, sẽ có report về thời gian thực thi các task như dưới.

# ansible-playbook -i host -s test.yml
….
….
PLAY RECAP ********************************************************************
task one --------------------------------------------------------------- 60.71s
task two --------------------------------------------------------------- 23.80s
somehost : ok=2 changed=2 unreachable=0 failed=0

1. Pipelining

Trước khi hiểu phần này, bạn cần nắm được workflow của việc thực thi các tác vụ (task) module Ansible:
– Khởi tạo file python với module chỉ định và các tham số biến truyền vào. File python này sẽ sử dụng cho tác vụ chạy trên máy chủ remote.
– Kết nối SSH đến máy chủ remote khởi tạo thư mục tạm ở thư mục $HOME user kết nối.
– Upload file python lên thư mục tạm.
– Chạy file python tác vụ và khi hoàn tất thì xoá thư mục tạm.
– Lấy thông tin kết quả thực thi tác vụ.

Bạn có thể kiểm tra như sau :

# ansible test -vvv -m ping

SSH: EXEC ssh ...
SSH: EXEC ssh ...
SSH: EXEC sftp ...
SSH: EXEC ssh ... python ... ping.py

Trình tự thực thi tác vụ như trên áp dụng cho toàn bộ các tác vụ module Ansible. Nhìn chung khá là tốn nhiều bước và thời gian để thực thi hết các tác vụ playbook phải không nào. Vậy Pipelining có thể giúp ích gì nào ?

tăng tốc độ ansible - pipeliningPipelining sẽ thay đổi workflow trên bằng cách giảm số lượng hoạt động như miêu tả trên chỉ khi thực thi được một tác vụ module. Bằng cách nào ?! Ansible sẽ thay đổi workflow mới như sau (sau khi bạn kích hoạt Pipelining).

– Khởi tạo file python với module chỉ định và các tham số biến truyền vào.
– Kết nối SSH đến máy chủ remote và khởi chạy trình biên dịch Python.
– Gửi nội dung file python đến trình biên dịch Python như là đầu vào Input. Lúc này Python sẽ khởi chạy nội dung input luôn.
– Nhận kết quả output của trình biên dịch Python phía remote máy chủ.

Lưu ý:
– Bạn cần tắt ‘requiretty‘ cho user remote trong sudoers cho user ssh trên máy chủ remote Linux nếu có xài sudo.

# visudo
Defaults:ansible !requiretty

Để cấu hình Pipelining cho Ansible Server ta cấu hình như dưới

# vi /etc/ansible/ansible.cfg
[ssh_connection]
pipelining = True

2. SSH multiplexing

Với cấu hình SSH multiplexing (Tìm hiểu SSH Multiplexing: https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing) thì Ansible sẽ tận dụng kết nối TCP đang mở để thực hiện nhiều session SSH để thực hiện các task tác vụ liên tiếp thay vì với mỗi task tác vụ Ansible phải đi thực hiện kết nối TCP SSH mới. Mặc định Ansible kích hoạt cấu hình này, nhưng để chắc chắn bạn hãy kiểm tra và cấu hình cụ thể cho chắc chắn.

tăng tốc độ ansible - ssh multiplexing

Ba giá trị sử dụng cho SSH Multiplexing

  • ControlMaster: kích hoạt giữ kết nối TCP SSH .
  • ControlPath: đường dẫn file socket trên Linux giữ kết nối TCP SSH. Giá trị tên file socket này ansible thường tự sản sinh.
  • ControlPersist: thời gian giữ kết nối TCP SSH khi không có hoạt động trước khi đóng kết nối.

Cấu hình kích hoạt SSH Multiplexing

# vi /etc/ansible/ansible.cfg
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=5m

Muốn kiểm tra giá trị cấu hình SSH multiplexing khi chạy Ansible khá là đơn giản:

# ansible -i host -vvvv -m ping
..
<10.12.166.82> SSH: EXEC ssh -vvv -C -o ControlMaster=auto -o ControlPersist=5m -o PreferredAuthentications=publickey .... -o ControlPath=/root/.ansible/cp/9b71fecb9d 10.12.166.82
..

Đôi khi giá trị ‘ControlPath‘ được Ansible sản sinh với tên socket + path đường dẫn rất dài gây ra một vấn đề nhỏ. Ví dụ như khi sử dụng cho máy chủ ảo Amazon EC2 có DNS name là ‘ec2-123-123-123-123.eu-west-1.compute.amazonaws.com‘. Sẽ không được khởi tạo socket do kí tự tổng kí tự path + socket quá dài, lúc này tính năng SSH Multiplexing sẽ không hoạt động. Vì vậy bạn cũng nên cấu hình khởi tạo tên socket cố định linh động ngắn gọn.

Ví dụ :

  • /var/lib/ansible/.ansible/cp/ansible-ssh-ec2-123-123-123-123.eu-west-1.compute.amazonaws.com-22-ubuntu -> dài hơn 103 kí tự.

Thế nên nếu tên quá dài thì hãy thay đổi thư mục cho file socket SSH Multiplexing.

# vi /etc/ansible/ansible.cfg
[ssh_connection]
control_path = /tmp/ansible-ssh-%%h-%%p-%%r

Chú thích:

  • %%h: giá trị remote host
  • %%p: giá trị port
  • %%r: giá trị remote user

3. Tắt cấu hình UseDNS, GSSAPIAuthentication

Hai giá trị UseDNSGSSAPIAuthentication đã được kề cập ở bài  “Cải thiện tốc độ login SSH vào máy chủ remote Linux“.

+ UseDNS
UseDNS là mục cấu hình của dịch vụ SSH trên các máy chủ Linux remote. Với cấu hình này mỗi khi có kết nối SSH đến máy chủ Linux thì dịch vụ SSH sẽ mất một khoảng thời gian ngắn để kiểm tra giá trị PTR-record nhằm phân giải địa chỉ IP kết nối đến sang thông tin hostname. Vô hình chung hoạt động kiểm tra DNS Hostname này làm chậm quá trình kết nối SSH đến máy chủ remote.

Vậy hãy cấu hình tắt mục ‘UseDNS‘ như sau trên máy chủ remote Linux.

# vi /etc/ssh/sshd_config
UseDNS no

+ GSSAPIAuthentication

GSSAPI là viết tắt của Generic Security Services API. GSSAPI là tiêu chuẩn IETF cho việc thực hiện chứng thực được mã hóa mạnh trong các ứng dụng mạng. GSSAPIAuthentication chỉ đơn thuần là một chỉ thị cho phép một tùy chọn xác thực thay thế. Thường thì GSSAPI nằm trong danh sách các phương thức SSH cần kiểm tra trước khi ssh client lựa chọn được phương thức kết nối SSH phù hợp. Hãy tắt chức năng này đi.

# vi /etc/ssh/sshd_config
GSSAPIAuthentication no

4. Điều chỉnh cấu hình PreferredAuthentications

Trên hệ thống Ansible server, khi chương trình SSH Client được khởi chạy để kết nối đến các máy chủ host Linux remote thì ssh client thường sẽ có một danh sách các phương thức kết nối được ưu tiên thử để tìm ra phương thức được phía máy chủ host Linux cho phép. Mặc định Ansible sẽ sử dụng thông tin như sau :

-o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey

Như bạn thấy thì GSSAPI là phương thức kết nối SSH được ưu tiên thử trước, nếu phía máy chủ remote có kích hoạt GSSAPI thì sẽ mất thời gian để kiểm tra kết nối trước khi biết phương thức này có thất bại hay thành công. Thông thường khi sử dụng Ansible, bạn đều cài đặt kết nối SSH bằng public/private key cả. Vậy tại sao không chỉ định rõ phương thức kết nối ưu tiên từ phía máy chủ Ansible ssh client chỉ là public key phải không nào.

tăng tốc độ ansible - preferedauthen

# vi /etc/ansible/ansible.cfg
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o PreferredAuthentications=publickey

5. Tắt thu thập thông tin Facts

Khi bắt đầu khởi chạy một playbook, Ansible sẽ tốn một khoảng thời gian đi thu thập thông tin ‘facts’ (Tìm hiểu về Facts:  LINK) về hệ thống máy chủ Linux remote (host). Đây là một hành động mặc định của Ansible. Nếu bạn không cần các giá trị ‘facts‘ liên quan đến hệ thống Linux remote, thì đơn giản hãy tắt tính năng thu thập ‘facts‘ trong playbook mà bạn định khởi chạy với keyword ‘gather_facts: no‘.

--- 
- name: setup postgres 
  hosts: dbservers 
  gather_facts: no 
  tasks:

6. Forks

Giá trị ‘forks’ trong cấu hình Ansible quy định số lượng tiến trình Ansible được sản sinh để có thể thực hiện cấu hình hoặc chạy tác vụ trên số lượng host song song cùng một thời điểm (parallel). Giá trị mặc định của ‘forks’ là con số 5, tức khi khởi chạy Ansible playbook cho một file inventory host có số lượng host trên 5 , thì cùng một thời điểm Ansible sẽ sản sinh 5 tiến trình để ssh đến 5 remote host nhằm thực hiện tác vụ.

tăng tốc độ ansible - forks

Bạn có thể điều chỉnh số giá trị cấu hình ‘forks’ này lên đến 25 -> 100 là hợp lý nếu inventory host của bạn có quá nhiều hosts remote cần quản lý. Ansible cũng khá thông minh linh động trong việc sản sinh số lượng tiến trình con forks, ví dụ file inventory host của bạn chỉ có 50 host, mà bạn cấu hình mức ‘forks’ lên đến 500, thì Ansible vẫn chỉ sản sinh 50 tiến trình con đúng với 50 host.

Cấu hình forks trong ansible

# vi /etc/ansible/ansible.cfg
[defaults]
forks = 20

7. Sử dụng Ansible version mới

Thời điểm bạn đọc bài viết này thì Ansible đã ở phiên bản 2.x, tốc độ engine xử lý tác vụ được đánh giá tốc độ xử lý là nhanh hơn nhiều so với phiên bản cũ 1.x . Vì vậy nếu bạn đang sử dụng Ansible phiên bản cũ thì đừng ngại ngần cập nhật lên bản mới nhé.

Tổng kết

Như vậy chúng ta đã cùng điểm qua các cách có thể cải thiện tốc độ thưc thi tác vụ của Ansible trên các máy chủ remote. Nếu các bạn còn những mẹo khác để cải thiện tốc độ của Ansible hơn nữa thì đừng ngại comment cùng mình để trao đổi về chủ đề này nhé. Cám ơn các bạn đã theo dõi.

Nguồn: https://cuongquach.com/

Previous articleAnsible: Hướng dẫn liệt kê các biến của một host trong Ansible
Next article[Ebook] Tài liệu lập trình Android Full – FPT Software
Bạn đang theo dõi website "https://cuongquach.com/" nơi lưu trữ những kiến thức tổng hợp và chia sẻ cá nhân về Quản Trị Hệ Thống Dịch Vụ & Mạng, được xây dựng lại dưới nền tảng kinh nghiệm của bản thân mình, Quách Chí Cường. Hy vọng bạn sẽ thích nơi này !