(update: 2022)
Ansible là gì:
Việc cài đặt và cấu hình các máy chủ thường được ghi chép lại trong tài liệu dưới dạng các câu lệnh đã chạy, với giải thích kèm theo. Cách thức này gây mệt mỏi cho quản trị viên vì phải làm theo từng bước ở mỗi máy khi thiết lập mới, và có thể dẫn đến sai lầm, thiếu sót. (trích: bachkhoa-aptech)
Ansible giúp cấu hình "nhiều" server theo tùy biến rất đa dạng, giảm thiểu thời gian thao tác trên từng server được cài đặt
Step 1.Cài đặt ansible:
# Cài đặt trên Ubuntu
apt-add-repository -y ppa:ansible/ansible
apt-get update
apt-get install -y ansible
# Cài đặt trên centos
yum install epel-release
yum install ansible
2: Inventory Host - Bước đi đầu tiên
Đầu tiên cần khai báo host_group để dễ gọi các khối server. Ví dụ ta muốn cài apache2/nginx lên server API, cài mysql lên server db, cài java + deploy process lên khối Job/backend... Ở đây cần quy hoạch từng khối để dễ gọi lệnh ansible về sau.
vim /etc/ansible/hosts
[local]
127.0.0.1 [apiserver]
192.168.88.2 [jobserver]
192.168.89.100
192.168.89.101 [dbservers]
192.168.90.200
192.168.90.201
Cấu trúc lệnh gọi ansible sẽ như sau:
# ansible [tên host] -m [tên module] -a [tham số truyền vào module]
Lệnh thứ 1. Basic nhất có thể: ( -m là loại module, -k là nhập password, , -u là user, -i là đường dẫn host define)
Tình huống: Tôi muốn ping đến host API xem có thể kết nối để cài đặt hay không
$$ ansible apiserver -m ping -u tuanda -k
SSH password: (nhập pass của host api)
192.168.88.2 | SUCCESS => { "changed": false, "ping": "pong"
}
Nếu chạy lỗi như sau: "**bash: /usr/bin/python: No such file or directory"** thì bạn cần phải cài python trên client. Ngoài ra nên cài thêm python3
- Cả 2 bước trên chỉ là demo cơ bản. Các option -k -K -s nhớ rất mất thời gian. Vì vậy ta sẽ đặt "ssh-key" để quản lý Ansible tập trung và các client. Ta có thể đặt trong file /etc/ansible/hosts (về sau nên sử dụng sshkey, sẽ rất thuận tiện)
Bước 1: Tạo ssh-key
# ssh-keygen -t rsa (ấn Enter nhiều lần)
# ssh-copy-id _@.com (thực hiện trên tất cả các client mà bạn muốn join vào ansible)
# ssh-copy-id _@.com
# ssh-copy-id _@.com
.... Chạy lệnh:
$$ ansible apiserver -m shell -a "whoami"
192.168.88.2 | CHANGED | rc=0 >>
tuanda
Một số câu lệnh cơ bản.
*# ansible [tên host cần gọi] -m [tên module] -a [tham số truyền vào module]*
-i : inventory host. Trỏ thư viện group_host cần gọi, mặc định nếu không có -i thì sẽ gọi /etc/ansible/hosts
-m : gọi module của ansible
-a : command_argument gửi kèm theo module mà ta đang gọi
-u : user
-vvvv : debug option $$ ansible apiserver -m ping (giải thích: gọi ping toàn bộ các hosts trong /etc/ansible/hosts)
$$ ansible apiserver -m command -a uptime
$$ ansible apiserver -a uptime (Default, ansible sẽ cho module = "command")
$$ ansible apiserver -m shell -a 'top -bcn1 | head' (giải thích: chạy lệnh shell ở remote client![](https://images.viblo.asia/8335ed0c-7cfe-41b6-b7cf-bd37e05979a7.png)
)
- restart mysql
$$ ansible dbserver -m service -a "name=mysql state=restarted" Tất cả module của ansible bạn có thể tham khảo ở đây http://docs.ansible.com/ansible/list_of_all_modules.html . Được chia các module chính như: db, file, monitor, network, package, storage, web, cloud....
Phần 2: Ansible playbook
Chúng ta ko rảnh để gõ lại từng lệnh phía trên phải không. Ta sẽ cần viết ra các file playbook và lưu lại. Playbook đơn giản có mẫu như sau (check ping và cài đặt apache2 trên ubuntu client)
---
- hosts: local tasks: - name: Ping check host ping: ~ - name: Install Apache2 apt: name=apache2 update_cache=yes
- Với CentOS, ta chỉ cần đổi apt thành yum. Bài toán nâng cao hơn 1 chút là cài Apache2 + deploy đơn giản .config file , deploy .html file. Ở phần sau tôi sẽ hướng dẫn các bạn config cho ansible tự detect OS và chọn apt/yum riêng.
- hosts: servertest become: true tasks: ########## Cài đặt gói tin httpd và start . - name: Install HTTP yum: name=httpd state=latest - name: Start HTTPD after install service: name=httpd state=started
########### Deploy config
#backup - name: Backup config HTTP (backup from client) command: cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.backup1
#Deploy - name: Deploy config httpd template: src: "/etc/ansible/config/httpd.conf" dest: "/etc/httpd/conf/httpd.conf" owner: root group: root mode: 0644
########### Đẩy code về client - name: Deploy web file template: src: "/etc/ansible/config/index.html" dest: "/var/www/html/index.html" ########### Khởi động lại apache để áp dụng config - name: Start HTTPD after install service: name=httpd state=restarted
Dưới task sẽ là các module để chạy. Module yum : để install gói tin http. Module service: để chạy lệnh "service httpd start". Module command: để chạy lệnh trên client. Modudle Template: là copy file từ ansible server tới client. Ngoài ra còn gán biến cho các file được copy.
Ta sẽ được kết quả như sau:
_@.com:/etc/ansible/playbook-test# ansible-playbook apache2.yml PLAY *************************************************************************** TASK [setup] *******************************************************************
changed: [192.168.88.2] TASK [Install HTTP] ************************************************************
changed: [192.168.88.2] TASK [Start HTTPD after install] ***********************************************
changed: [192.168.88.2] TASK [Backup config HTTP (backup from client)] *********************************
changed: [192.168.88.2] TASK [Deploy new config] *******************************************************
changed: [192.168.88.2] TASK [Deploy web file] *********************************************************
changed: [192.168.88.2] PLAY RECAP *********************************************************************
192.168.88.2 : ok=6 changed=3 unreachable=0 failed=0