Thứ tư, 08/05/2019 | 00:00 GMT+7

Quản lý cấu hình 101: Viết Playbook Ansible

Tóm lại, quản lý cấu hình server (còn được gọi phổ biến là Tự động hóa CNTT) là một giải pháp để biến quản trị cơ sở hạ tầng của bạn thành một cơ sở mã, mô tả tất cả các quy trình cần thiết để triển khai server trong một tập hợp các tập lệnh cấp phép có thể được tạo version và dễ dàng sử dụng lại. Nó có thể cải thiện đáng kể tính toàn vẹn của bất kỳ cơ sở hạ tầng server nào theo thời gian.

Trong hướng dẫn trước , ta đã nói về những lợi ích chính của việc triển khai chiến lược quản lý cấu hình cho cơ sở hạ tầng server của bạn, cách hoạt động của các công cụ quản lý cấu hình và những điểm chung của những công cụ này.

Phần này của loạt bài sẽ hướng dẫn bạn quá trình tự động hóa việc cung cấp server bằng Ansible, một công cụ quản lý cấu hình cung cấp một khung tự động hóa hoàn chỉnh và khả năng điều phối, đồng thời duy trì mục tiêu là sự đơn giản và tối giản nhất. Ta sẽ tập trung vào thuật ngữ ngôn ngữ, cú pháp và các tính năng cần thiết để tạo một ví dụ đơn giản nhằm tự động hóa hoàn toàn việc triển khai web server Ubuntu 18.04 bằng Apache.

Danh sách sau đây chứa tất cả các bước ta cần tự động hóa để đạt được mục tiêu của bạn :

  1. Cập nhật bộ nhớ cache apt
  2. Cài đặt Apache
  3. Tạo một folder root tài liệu tùy chỉnh
  4. Đặt index.html vào root tài liệu tùy chỉnh
  5. Áp dụng một mẫu để cài đặt server ảo tùy chỉnh của ta
  6. Khởi động lại Apache

Ta sẽ bắt đầu bằng cách xem xét thuật ngữ được sử dụng bởi Ansible, tiếp theo là tổng quan về các tính năng ngôn ngữ chính được dùng để viết playbook. Ở cuối hướng dẫn, bạn sẽ tìm thấy nội dung của một ví dụ cung cấp đầy đủ để tự động hóa các bước được mô tả để cài đặt Apache trên Ubuntu 18.04.

Lưu ý : hướng dẫn này nhằm giúp bạn làm quen với ngôn ngữ Ansible và cách viết sách phát để tự động hóa việc cung cấp server của bạn. Để có cái nhìn giới thiệu hơn về Ansible, bao gồm các bước cần thiết để cài đặt và bắt đầu với công cụ này, cũng như cách chạy các lệnh và sách phát Ansible, hãy xem hướng dẫn Cách cài đặt và cấu hình Ansible trên Ubuntu 18.04 của ta .

Bắt đầu

Trước khi ta có thể chuyển sang một cái nhìn thực tế hơn về Ansible, điều quan trọng là ta phải làm quen với các thuật ngữ và khái niệm quan trọng được giới thiệu bởi công cụ này.

Thuật ngữ

Danh sách sau đây chứa tổng quan nhanh về các thuật ngữ có liên quan nhất được Ansible sử dụng:

  • Control Node : máy mà Ansible được cài đặt, chịu trách nhiệm chạy cấp phép trên các server mà bạn đang quản lý.
  • Khoảng không quảng cáo : file INI chứa thông tin về server bạn đang quản lý.
  • Playbook : một file YAML chứa một loạt các quy trình sẽ được tự động hóa.
  • Tác vụ : một khối xác định một thủ tục sẽ được thực thi, ví dụ: cài đặt một gói.
  • Mô-đun : một module thường tóm tắt một nhiệm vụ hệ thống, như xử lý các gói hoặc tạo và thay đổi file . Ansible có vô số module tích hợp, nhưng bạn cũng có thể tạo các module tùy chỉnh.
  • Role : một tập hợp các sách phát, mẫu và các file khác có liên quan, được tổ chức theo cách xác định trước để tạo điều kiện sử dụng lại và chia sẻ.
  • Chơi : một cung cấp được thực hiện từ đầu đến cuối được gọi là một lần chơi .
  • Dữ kiện : các biến toàn cục chứa thông tin về hệ thống, như network interface hoặc hệ điều hành.
  • Trình xử lý : được sử dụng để kích hoạt các thay đổi trạng thái dịch vụ, như khởi động lại hoặc reload một dịch vụ.

Định dạng tác vụ

Một nhiệm vụ xác định một bước tự động duy nhất sẽ được thực thi bởi Ansible. Nó thường liên quan đến việc sử dụng một module hoặc thực hiện một lệnh thô. Đây là cách một nhiệm vụ trông:

- name: This is a task   apt: name=vim state=latest 

Phần name thực sự là tùy chọn, nhưng được khuyến khích , vì nó hiển thị trong kết quả của cấp phép khi tác vụ được thực thi. Phần apt là một module Ansible được tích hợp sẵn để tóm tắt việc quản lý các gói trên các bản phân phối dựa trên Debian. Tác vụ ví dụ này cho Ansible biết rằng gói vim phải được thay đổi trạng thái latest , điều này sẽ khiến trình quản lý gói cài đặt gói này trong trường hợp nó chưa được cài đặt.

Định dạng Playbook

Playbook là các file YAML chứa một loạt các lệnh để tự động hóa việc cung cấp server . Ví dụ sau là một playbook đơn giản thực hiện hai tác vụ: cập nhật cache apt và cài đặt vim sau đó:

--- - hosts: all   become: true   tasks:      - name: Update apt-cache         apt: update_cache=yes       - name: Install Vim        apt: name=vim state=latest 

YAML dựa vào thụt lề để tuần tự hóa cấu trúc dữ liệu. Vì lý do đó, khi viết playbook và đặc biệt là khi sao chép các ví dụ, bạn cần phải hết sức cẩn thận để duy trì thụt lề chính xác.

Trước khi kết thúc hướng dẫn này, ta sẽ xem một ví dụ thực tế hơn về sách vở, được giải thích chi tiết. Phần tiếp theo sẽ cung cấp cho bạn một cái nhìn tổng quan về các yếu tố và tính năng quan trọng nhất được dùng để viết các vở kịch Ansible.

Viết Playbooks

Đến đây bạn đã quen thuộc với thuật ngữ cơ bản và định dạng tổng quát của sách chơi và tác vụ trong Ansible, ta sẽ tìm hiểu về một số tính năng của sách phát có thể giúp ta tạo ra nhiều tính năng tự động hóa linh hoạt hơn.

Làm việc với các biến

Có nhiều cách khác nhau để bạn có thể xác định các biến trong Ansible. Cách đơn giản nhất là sử dụng phần vars của playbook. Ví dụ dưới đây xác định một package biến sau này được sử dụng bên trong một tác vụ:

--- - hosts: all   become: true   vars:      package: vim   tasks:      - name: Install Package        apt: name={{ package }} state=latest 

Biến package có phạm vi global , nghĩa là nó có thể được truy cập từ bất kỳ điểm nào của quá trình cung cấp, ngay cả từ các file và mẫu được bao gồm.

Sử dụng vòng lặp

Vòng lặp thường được sử dụng để lặp lại một tác vụ sử dụng các giá trị đầu vào khác nhau. Ví dụ: thay vì tạo 10 tác vụ để cài đặt 10 gói khác nhau, bạn có thể tạo một tác vụ duy nhất và sử dụng vòng lặp để lặp lại tác vụ với tất cả các gói khác nhau mà bạn muốn cài đặt.

Để tạo vòng lặp trong một nhiệm vụ, hãy bao gồm tùy chọn with_items với một mảng giá trị. Nội dung có thể được truy cập thông qua item biến vòng lặp, như thể hiện trong ví dụ dưới đây:

- name: Install Packages   apt: name={{ item }} state=latest   with_items:      - vim      - git      - curl   

Bạn cũng có thể sử dụng một biến mảng để xác định các mục của bạn :

--- - hosts: all   become: true   vars:      packages: [ 'vim', 'git', 'curl' ]   tasks:      - name: Install Package        apt: name={{ item }} state=latest        with_items: "{{ packages }}" 

Sử dụng Điều kiện

Các điều kiện được dùng để tự động quyết định xem có nên thực hiện một tác vụ hay không, dựa trên một biến hoặc kết quả kết quả từ một lệnh, chẳng hạn.

Ví dụ sau sẽ chỉ tắt các hệ thống dựa trên Debian:

- name: Shutdown Debian Based Systems   command: /sbin/shutdown -t now   when: ansible_os_family == "Debian" 

Điều kiện when nhận là đối số, một biểu thức được đánh giá. Tác vụ chỉ được thực thi trong trường hợp biểu thức được đánh giá là true . Trong ví dụ của ta , ta đã thử nghiệm một dữ kiện để kiểm tra xem hệ điều hành có phải thuộc họ Debian hay không.

Một trường hợp sử dụng phổ biến cho các điều kiện trong tự động hóa CNTT là khi việc thực thi một tác vụ phụ thuộc vào kết quả của một lệnh. Với Ansible, cách ta thực hiện điều này là đăng ký một biến để lưu giữ kết quả của một lệnh thực thi, sau đó kiểm tra biến này trong một tác vụ tiếp theo. Ta có thể kiểm tra trạng thái thoát của lệnh (nếu thất bại hoặc thành công). Ta cũng có thể kiểm tra các nội dung cụ thể bên trong kết quả , mặc dù điều này có thể yêu cầu sử dụng các biểu thức regex và các lệnh phân tích chuỗi.

Ví dụ tiếp theo cho thấy hai tác vụ có điều kiện dựa trên kết quả kết quả từ lệnh php -v . Ta sẽ kiểm tra trạng thái thoát của lệnh, vì ta biết nó sẽ không thực thi trong trường hợp PHP không được cài đặt trên server này. Phần ignore_errors của tác vụ rất quan trọng đảm bảo việc cấp phép vẫn tiếp tục ngay cả khi lệnh không thực thi được.

- name: Check if PHP is installed   register: php_installed   command: php -v   ignore_errors: true  - name: This task is only executed if PHP is installed   debug: var=php_install   when: php_installed|success  - name: This task is only executed if PHP is NOT installed   debug: msg='PHP is NOT installed'   when: php_installed|failed 

Mô-đun debug được sử dụng ở đây là một module hữu ích để hiển thị nội dung của các biến hoặc thông báo gỡ lỗi. Nó có thể in một chuỗi (khi sử dụng đối số msg ) hoặc in nội dung của một biến (khi sử dụng đối số var ).

Làm việc với các mẫu

Các mẫu thường được sử dụng để cài đặt các file cấu hình, cho phép sử dụng các biến và các tính năng khác nhằm mục đích làm cho các file này linh hoạt hơn và có thể tái sử dụng. Ansible sử dụng công cụ mẫu Jinja2 .

Ví dụ sau là mẫu để cài đặt server ảo Apache, sử dụng một biến để cài đặt root tài liệu cho server này:

<VirtualHost *:80>     ServerAdmin webmaster@localhost     DocumentRoot {{ doc_root }}      <Directory {{ doc_root }}>         AllowOverride All         Require all granted     </Directory> </VirtualHost> 

template module dựng template được sử dụng để áp dụng mẫu từ một nhiệm vụ. Nếu bạn đặt tên file mẫu ở trên vhost.tpl và bạn đặt nó trong cùng folder với playbook của bạn , thì đây là cách bạn áp dụng mẫu để thay thế server ảo Apache mặc định:

- name: Change default Apache virtual host   template:      src: vhost.tpl     dest: /etc/apache2/sites-available/000-default.conf 

Xác định và kích hoạt các trình xử lý

Trình xử lý được sử dụng để kích hoạt thay đổi trạng thái trong dịch vụ, chẳng hạn như khởi động lại hoặc dừng . Mặc dù chúng có thể trông khá giống với các việc thông thường, các trình xử lý chỉ được thực thi khi được kích hoạt trước đó từ một chỉ thị notify trong một tác vụ. Chúng thường được định nghĩa là một mảng trong phần handlers của playbook, nhưng chúng cũng có thể nằm trong các file riêng biệt.

Hãy xem xét ví dụ sử dụng mẫu trước đây của ta , nơi ta cài đặt server ảo Apache. Nếu bạn cần đảm bảo Apache được khởi động lại sau khi thay đổi server ảo, trước tiên bạn cần tạo một trình xử lý cho dịch vụ Apache. Đây là cách các trình xử lý được xác định bên trong một playbook:

handlers:     - name: restart apache       service: name=apache2 state=restarted      - name: other handler       service: name=other state=restarted 

Chỉ thị name ở đây rất quan trọng vì nó sẽ là định danh duy nhất của trình xử lý này. Để kích hoạt trình xử lý này từ một tác vụ, bạn nên sử dụng tùy chọn notify :

- name: Change default Apache virtual host   template:      src: vhost.tpl     dest: /etc/apache2/sites-available/000-default.conf   notify: restart apache 

Ta đã thấy một số tính năng quan trọng nhất mà bạn có thể sử dụng để bắt đầu viết sách phát Ansible. Trong phần tiếp theo, ta sẽ đi sâu vào một ví dụ thực tế hơn về một playbook sẽ tự động cài đặt và cấu hình Apache trên Ubuntu.

Playbook mẫu

Bây giờ ta hãy xem một playbook sẽ tự động cài đặt web server Apache trong hệ thống Ubuntu 18.04, như được thảo luận trong phần giới thiệu của hướng dẫn này.

Bạn có thể tìm thấy ví dụ đầy đủ, bao gồm file mẫu để cài đặt Apache và file HTML được web server cung cấp trên Github . Thư mục này cũng chứa Vagrantfile cho phép bạn kiểm tra playbook trong một cài đặt đơn giản, sử dụng một máy ảo do Vagrant quản lý.

Nội dung Playbook

Toàn bộ nội dung của sách vở có sẵn tại đây để bạn tiện theo dõi:

playbook.yml
  • ---
  • - hosts: all
  • become: true
  • vars:
  • doc_root: /var/www/example
  • tasks:
  • - name: Update apt
  • apt: update_cache=yes
  • - name: Install Apache
  • apt: name=apache2 state=latest
  • - name: Create custom document root
  • file: path={{ doc_root }} state=directory owner=www-data group=www-data
  • - name: Set up HTML file
  • copy: src=index.html dest={{ doc_root }}/index.html owner=www-data group=www-data mode=0644
  • - name: Set up Apache virtual host file
  • template: src=vhost.tpl dest=/etc/apache2/sites-available/000-default.conf
  • notify: restart apache
  • handlers:
  • - name: restart apache
  • service: name=apache2 state=restarted

Hãy xem xét từng phần của sách vở này chi tiết hơn:

server : tất cả
Playbook bắt đầu bằng cách nói rằng nó phải được áp dụng cho all server trong repository của bạn ( hosts: all ). Có thể hạn chế việc thực thi playbook đối với một server cụ thể hoặc một group server . Tùy chọn này có thể được overrides tại thời điểm thực thi.

trở thành sự thật
Phần become: true yêu cầu Ansible sử dụng nâng cấp quyền (sudo) để thực hiện tất cả các việc trong playbook này. Tùy chọn này có thể được overrides trên cơ sở từng nhiệm vụ.

vars
Định nghĩa một biến, doc_root , sau này được sử dụng trong một tác vụ. Phần này có thể chứa nhiều biến.

nhiệm vụ
Phần nơi các nhiệm vụ thực tế được xác định. Tác vụ đầu tiên cập nhật cache apt và tác vụ thứ hai cài đặt gói apache2 .

Nhiệm vụ thứ ba sử dụng tệp module được tích hợp sẵn để tạo một folder dùng làm folder root tài liệu của ta . Mô-đun này được dùng để quản lý file và folder .

Nhiệm vụ thứ tư sử dụng bản sao module để sao chép file local vào server từ xa. Ta đang sao chép một file HTML đơn giản để được cung cấp dưới dạng trang web của ta do Apache lưu trữ.

người xử lý
Cuối cùng, ta có phần handlers , nơi các dịch vụ được khai báo. Ta xác định trình xử lý restart apache được thông báo từ tác vụ thứ tư, nơi mẫu Apache được áp dụng.

Chạy Playbook

Sau khi tải nội dung của playbook này xuống nút điều khiển Ansible, bạn có thể sử dụng ansible-playbook để thực thi nó trên một hoặc nhiều nút từ khoảng không quảng cáo của bạn . Lệnh sau sẽ thực thi playbook trên tất cả các server từ file khoảng không quảng cáo mặc định của bạn, sử dụng xác thực cặp SSH key để kết nối với quyền là user hệ thống hiện tại:

  • ansible-playbook playbook.yml

Bạn cũng có thể sử dụng -l để giới hạn việc thực thi cho một server duy nhất hoặc một group server từ khoảng không quảng cáo của bạn :

  • ansible-playbook -l host_or_group playbook.yml

Nếu bạn cần chỉ định một user SSH khác để kết nối với server từ xa, bạn có thể đưa đối số -u user vào lệnh đó:

  • ansible-playbook -l host_or_group playbook.yml -u remote-user

Để biết thêm thông tin về cách chạy các lệnh Ansible và playbook, vui lòng tham khảo hướng dẫn của ta về Cách cài đặt và cấu hình Ansible trên Ubuntu 18.04 .

Kết luận

Ansible là một công cụ tự động hóa CNTT tối giản có đường cong học tập thấp, sử dụng YAML cho các tập lệnh cung cấp của nó. Nó có một số lượng lớn các module tích hợp được dùng cho các việc trừu tượng như cài đặt các gói và làm việc với các mẫu. Các yêu cầu về cơ sở hạ tầng được đơn giản hóa và ngôn ngữ đơn giản của nó có thể phù hợp cho những ai đang bắt đầu quản lý cấu hình. Tuy nhiên, nó có thể thiếu một số tính năng nâng cao mà bạn có thể tìm thấy bằng các công cụ phức tạp hơn như Puppet và Chef.

Trong phần tiếp theo của loạt bài này , ta sẽ thấy tổng quan thực tế về Puppet, một công cụ quản lý cấu hình phổ biến và được cài đặt tốt sử dụng DSL tùy chỉnh mạnh mẽ và rõ ràng dựa trên Ruby để viết các tập lệnh cung cấp.


Tags:

Các tin liên quan