Playbook định nghĩa một tập hợp các tác vụ được Ansible thực hiện trên một nhóm các nút được quản lý. Trong khi bạn có thể sử dụng Ansible để thực hiện các tác vụ một lần thông qua dòng lệnh, Playbook có thể được sử dụng lại, chia sẻ giữa các nhóm, kiểm soát phiên bản và hỗ trợ các yêu cầu triển khai và triển khai phức tạp. Bạn có thể sử dụng các tính năng như trình xử lý, biến, mẫu, xử lý lỗi và logic điều khiển trong Playbook của mình để tự động hóa thông minh các quy trình CNTT của bạn trên một nhóm máy chủ.
Phạm vi của Hướng dẫn này
Hướng dẫn này cung cấp phần giới thiệu về các khái niệm Ansible Playbook, như tác vụ, vở kịch, biến và mẫu Jinja. Trong các ví dụ của hướng dẫn này, bạn sẽ tạo Playbook để tự động hóa các mục sau:
- Tạo tài khoản người dùng giới hạn trên Linode
- Các tác vụ thiết lập máy chủ phổ biến, như đặt tên máy chủ, múi giờ và cập nhật phần mềm hệ thống
- Cài đặt ngăn xếp LAMP
Trước khi bạn bắt đầu
- Nếu bạn chưa quen với Ansible, hãy xem lại phần Định nghĩa về Ansible trong hướng dẫn Bắt đầu với Ansible .
- Cài đặt Ansible trên máy tính hoặc Linode của bạn bằng cách làm theo các bước trong phần Thiết lập Nút điều khiển của hướng dẫn Bắt đầu với Ansible .
- Triển khai Linode chạy Ubuntu 22.04 LTS để quản lý bằng Ansible. Tất cả Playbook được tạo trong hướng dẫn này sẽ được thực thi trên Linode này. Làm theo Bắt đầu với Ansible – Cài đặt và thiết lập cơ bản để tìm hiểu cách thiết lập kết nối giữa nút điều khiển Ansible và Linode của bạn.Ghi chúKhi làm theo hướng dẫn Bắt đầu với Ansible để triển khai Linode, bạn không cần phải thêm cặp khóa SSH của nút điều khiển Ansible vào Linode được quản lý của mình. Bước này sẽ được hoàn thành bằng Playbook sau trong hướng dẫn này.
Cơ bản về Playbook
Ansible Playbook được viết bằng cú pháp YAML, một ngôn ngữ khai báo, để mô tả các tác vụ hoặc hành động thực thi trên một nhóm các nút được quản lý. Các tác vụ Playbook được chạy theo thứ tự từ trên xuống dưới. Bạn nên thiết kế Playbook của mình để có tính bất biến, nghĩa là Playbook có thể chạy một lần hoặc nhiều lần với cùng một kết quả mong đợi. Ví dụ: Playbook có thể khai báo một tác vụ để thiết lập tệp cấu hình máy chủ bằng cách sử dụng mẫu và đưa các giá trị biến đã khai báo vào tệp. Trong trường hợp này, Ansible phải có khả năng so sánh tệp cấu hình mẫu với tệp thực tế trên máy chủ và chỉ tạo hoặc cập nhật tệp đó nếu cần thiết.
Giải phẫu của một Playbook
Ví dụ bên dưới hiển thị bộ khung của Playbook. Về cơ bản nhất, Playbook sẽ định nghĩa một nhóm máy chủ đích, các biến để sử dụng trong Playbook, một người dùng từ xa để thực hiện các tác vụ như, và một tập hợp các tác vụ được đặt tên để thực hiện bằng cách sử dụng các mô-đun Ansible khác nhau . Nhóm này trong Playbook được gọi là play và một Playbook có thể chứa nhiều play.
Mô-đun | Cách sử dụng |
---|---|
yêu cầu | Thực hiện lệnh trên một nút từ xa. |
kịch bản | Chuyển một tập lệnh cục bộ đến một nút được quản lý và sau đó chạy tập lệnh đó trên nút từ xa. |
vỏ bọc | Thực hiện lệnh thông qua shell ( /bin/sh ) trên một nút từ xa. |
bản mẫu | Sử dụng mẫu tệp cục bộ để tạo tệp trên một nút từ xa. |
thích hợp | Quản lý các gói apt trên hệ thống Debian hoặc Ubuntu. |
git | Triển khai phần mềm hoặc tệp tin từ git checkouts. |
dịch vụ | Quản lý các dịch vụ trên hệ thống nút từ xa của bạn. Hỗ trợ BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart init systems. |
---
- hosts: [target hosts]
vars:
var1: [value 1]
var2: [value 2]
remote_user: [yourname]
tasks:
- name: [task 1]
module:
- name: [task 2]
module:
Ví dụ thứ hai Playbook nhắm mục tiêu đến tất cả các máy chủ trong marketing_servers
nhóm và đảm bảo Apache được khởi động. Nhiệm vụ được hoàn thành với tư cách là webadmin
người dùng.
---
- hosts: [marketing_servers]
remote_user: webadmin
tasks:
- name: Ensure the Apache daemon has started
service: name=httpd state=started
become: yes
become_method: sudo
Thiết lập máy chủ web với Ansible Playbooks
Trong ví dụ này, bạn sẽ tạo ba Playbook khác nhau để cấu hình Linode của bạn như một máy chủ web chạy ngăn xếp LAMP. Bạn cũng sẽ cấu hình Linode để thêm một tài khoản người dùng giới hạn. Các Playbook sẽ cung cấp các cấu hình cơ bản mà bạn có thể mở rộng nếu cần.
Quan trọng: Các Playbook được tạo trong phần này nhằm mục đích học tập và sẽ không tạo ra một máy chủ được bảo mật hoặc an toàn hoàn toàn. Để bảo mật Linode của bạn hơn nữa, bạn có thể sử dụng mô-đun firewalld của Ansible .
Thêm tài khoản người dùng có giới hạn
Trong phần này, bạn sẽ tạo một Playbook để thêm tài khoản người dùng giới hạn vào Linode của mình.
Tạo một Hash mật khẩu
Khi tạo tài khoản người dùng giới hạn, bạn phải tạo mật khẩu đăng nhập máy chủ cho người dùng mới. Vì bạn không bao giờ nên đưa mật khẩu dạng văn bản thuần túy vào Playbook của mình, trong phần này, bạn sẽ sử dụng thư viện Python passlib để tạo băm mật khẩu mà bạn có thể đưa vào Playbook của mình một cách an toàn.
Ghi chú: Ansible Vault cũng có thể được sử dụng để mã hóa dữ liệu nhạy cảm. Hướng dẫn này sẽ không sử dụng Ansible Vault, tuy nhiên, bạn có thể tham khảo hướng dẫn Cách sử dụng Mô-đun Linode Ansible để Triển khai Linode để xem ví dụ sử dụng tính năng này.
1.Trên nút điều khiển Ansible của bạn, hãy tạo một băm mật khẩu để Ansible sử dụng ở bước sau. Một phương pháp dễ dàng là sử dụng thư viện PassLib của Python, có thể được cài đặt bằng các lệnh sau:
2.Cài đặt pip, trình cài đặt gói cho Python, trên nút điều khiển của bạn nếu bạn chưa cài đặt:
sudo apt install python-pip
3.Cài đặt thư viện passlib:
sudo pip install passlib
4.Tạo băm mật khẩu bằng passlib. Thay thế myPlainTextPassword
bằng mật khẩu bạn muốn sử dụng để truy cập Linode của mình.
sudo python -c "from passlib.hash import sha512_crypt; print (sha512_crypt.hash('myPlainTextPassword'))"
Một kết quả tương tự sẽ xuất hiện hiển thị mã băm mật khẩu của bạn:
$6$rounds=656000$dwgOSA/I9yQVHIjJ$rSk8VmlZSlzig7tEwIN/tkT1rqyLQp/S/cD08dlbYctPjdC9ioSp1ykFtSKgLmAnzWVM9T3dTinrz5IeH41/K1
5.Sao chép và dán mã băm vào nơi nào đó mà bạn có thể dễ dàng truy cập để thực hiện bước sau.
Vô hiệu hóa kiểm tra khóa máy chủ
Ansible sử dụng chương trình trợ giúp sshpass để xác thực SSH.
1.Đảm bảo sshpass được cài đặt trên nút điều khiển của bạn:
sudo apt-install sshpass
2.sshpass yêu cầu kiểm tra khóa máy chủ phải bị vô hiệu hóa trên nút điều khiển Ansible của bạn. Mở /etc/ansible/ansible.cfg
tệp cấu hình trong trình soạn thảo văn bản bạn chọn, thay đổi giá trị sau thành “False” và lưu các thay đổi của bạn.
;host_key_checking=False
Tạo tệp hàng tồn kho
Để nhắm mục tiêu Linode của bạn trong Playbook, bạn sẽ cần thêm nó vào tệp kiểm kê của nút điều khiển Ansible.
1.Chỉnh sửa tệp hàng tồn kho của bạn để tạo webserver
nhóm và thêm Linode của bạn vào nhóm. Mở tệp /etc/ansible/hosts
trong trình soạn thảo văn bản ưa thích của bạn và thêm thông tin sau. Thay thế 192.0.2.0
bằng địa chỉ IP của Linode.
[webserver]
192.0.2.17
Tạo sổ tay hướng dẫn tài khoản người dùng có giới hạn
Bây giờ bạn đã sẵn sàng để tạo Sổ tay Tài khoản Người dùng Giới hạn. Sổ tay này sẽ tạo một người dùng mới trên Linode của bạn, thêm khóa công khai SSH của nút điều khiển Ansible vào Linode và thêm người dùng mới vào tệp Linode sudoers
.
1.Trong thư mục home của bạn, hãy tạo một tệp có tên limited_user_account.yml
và thêm nội dung của ví dụ. Thay thế các giá trị sau trong tệp:
yourusername
với tên người dùng bạn muốn tạo trên Linode
$6$rounds=656000$W.dSl
bằng mã băm mật khẩu mà bạn tạo trong phần Tạo mã băm mật khẩu của hướng dẫn.
---
- hosts: webserver
remote_user: root
vars:
NORMAL_USER_NAME: 'yourusername'
tasks:
- name: "Create a secondary, non-root user"
user: name={{ NORMAL_USER_NAME }}
password='$6$rounds=656000$W.dSl'
shell=/bin/bash
- name: Add remote authorized key to allow future passwordless logins
authorized_key: user={{ NORMAL_USER_NAME }} key="{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
- name: Add normal user to sudoers
lineinfile: dest=/etc/sudoers
regexp="{{ NORMAL_USER_NAME }} ALL"
line="{{ NORMAL_USER_NAME }} ALL=(ALL) ALL"
state=present
- Hai dòng đầu tiên của tệp yêu cầu Ansible nhắm mục tiêu vào
webserver
nhóm máy chủ trong tệp kiểm kê và thực hiện các tác vụ máy chủ từ xa với tư cách làroot
người dùng. - Phần này
vars
tạo ra nhữngNORMAL_USER_NAME
thứ có thể được sử dụng lại trong toàn bộ Playbook. Ansible cũng cho phép bạn tạo và sử dụng các biến trong các tệp riêng biệt, thay vì trực tiếp trong Playbook của bạn. Để tìm hiểu sâu hơn về nhiều cách bạn có thể sử dụng các biến với Ansible, hãy xem tài liệu chính thức của Ansible về Sử dụng Biến . - Khối
tasks
Playbook khai báo ba tác vụ. Tác vụ đầu tiên tạo người dùng mới và mật khẩu người dùng. Tác vụ thứ hai thêm khóa SSH công khai của nút điều khiển Ansible vào Linode. Tác vụ thứ ba thêm người dùng mới vào tệp sudoers. - Mỗi tác vụ đều sử dụng Jinja template, (tức là
{{ NORMAL_USER_NAME }}
), để truy cập các giá trị biến được tham chiếu. Jinja template là một tính năng mạnh mẽ của Ansible cho phép bạn truy cập vào logic điều khiển, bộ lọc, tra cứu và chức năng trong Playbook của bạn. Để tìm hiểu thêm, hãy tham khảo tài liệu chính thức của Ansible .
2.Chạy limited_user_account.yml
Playbook. --ask-pass
Tùy chọn này yêu cầu Ansible đăng nhập vào Linode bằng xác thực mật khẩu, thay vì SSH, vì khóa SSH công khai của bạn vẫn chưa được lưu trữ ở đó. -u root
Tùy chọn này hướng dẫn Ansible đăng nhập với tư cách là người dùng root. Theo mặc định, Ansible sẽ sử dụng tên người dùng cục bộ hiện tại của bạn là một tên người dùng không được cung cấp.
ansible-playbook --ask-pass -u root limited_user_account.yml
Bạn sẽ thấy đầu ra từ Ansible báo cáo rằng cả ba tác vụ đều hoàn thành thành công với trạng thái “đã thay đổi”. Bây giờ chúng ta có thể làm việc với playbook mới bằng tài khoản người dùng và khóa giới hạn của mình.
Cấu hình hệ thống cơ sở
Playbook tiếp theo sẽ hướng dẫn một số tác vụ thiết lập máy chủ phổ biến, chẳng hạn như cài đặt múi giờ, cập nhật tệp máy chủ và cập nhật các gói.
1.Tạo một tệp trong thư mục gốc của bạn có tên common_server_setup.yml
và thêm nội dung của ví dụ. Thay thế các giá trị sau trong tệp:
yourusername
với tên người dùng bạn đã tạo trong phần Tạo sổ tay hướng dẫn tài khoản người dùng có giới hạn của hướng dẫn
web01
bằng tên máy chủ bạn muốn đặt cho Linode của mình.
Nếu bạn có tên miền muốn thiết lập, hãy thay thế www.example.com
bằng tên miền đó.
---
- hosts: webserver
remote_user: yourusername
become: yes
become_method: sudo
vars:
LOCAL_HOSTNAME: 'web01'
LOCAL_FQDN_NAME: 'www.example.com'
tasks:
- name: Set the timezone for the server to be UTC
command: ln -sf /usr/share/zoneinfo/UTC /etc/localtime
- name: Set up a unique hostname
hostname: name={{ LOCAL_HOSTNAME }}
- name: Add the server's domain to the hosts file
lineinfile: dest=/etc/hosts
regexp='.*{{ item }}$'
line="{{ hostvars[item].ansible_default_ipv4.address }} {{ LOCAL_FQDN_NAME }} {{ LOCAL_HOSTNAME }}"
state=present
when: hostvars[item].ansible_default_ipv4.address is defined
with_items: "{{ groups['webserver'] }}"
- name: Update packages
apt: update_cache=yes upgrade=dist
- Nhiệm vụ đầu tiên trong Playbook này sử dụng
command
mô-đun để thiết lập múi giờ của Linode theo giờ UTC. - Nhiệm vụ thứ hai sử dụng
hostname
mô-đun để đặt tên máy chủ của hệ thống. - Nhiệm vụ thứ ba cập nhật tệp máy chủ của Linode bằng
lineinfile
mô-đun. Nhiệm vụ này dùnghostvars
để truy xuất địa chỉ IP của máy chủ và sử dụng nó để cập nhật tệp máy chủ.hostvars
là một biến đặc biệt được dành riêng mà bạn có thể sử dụng để truy cập nhiều thông tin khác nhau về máy chủ của mình. - Nhiệm vụ thứ tư là cập nhật các gói hệ thống của bạn bằng
apt
mô-đun.
2.Chạy common_server_setup.yml
Playbook. Điều này --ask-become-pass
yêu cầu Ansible yêu cầu bạn nhập mật khẩu của tài khoản người dùng bị giới hạn để become
người dùng sudo và thực thi Playbook thông qua tài khoản người dùng bị giới hạn.
Ghi chú: Theo mặc định, Ansible sẽ sử dụng tên người dùng hệ thống cục bộ hiện tại của bạn để xác thực với Linode. Nếu tên người dùng cục bộ của bạn không giống với tên tài khoản người dùng giới hạn của Linode, bạn sẽ cần phải chuyển tùy -u
chọn cùng với tên tài khoản người dùng giới hạn để xác thực phù hợp. Đảm bảo bạn thay thế limitedUserAccountName
bằng tên tài khoản người dùng giới hạn mà bạn đã tạo trong phần Tạo sổ tay hướng dẫn tài khoản người dùng giới hạn của hướng dẫn.
ansible-playbook common_server_setup.yml --ask-become-pass -u limitedUserAccountName
- Khi Playbook bắt đầu thực thi, bạn sẽ được nhắc nhập
BECOME password:
. Đây là mật khẩu bạn đã tạo trong phần Tạo băm mật khẩu của hướng dẫn. - Khi Playbook thực thi, bạn sẽ lại thấy các tác vụ hiển thị là “đã thay đổi”.
- Việc cập nhật các gói có thể mất vài phút.
Cài đặt Stack
Bây giờ bạn đã sẵn sàng tạo setup_webserver.yml
Playbook để thiết lập Linode của bạn với Apache, PHP và cơ sở dữ liệu MySQL thử nghiệm.
1.Thực hiện theo các bước trong phần Tạo băm mật khẩu của hướng dẫn để tạo băm mật khẩu mới để sử dụng trong Playbook này.
2.Tạo một tệp trong thư mục gốc của bạn có tên setup_webserver.yml
và thêm nội dung của ví dụ. Thay thế các giá trị sau trong tệp:
yourusername
với tên người dùng bạn đã tạo trong phần Tạo sổ tay hướng dẫn tài khoản người dùng có giới hạn của hướng dẫn
Trong Create a new user for connections
tác vụ, hãy thay thế giá trị password
bằng mật khẩu bạn muốn.
Ghi chú: Để tránh sử dụng mật khẩu dạng văn bản thuần túy trong Playbook của bạn, bạn có thể sử dụng Ansible-Vault và các biến để mã hóa dữ liệu nhạy cảm. Bạn có thể tham khảo hướng dẫnCách sử dụng Mô-đun Linode Ansible để Triển khai Linodes để xem ví dụ sử dụng tính năng này.
---
- hosts: webserver
remote_user: yourusername
become: yes
become_method: sudo
tasks:
- name: "Install Apache, MySQL, and PHP"
apt:
pkg:
- apache2
- mysql-server
- python3-mysqldb
- php
- php-pear
- php-mysql
state: present
- name: "Turn on Apache and MySQL and set them to run on boot"
service: name={{ item }} state=started enabled=yes
with_items:
- apache2
- mysql
- name: Create a test database
community.mysql.mysql_db:
name: testDb
state: present
- name: Create a new user for connections
community.mysql.mysql_user:
name: webapp
password: 'yourpassword'
priv: '*.*:ALL'
state: present
- Nhiệm vụ đầu tiên xử lý việc cài đặt Apache, MySQL và PHP.
- Nhiệm vụ tiếp theo đảm bảo Apache và MySQL vẫn chạy sau khi khởi động lại hệ thống. Nhiệm vụ này sử dụng vòng lặp để điền giá trị của
service
tên. - Tiếp theo, Playbook tạo một cơ sở dữ liệu MySQL có tên là
testDB
- Cuối cùng, một người dùng MySQL mới có tên
webapp
được tạo ra.
3.Chạy playbook từ máy điều khiển của bạn bằng lệnh sau:
ansible-playbook setup_webserver.yml --ask-become-pass
4.Khi playbook này thực thi xong, hãy truy cập địa chỉ IP hoặc FQDN của Linode để xem trang chỉ mục Ubuntu Apache mặc định.
5.Đăng nhập vào Linode mà bạn vừa cấu hình qua SSH và kiểm tra xem nó testDb
đã thực sự được tạo hay chưa:
sudo mysql -u webapp -p
show databases;
6.Nếu muốn, bạn thậm chí có thể tạo một trang PHP mẫu và đưa vào /var/www/html
để kiểm tra xem PHP có hoạt động trên máy chủ hay không.
Các bước tiếp theo
Bây giờ bạn đã quen thuộc với Playbooks, bạn có thể tiếp tục tìm hiểu thêm về Ansible. GitHub của Ansible cung cấp một số ví dụ về Playbooks mà bạn có thể tham khảo để tìm hiểu các tùy chọn và mẫu triển khai khác nhau. Dưới đây là một số chủ đề bạn có thể khám phá để tìm hiểu cách xây dựng Playbooks phức tạp hơn:
- Sổ tay hướng dẫn Ansible (GitHub)
- Tài liệu Ansible
- Các chủ đề quan trọng tiếp theo:
Nguồn: https://www.linode.com/docs/guides/running-ansible-playbooks/