commit
8994f42213
89
2022/vi/Days/day64.md
Normal file
89
2022/vi/Days/day64.md
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
---
|
||||||
|
title: '#90DaysOfDevOps - Ansible: Bắt đầu - Ngày 64'
|
||||||
|
published: false
|
||||||
|
description: '90DaysOfDevOps - Ansible: Bắt đầu'
|
||||||
|
tags: 'devops, 90daysofdevops, learning'
|
||||||
|
cover_image: null
|
||||||
|
canonical_url: null
|
||||||
|
id: 1048765
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
## Ansible: Bắt đầu
|
||||||
|
|
||||||
|
Chúng ta đã đề cập một chút về Ansible là gì trong [bài viết ngày hôm qua](day63.md) Nhưng chúng ta sẽ có một số thông tin bổ sung ở đây. Thứ nhất, Ansible là sản phẩm của RedHat. Thứ hai, agentless, kết nối thông qua SSH và chạy các câu lệnh. Thứ ba, nó đa nền tảng (Linux & macOS, WSL2) và là mã nguồn mở (cũng có tùy chọn trả phí cho doanh nghiệp).
|
||||||
|
|
||||||
|
### Cài đặt Ansible
|
||||||
|
|
||||||
|
Như bạn có thể đoán được, RedHat và team Ansible đã làm rất tốt việc tài liệu hoá Ansible. Việc cài đặt thường bắt đầu với các bước cài đặt mà bạn có thể tìm thấy [tại đây](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html). Hãy nhớ rằng chúng ta đã nói rằng Ansible là một công cụ tự động hóa agentless, công cụ này được triển khai cho một hệ thống từ "Node điều khiển" - node điều khiển này sẽ quản lý máy và các thiết bị khác (có thể là mạng máy tính) thông qua SSH.
|
||||||
|
|
||||||
|
Trong tài liệu được liên kết ở trên, điều được chỉ rõ là node điều khiển không thể chạy hệ điều hành Windows.
|
||||||
|
|
||||||
|
Đối với node điều khiển của tôi và ít nhất là bài demo, tôi sẽ sử dụng máy ảo Linux mà chúng ta đã tạo lại trong [phần Linux](day20.md) làm node điều khiển của mình.
|
||||||
|
|
||||||
|
Hệ thống này đang chạy Ubuntu và chỉ cần các lệnh sau để cài đặt.
|
||||||
|
|
||||||
|
```Shell
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install software-properties-common
|
||||||
|
sudo add-apt-repository --yes --update ppa:ansible/ansible
|
||||||
|
sudo apt install ansible
|
||||||
|
```
|
||||||
|
|
||||||
|
Bây giờ chúng ta đã cài đặt ansible trên node điều khiển của mình, bạn có thể kiểm tra điều này bằng cách chạy `ansible --version` và bạn sẽ thấy gì đó tương tự như bên dưới.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Trước khi chúng ta bắt đầu xem xét việc kiểm soát các node khác trong môi trường của mình, chúng ta cũng có thể kiểm tra chức năng của ansible bằng cách chạy một lệnh trên máy cục bộ của chúng ta `ansible localhost -m ping` sẽ sử dụng [Ansible Module](https://docs.ansible.com/ansible/2.9/user_guide/modules_intro.html) và đây là một cách nhanh chóng để thực hiện một tác vụ trên nhiều hệ thống khác nhau. Nó không thú vị lắm khi chúng ta chỉ có máy chủ lưu trữ cục bộ nhưng hãy tưởng tượng bạn muốn làm thứ gì đó hoặc đảm bảo rằng tất cả các hệ thống của bạn đã hoạt động khi bạn có hơn 1000 máy chủ và thiết bị.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Hoặc cách sử dụng thực tế cho một module có thể là `ansible webservers -m service -a "name=httpd state=started"` điều này sẽ cho chúng tôi biết liệu tất cả máy chủ web của chúng tôi có dịch vụ httpd đang chạy hay không. Thuật ngữ máy chủ web được sử dụng trong lệnh đó.
|
||||||
|
|
||||||
|
### hosts
|
||||||
|
|
||||||
|
Cách tôi sử dụng máy chủ cục bộ ở trên để chạy module ping trên hệ thống, tôi không thể chỉ định một máy khác trên mạng của mình, ví dụ: trong môi trường tôi đang sử dụng máy chủ Windows nơi VirtualBox đang chạy có bộ điều hợp mạng với IP 10.0.0.1 nhưng bạn có thể thấy bên dưới rằng tôi có thể ping tới nó nhưng tôi không thể sử dụng ansible để thực hiện tác vụ đó.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Để chúng ta chỉ định máy chủ của mình hoặc các node mà chúng ta muốn tự động hóa với các tác vụ này, chúng ta cần xác định chúng. Chúng ta có thể xác định chúng bằng cách điều hướng đến thư mục /etc/ansible trên hệ thống của bạn.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Tệp chúng tôi muốn chỉnh sửa là tệp hosts, sử dụng trình soạn thảo văn bản, chúng ta có thể định nghĩa máy chủ của mình. Tệp hosts chứa nhiều hướng dẫn về cách sử dụng và sửa đổi tệp. Chúng ta sẽ cuộn xuống dưới cùng và sẽ tạo một nhóm mới có tên là [windows] và thêm địa chỉ IP `10.0.0.1` của chúng ta cho máy chủ lưu đó và lưu lại tệp.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Tuy nhiên, hãy nhớ rằng tôi đã nói rằng bạn sẽ cần có sẵn SSH để cho phép Ansible kết nối với hệ thống của bạn. Như bạn có thể thấy bên dưới khi tôi chạy `ansible windows -m ping`, chúng tôi không thể truy cập được vì mọi thứ không kết nối được qua SSH.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Bây giờ tôi bắt đầu thêm một số máy chủ khác, một tên khác cho tệp này vì đây là nơi bạn sẽ xác định tất cả các thiết bị của mình, chẳng hạn như thiết bị mạng, bộ chuyển mạch và bộ định tuyến cũng sẽ được thêm vào đây và được phân nhóm. Mặc dù vậy, trong tệp hosts của chúng ta, tôi cũng đã thêm thông tin đăng nhập của mình để truy cập group Linux của hệ thống.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Bây giờ nếu chúng ta chạy `ansible Linux -m ping`, chúng ta sẽ thành công như bên dưới.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Sau đó, chúng ta có các yêu cầu về các nodes, đây là những hệ thống đích mà bạn muốn tự động hóa cấu hình. Chúng ta không cài đặt bất kỳ thứ gì cho Ansible trên những hệ thống này (ý tôi là chúng ta có thể đang cài đặt phần mềm nhưng không có ứng dụng khách nào từ Ansible mà chúng ta cần) Ansible sẽ thực hiện kết nối qua SSH và gửi tất cả mọi thứ qua qua SFTP.(Nếu bạn muốn và bạn đã định cấu hình SSH, bạn có thể sử dụng SCP và SFTP.)
|
||||||
|
|
||||||
|
### Các câu lệnh Ansible
|
||||||
|
|
||||||
|
Bạn đã thấy rằng chúng ta có thể chạy `ansible Linux -m ping` trên máy Linux của chúng ta và nhận được phản hồi, về cơ bản, với Ansible, chúng ta có thể chạy nhiều lệnh đặc biệt. [ad hoc commands](https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html)
|
||||||
|
|
||||||
|
|
||||||
|
Nếu bạn thấy mình lặp lại các lệnh hoặc thậm chí tệ hơn là bạn phải đăng nhập vào các hệ thống riêng lẻ để chạy các lệnh này thì Ansible có thể trợ giúp. Ví dụ: lệnh đơn giản bên dưới sẽ cung cấp cho chúng ta đầu ra của tất cả các chi tiết hệ điều hành cho tất cả các hệ thống mà chúng ta thêm vào nhóm Linux của mình.
|
||||||
|
`ansible linux -a "cat /etc/os-release"`
|
||||||
|
|
||||||
|
Các trường hợp sử dụng khác có thể là khởi động lại hệ thống, sao chép tệp và quản lý người dùng. Bạn cũng có thể kết hợp các lệnh ad-hoc với các module Ansible.
|
||||||
|
|
||||||
|
Các lệnh ad-hoc sử dụng một mô hình khai báo, tính toán và thực hiện các hành động cần thiết để đạt được trạng thái cuối cùng được chỉ định. Chúng đạt được một dạng bình thường bằng cách kiểm tra trạng thái hiện tại trước khi chúng bắt đầu và sẽ không làm gì trừ khi trạng thái hiện tại khác với trạng thái cuối cùng được chỉ định.
|
||||||
|
|
||||||
|
## Tài liệu tham khảo
|
||||||
|
|
||||||
|
- [What is Ansible](https://www.youtube.com/watch?v=1id6ERvfozo)
|
||||||
|
- [Ansible 101 - Episode 1 - Introduction to Ansible](https://www.youtube.com/watch?v=goclfp6a2IQ)
|
||||||
|
- [NetworkChuck - You need to learn Ansible right now!](https://www.youtube.com/watch?v=5hycyr-8EKs&t=955s)
|
||||||
|
|
||||||
|
Hẹn gặp lại vào [ngày 65](day65.md).
|
282
2022/vi/Days/day65.md
Normal file
282
2022/vi/Days/day65.md
Normal file
@ -0,0 +1,282 @@
|
|||||||
|
---
|
||||||
|
title: '#90DaysOfDevOps - Ansible Playbooks - Day 65'
|
||||||
|
published: false
|
||||||
|
description: 90DaysOfDevOps - Ansible Playbooks
|
||||||
|
tags: 'devops, 90daysofdevops, learning'
|
||||||
|
cover_image: null
|
||||||
|
canonical_url: null
|
||||||
|
id: 1049054
|
||||||
|
---
|
||||||
|
|
||||||
|
### Ansible Playbooks
|
||||||
|
|
||||||
|
Trong bài viết này, chúng ta sẽ xem xét lý do chính mà chúng ta sử dụng Ansible. Thật tuyệt khi chỉ cần thực hiện một lệnh duy nhất trên nhiều máy chủ khác nhau nhằm thực hiện các lệnh đơn giản như khởi động lại một danh sách dài các máy chủ thay vì phải kết nối với từng máy chủ một.
|
||||||
|
|
||||||
|
Nhưng còn việc sử dụng một hệ điều hành mới được cài đặt và khai báo các phần mềm và dịch vụ mà chúng ta muốn chạy trên hệ thống đó và đảm bảo rằng tất cả chúng đều chạy ở trạng thái mong muốn thì sao.
|
||||||
|
|
||||||
|
Đây là khi các playbook ansible xuất hiện. Playbook cho phép chúng ta sử dụng nhóm máy chủ của mình và thực hiện các tác vụ cấu hình và cài đặt đối với nhóm đó.
|
||||||
|
|
||||||
|
### Playbook format
|
||||||
|
|
||||||
|
Playbook > Plays > Tasks
|
||||||
|
|
||||||
|
Đối với bất kỳ ai chơi thể thao, bạn có thể đã bắt gặp thuật ngữ playbook, khi đó playbook là thứ cho cả đội biết bạn sẽ chơi như thế nào bao gồm nhiều plays (lượt chơi) và tasks (nhiệm vụ) khác nhau. Nếu chúng ta coi các plays là các tình huống cố định trong một môn thể thao, và các task (nhiệm vụ) được liên kết với mỗi play (lượt chơi), bạn có thể có nhiều tasks để tạo thành một play và trong playbook, bạn có thể có nhiều các plays khác nhau.
|
||||||
|
|
||||||
|
Các playbook này được viết bằng YAML (YAML không phải là ngôn ngữ đánh dấu), bạn sẽ tìm thấy rất nhiều phần mà chúng ta đã đề cập cho đến nay, đặc biệt là Containers và Kubernetes để thấy tầm quan trọng của các tệp cấu hình được định dạng YAML.
|
||||||
|
|
||||||
|
Chúng ta hãy xem một playbook đơn giản - playbook.yml.
|
||||||
|
|
||||||
|
```Yaml
|
||||||
|
- name: Simple Play
|
||||||
|
hosts: localhost
|
||||||
|
connection: local
|
||||||
|
tasks:
|
||||||
|
- name: Ping me
|
||||||
|
ping:
|
||||||
|
- name: print os
|
||||||
|
debug:
|
||||||
|
msg: "{{ ansible_os_family }}"
|
||||||
|
```
|
||||||
|
|
||||||
|
Chúng ta có thể tìm thấy file ở trên tại [simple_play](../../Days/Configmgmt/simple_play.yml). Nếu sau đó chúng ta sử dụng lệnh `ansible-playbook simple_play.yml`, chúng ta sẽ đi qua các bước sau.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Bạn có thể thấy nhiệm vụ đầu tiên là "thu thập các bước" đã xảy ra, nhưng chúng ta không kích hoạt hoặc yêu cầu điều này? Mô-đun này được playbook gọi tự động để thu thập các biến hữu ích về máy chủ từ xa. [ansible.buildin.setup](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/setup_module.html)
|
||||||
|
|
||||||
|
Nhiệm vụ thứ hai của chúng ta là cài đặt ping, đây không phải là ping ICMP mà là tập lệnh python để báo cáo lại `pong` khi kết nối thành công với máy chủ hoặc máy chủ từ xa. [ansible.builtin.ping](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/ping_module.html)
|
||||||
|
|
||||||
|
Sau đó, nhiệm vụ thứ ba hoặc thứ hai được xác định của chúng ta là nhiệm đầu tiên sẽ chạy trừ khi bạn tắt tính năng in ra thông báo cho chúng ta biết hệ điều hành hiện tại. Trong nhiệm vụ này, chúng ta đang sử dụng các điều kiện, chúng ta có thể chạy playbook này với tất cả các loại hệ điều hành khác nhau và nó sẽ trả về tên hệ điều hành.
|
||||||
|
|
||||||
|
```Yaml
|
||||||
|
tasks:
|
||||||
|
- name: "shut down Debian flavoured systems"
|
||||||
|
command: /sbin/shutdown -t now
|
||||||
|
when: ansible_os_family == "Debian"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Sử dụng vagrant để thiết lập môi trường
|
||||||
|
|
||||||
|
Chúng ta sẽ sử dụng Vagrant để thiết lập môi trường trên node của mình, tôi sẽ cài đặt số node là 4 để hợp lý nhưng bạn có thể kỳ vọng rằng con số này có thể dễ dàng tăng lên 300 hoặc 3000 và đây là sức mạnh của Ansible và các công cụ quản lý cấu hình khác giúp cấu hình máy chủ của bạn một cách dễ dàng.
|
||||||
|
|
||||||
|
Bạn có thể tìm thấy tệp này ở đây ([Vagrantfile](../../Days/Configmgmt/Vagrantfile))
|
||||||
|
|
||||||
|
```Vagrant
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
servers=[
|
||||||
|
{
|
||||||
|
:hostname => "db01",
|
||||||
|
:box => "bento/ubuntu-21.10",
|
||||||
|
:ip => "192.168.169.130",
|
||||||
|
:ssh_port => '2210'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
:hostname => "web01",
|
||||||
|
:box => "bento/ubuntu-21.10",
|
||||||
|
:ip => "192.168.169.131",
|
||||||
|
:ssh_port => '2211'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
:hostname => "web02",
|
||||||
|
:box => "bento/ubuntu-21.10",
|
||||||
|
:ip => "192.168.169.132",
|
||||||
|
:ssh_port => '2212'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
:hostname => "loadbalancer",
|
||||||
|
:box => "bento/ubuntu-21.10",
|
||||||
|
:ip => "192.168.169.134",
|
||||||
|
:ssh_port => '2213'
|
||||||
|
}
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
config.vm.base_address = 600
|
||||||
|
|
||||||
|
servers.each do |machine|
|
||||||
|
|
||||||
|
config.vm.define machine[:hostname] do |node|
|
||||||
|
node.vm.box = machine[:box]
|
||||||
|
node.vm.hostname = machine[:hostname]
|
||||||
|
|
||||||
|
node.vm.network :public_network, bridge: "Intel(R) Ethernet Connection (7) I219-V", ip: machine[:ip]
|
||||||
|
node.vm.network "forwarded_port", guest: 22, host: machine[:ssh_port], id: "ssh"
|
||||||
|
|
||||||
|
node.vm.provider :virtualbox do |v|
|
||||||
|
v.customize ["modifyvm", :id, "--memory", 2048]
|
||||||
|
v.customize ["modifyvm", :id, "--name", machine[:hostname]]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
Sử dụng lệnh `vagrant up` để khởi động các máy này trong VirtualBox. Bạn có thể thêm nhiều bộ nhớ hơn và xác định một địa chỉ private_network khác cho mỗi máy nhưng cài đặt trên hoạt động trong môi trường của tôi. Hãy nhớ rằng môi trường của chúng ta là máy tính để bàn Ubuntu đã triển khai trong phần viết về Linux.
|
||||||
|
|
||||||
|
Nếu bạn có hạn chế về tài nguyên thì bạn cũng có thể chạy `vagrant up web01 web02` để chỉ khởi động các máy chủ web mà chúng ta đang sử dụng ở đây.
|
||||||
|
|
||||||
|
### Cấu hình máy chủ ansible
|
||||||
|
|
||||||
|
Bây giờ chúng ta đã sẵn sàng cho môi trường của mình, chúng ta có thể kiểm tra ansible để làm việc này, chúng ta sẽ sử dụng máy tính để bàn Ubuntu của mình (Bạn có thể sử dụng máy tính này nhưng bạn cũng có thể sử dụng bất kỳ máy dựa trên Linux nào trong mạng của mình để truy cập vào mạng bên dưới) để làm máy chủ điều khiển, chúng ta cũng hãy thêm các node mới vào nhóm trong tệp ansible hosts file, bạn có thể coi tệp này như một inventory, một giải pháp thay thế cho tệp này là một tệp inventory khác được gọi trong lệnh ansible với `-i filename`. Điều này có thể hữu ích so với việc sử dụng hosts file vì bạn có thể có các tệp khác nhau sử dụng cho các môi trường khác nhau, có thể là production, staging, test hoặc build. Bởi vì chúng ta đang sử dụng hosts file mặc định nên chúng ta không cần chỉ định nó.
|
||||||
|
|
||||||
|
Tôi đã thêm phần sau vào hosts file mặc định.
|
||||||
|
|
||||||
|
|
||||||
|
```Text
|
||||||
|
[control]
|
||||||
|
ansible-control
|
||||||
|
|
||||||
|
[proxy]
|
||||||
|
loadbalancer
|
||||||
|
|
||||||
|
[webservers]
|
||||||
|
web01
|
||||||
|
web02
|
||||||
|
|
||||||
|
[database]
|
||||||
|
db01
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Trước khi tiếp tục, chúng ta muốn đảm bảo có thể chạy một lệnh trên các nodes của mình, hãy chạy `ansible nodes -m command -a hostname` lệnh đơn giản này sẽ kiểm tra xem chúng ta có kết nối hay không và báo cáo lại tên máy chủ của chúng ta.
|
||||||
|
|
||||||
|
Ngoài ra, lưu ý rằng tôi đã thêm các nodes và IP này vào node điều khiển Ubuntu của mình trong tệp /etc/hosts để đảm bảo nó có thể kết nối tới các máy chủ khác. Chúng ta cũng có thể cần thực hiện cấu hình SSH cho từng nodes từ máy chủ Ubuntu.
|
||||||
|
|
||||||
|
```Text
|
||||||
|
192.168.169.140 ansible-control
|
||||||
|
192.168.169.130 db01
|
||||||
|
192.168.169.131 web01
|
||||||
|
192.168.169.132 web02
|
||||||
|
192.168.169.133 loadbalancer
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Ở giai đoạn này, chúng ta muốn nói tới việc thiết lập các khóa SSH giữa điều khiển của bạn và các nodes máy chủ của bạn. Đây là việc chúng ta sẽ làm tiếp theo, bạn cũng có thể thêm các biến vào hosts file của bạn để cung cấp tên người dùng và mật khẩu. Nhưng tôi khuyên các bạn không nên điều này vì nó không bao giờ là một thực hành tốt.
|
||||||
|
|
||||||
|
Để thiết lập SSH và chia sẻ giữa các nodes của bạn, hãy làm theo các bước bên dưới, bạn sẽ phải nhập mật khẩu (`vagrant`) và có thể bạn sẽ cần nhấn `y` vài lần để chấp nhận.
|
||||||
|
|
||||||
|
`ssh-keygen`
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
`ssh-copy-id localhost`
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Bây giờ, nếu bạn đã bật tất cả các máy ảo của mình thì bạn có thể chạy `ssh-copy-id web01 && ssh-copy-id web02 && ssh-copy-id loadbalancer && ssh-copy-id db01` và bạn sẽ phải mật khẩu trong trường hợp của chúng ta và mật khẩu sẽ là `vagrant`
|
||||||
|
|
||||||
|
Tôi không chạy tất cả các máy ảo của mình mà chỉ chạy các máy chủ web nên tôi đã nhập lệnh `ssh-copy-id web01 && ssh-copy-id web02`
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Trước khi chạy bất kỳ playbook nào, tôi muốn đảm bảo rằng tôi có kết nối tới các groups của mình, vì vậy tôi đã chạy lệnh `ansible webservers -m ping` để kiểm tra.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Playbook Ansible "thực" đầu tiên
|
||||||
|
|
||||||
|
Ansible playbook đầu tiên của chúng ta sẽ định cấu hình các máy chủ web, chúng ta đã nhóm các máy chủ này trong hosts file theo nhóm [webservers].
|
||||||
|
|
||||||
|
Trước khi chạy playbook của mình, chúng ta có thể xác nhận rằng web01 và web02 chưa cài đặt apache. Phần đầu của ảnh chụp màn hình bên dưới cho bạn thấy bố cục thư mục và tệp mà tôi đã tạo trong máy chủ ansible của mình để chạy playbook này, chúng ta có `playbook1 .yml`, sau đó trong thư mục mẫu, chúng ta có các tệp `index.html.j2` và `ports.conf.j2`.
|
||||||
|
|
||||||
|
Sau đó chúng ta SSH vào web01 để kiểm tra xem đã cài apache chưa?
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Bạn có thể thấy ở phần trên rằng chúng ta chưa cài đặt apache trên web01, vì vậy chúng ta có thể khắc phục điều này bằng cách chạy playbook bên dưới.
|
||||||
|
|
||||||
|
```Yaml
|
||||||
|
- hosts: webservers
|
||||||
|
become: yes
|
||||||
|
vars:
|
||||||
|
http_port: 8000
|
||||||
|
https_port: 4443
|
||||||
|
html_welcome_msg: "Hello 90DaysOfDevOps"
|
||||||
|
tasks:
|
||||||
|
- name: ensure apache is at the latest version
|
||||||
|
apt:
|
||||||
|
name: apache2
|
||||||
|
state: latest
|
||||||
|
|
||||||
|
- name: write the apache2 ports.conf config file
|
||||||
|
template:
|
||||||
|
src: templates/ports.conf.j2
|
||||||
|
dest: /etc/apache2/ports.conf
|
||||||
|
notify:
|
||||||
|
- restart apache
|
||||||
|
|
||||||
|
- name: write a basic index.html file
|
||||||
|
template:
|
||||||
|
src: templates/index.html.j2
|
||||||
|
dest: /var/www/html/index.html
|
||||||
|
notify:
|
||||||
|
- restart apache
|
||||||
|
|
||||||
|
- name: ensure apache is running
|
||||||
|
service:
|
||||||
|
name: apache2
|
||||||
|
state: started
|
||||||
|
|
||||||
|
handlers:
|
||||||
|
- name: restart apache
|
||||||
|
service:
|
||||||
|
name: apache2
|
||||||
|
state: restarted
|
||||||
|
```
|
||||||
|
|
||||||
|
Phân tích playbook ở trên:
|
||||||
|
|
||||||
|
- `- hosts: webservers` điều này có nghĩa là nhóm chạy playbook này là một nhóm có tên là webservers
|
||||||
|
- `become: yes` có nghĩa là người dùng đang chạy playbook của chúng ttaôi sẽ trở thành root trên các hệ thống được kết nối. Bạn sẽ phải nhập mật khẩu root.
|
||||||
|
- Sau đó, chúng ta có `vars` và nó dùng để xác định một số biến môi trường mà chúng ta muốn trong các máy chủ web của mình.
|
||||||
|
|
||||||
|
Tiếp theo, chúng ta bắt đầu các tasks,
|
||||||
|
|
||||||
|
- Task 1 là đảm bảo rằng apache đang chạy phiên bản mới nhất
|
||||||
|
- Task 2 là viết tệp tin port.conf từ nguồn của chúng ta được tìm thấy trong thư mục mẫu.
|
||||||
|
- Task 3 là tạo 1 file index.html cơ bản
|
||||||
|
- Task 4 là đảm bảo apache đang chạy
|
||||||
|
|
||||||
|
Cuối cùng, chúng ta có phần về handlers, [Handlers: Running operations on change](https://docs.ansible.com/ansible/latest/user_guide/playbooks_handlers.html)
|
||||||
|
|
||||||
|
"Đôi khi bạn muốn task chỉ chạy khi có thay đổi trên máy. Ví dụ: bạn có thể muốn khởi động lại dịch vụ nếu task cập nhật cấu hình của dịch vụ đó, còn nếu không có thay đổi thì không. Ansible sử dụng trình handlers để giải quyết điều này. Handlers là các task chỉ chạy khi được thông báo. Mỗi trình xử lý phải có một tên duy nhất trên toàn bộ các playbooks."
|
||||||
|
|
||||||
|
Ở giai đoạn này, bạn có thể nghĩ rằng chúng ta đã triển khai 5 máy ảo (bao gồm cả máy chủ Ubuntu hoạt động như Ansible Control của chúng ta) Các hệ thống khác sẽ hoạt động trong phần còn lại của bài viết này.
|
||||||
|
|
||||||
|
### Chạy playbook
|
||||||
|
|
||||||
|
Bây giờ chúng ta đã sẵn sàng để chạy playbook trên các nodes của mình. Để chạy playbook, chúng ta có thể sử dụng `ansible-playbook playbook1.yml` Chúng ta đã xác định các máy chủ mà playbook sẽ chạy trong playbook và điều này sẽ hướng dẫn các tasks đã xác định.
|
||||||
|
|
||||||
|
Khi lệnh hoàn tất, chúng ta nhận được một đầu ra hiển thị các plays và tasks, quá trình này có thể mất một chút thời gian, bạn có thể thấy từ hình ảnh bên dưới rằng quá trình này đã mất một lúc để thực hiện và cài đặt trạng thái mong muốn.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
Sau đó, chúng ta có thể kiểm tra lại điều này bằng cách nhảy vào một node và kiểm tra xem chúng ta đã cài đặt phần mềm trên node của mình chưa.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
Để giải quyết vấn đề này vì chúng ta đã triển khai hai máy chủ web độc lập với phần trên, giờ đây chúng ta có thể điều hướng đến các IP tương ứng mà chúng ta đã xác định và nhận trang web mới của mình.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Chúng ta sẽ xây dựng trên playbook này khi chúng ta chuyển qua phần còn lại của phần này. Tôi cũng quan tâm đến việc sử dụng máy chủ Ubuntu của chúng ta và xem liệu chúng ta có thể khởi động các ứng dụng và cấu hình của mình bằng Ansible hay không. Bạn có thể thấy điều đó khi chúng ta có thể sử dụng local host trong các lệnh của mình, chẳng hạn như chúng ta cũng có thể chạy playbook đối với local host của mình.
|
||||||
|
|
||||||
|
Một điều khác cần bổ sung ở đây là chúng ta chỉ thực sự làm việc với máy ảo Ubuntu nhưng Ansible không hề biết tới các hệ thống đích. Các lựa chọn thay thế đã đề cập trước đây để quản lý hệ thống của bạn không thể mở rộng khi bạn sử dụng một số lượng lớn máy chủ, cộng với sự khó khăn ngay cả với 3 nodes. Chúng ta cũng có thể sử dụng shell script như đã đề cập trong phần Linux nhưng các node này có khả năng cao là sẽ khác nhau nên dù có thể thực hiện được nhưng sau đó cần một người để duy trì và quản lý các tập lệnh đó. Ansible miễn phí và dễ dàng hơn so với việc phải có một tập lệnh chuyên dụng.
|
||||||
|
|
||||||
|
## Tài liệu tham khảo
|
||||||
|
|
||||||
|
- [What is Ansible](https://www.youtube.com/watch?v=1id6ERvfozo)
|
||||||
|
- [Ansible 101 - Episode 1 - Introduction to Ansible](https://www.youtube.com/watch?v=goclfp6a2IQ)
|
||||||
|
- [NetworkChuck - You need to learn Ansible right now!](https://www.youtube.com/watch?v=5hycyr-8EKs&t=955s)
|
||||||
|
- [Your complete guide to Ansible](https://www.youtube.com/playlist?list=PLnFWJCugpwfzTlIJ-JtuATD2MBBD7_m3u)
|
||||||
|
|
||||||
|
|
||||||
|
Playlist cuối cùng được liệt kê ở trên có rất nhiều đoạn mã và ý tưởng cho bài viết này, nó là một video hướng dẫn tuyệt vời.
|
||||||
|
|
||||||
|
Hẹn gặp lại vào [ngày 66](day66.md)
|
130
2022/vi/Days/day66.md
Normal file
130
2022/vi/Days/day66.md
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
---
|
||||||
|
title: '#90DaysOfDevOps - Tiếp tục với Ansible Playbooks... - Ngày 66'
|
||||||
|
published: false
|
||||||
|
description: 90DaysOfDevOps - Tiếp tục với Ansible Playbooks...
|
||||||
|
tags: 'devops, 90daysofdevops, learning'
|
||||||
|
cover_image: null
|
||||||
|
canonical_url: null
|
||||||
|
id: 1048712
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ansible Playbooks (Tiếp tục)
|
||||||
|
|
||||||
|
Trong bài viết trước, chúng ta đã bắt đầu với việc tạo bài lab nhỏ bằng cách sử dụng Vagrantfile để triển khai 4 máy ảo và chúng ta đã sử dụng máy chủ Linux đã được tạo trong bài viết liên quan tới chính chủ đề đó làm hệ thống điều khiển ansible của mình.
|
||||||
|
|
||||||
|
Chúng ta cũng đã đi qua một số trường hợp sử dụng playbooks và cuối cùng, chúng ta đã có một playbooks giúp các máy chủ web01 và web02 trở thành các máy chủ riêng biệt.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Giữ mọi thứ ngăn nắp
|
||||||
|
|
||||||
|
Trước khi bắt đầu triển khai và tiếp tục tự động hoá quy trình, chúng ta sẽ đề cập tới việc giữ các playbooks của mình gọn gàng và ngăn nắp cũng như cách chúng ta có thể tách các tasks và handlers của mình thành các thư mục con.
|
||||||
|
|
||||||
|
Chúng ta sẽ sao chép các nhiệm vụ của mình vào các tệp của chúng trong một thư mục riêng.
|
||||||
|
|
||||||
|
```Yaml
|
||||||
|
- name: ensure apache is at the latest version
|
||||||
|
apt: name=apache2 state=latest
|
||||||
|
|
||||||
|
- name: write the apache2 ports.conf config file
|
||||||
|
template:
|
||||||
|
src=templates/ports.conf.j2
|
||||||
|
dest=/etc/apache2/ports.conf
|
||||||
|
notify: restart apache
|
||||||
|
|
||||||
|
- name: write a basic index.html file
|
||||||
|
template:
|
||||||
|
src: templates/index.html.j2
|
||||||
|
dest: /var/www/html/index.html
|
||||||
|
notify:
|
||||||
|
- restart apache
|
||||||
|
|
||||||
|
- name: ensure apache is running
|
||||||
|
service:
|
||||||
|
name: apache2
|
||||||
|
state: started
|
||||||
|
```
|
||||||
|
|
||||||
|
và làm điều tương tự với handlers
|
||||||
|
|
||||||
|
```Yaml
|
||||||
|
- name: restart apache
|
||||||
|
service:
|
||||||
|
name: apache2
|
||||||
|
state: restarted
|
||||||
|
```
|
||||||
|
|
||||||
|
sau đó, trong playbook mà hiện tại có tên là `playbook2.yml`, chúng ta trỏ đến các tệp này. Tất cả đều có thể được tìm thấy tại [ansible-scenario2](../../Days/Configmgmt/ansible-scenario2/)
|
||||||
|
|
||||||
|
Bạn có thể kiểm tra điều này trong máy chủ điều khiển của mình. Nếu bạn đã sao chép các tệp từ repository, bạn sẽ nhận thấy điều gì đó đã thay đổi trong phần "write a basic index.html file"
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Hãy tìm hiểu xem tôi đã thực hiện thay đổi đơn giản nào. Sử dụng lệnh `curl web01:8000`
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Chúng ta vừa dọn dẹp lại playbook và bắt đầu phân tách các khu vực có thể khiến playbook trở nên phức tạp khi mở rộng quy mô.
|
||||||
|
|
||||||
|
### Roles và Ansible Galaxy
|
||||||
|
|
||||||
|
Hiện tại, chúng ta đã triển khai 4 máy ảo và chúng ta đã định cấu hình 2 trong số các máy ảo này làm máy chủ web, chúng ta cũng có một số các chứng năng khác, cụ thể là một cơ sở dữ liệu và bộ cân bằng tải hoặc proxy. Để chúng ta có thể làm điều này và dọn dẹp lại repository của mình, chúng ta có thể sử dụng roles trong Ansible.
|
||||||
|
|
||||||
|
Để làm điều này, chúng ta sẽ sử dụng lệnh `ansible-galaxy` để quản lý các roles trong các kho repository được chia sẻ.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Chúng ta sẽ sử dụng `ansible-galaxy` để tạo một role cho apache2, đây là nơi chúng ta sẽ đặt các chi tiết cụ thể cho máy của web của mình.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Câu lệnh trên `ansible-galaxy init roles/apache2` sẽ tạo cấu trúc thư mục như ở trên. Bước tiếp theo là chúng ta cần chuyển các tác vụ mà templates hiện có của mình sang các thư mục có liên quan trong cấu trúc mới.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Copy và paste là cách dễ dàng để chuyển các tệp đó, nhưng chúng ta cũng cần thực hiện thay đổi với tasks/main.yml để trỏ tệp này tới apache2_install.yml.
|
||||||
|
|
||||||
|
Chúng ta cũng cần thay đổi playbook để có thể sử dụng role mới được tạo. Trong playbook1.yml và playbook2.yml, chúng ta xác định các tasks và handlers theo các cách khác nhau khi chúng ta thay đổi giữa hai phiên bản. Chúng ta cần thay đổi playbook của mình để sử dụng role này như bên dưới:
|
||||||
|
|
||||||
|
```Yaml
|
||||||
|
- hosts: webservers
|
||||||
|
become: yes
|
||||||
|
vars:
|
||||||
|
http_port: 8000
|
||||||
|
https_port: 4443
|
||||||
|
html_welcome_msg: "Hello 90DaysOfDevOps - Welcome to Day 66!"
|
||||||
|
roles:
|
||||||
|
- apache2
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Bây giờ, chúng ta có thể chạy lại playbook của mình lần này với tên playbook mới `ansible-playbook playbook3.yml`, bạn sẽ nhận thấy một cảnh báo về việc deprecation, chúng ta có thể khắc phục ngay sau đây.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Ok, dù playbook của chúng ta đã hoạt động nhưng chúng ta cần sử deprecation warning ngay, để làm điều đó, tôi đã thay đổi tuỳ chọn trong tasks/main.yml thành import_tasks như bên dưới.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Bạn có thể tìm thấy các tệp này trong[ansible-scenario3](../../Days/Configmgmt/ansible-scenario3)
|
||||||
|
|
||||||
|
Chúng ta cũng sẽ tạo thêm một vài roles trong khi sử dụng `ansible-galaxy`, bao gồm:
|
||||||
|
|
||||||
|
- common = cho tất cả các máy chủ (`ansible-galaxy init roles/common`)
|
||||||
|
- nginx = cho load balancer (`ansible-galaxy init roles/nginx`)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Tôi sẽ dừng phần này tại đây và trong phần tiếp theo, chúng ta sẽ bắt đầu làm việc trên các nodes khác mà chúng ta đã triển khai nhưng chưa thực hiện bất cứ điều gì.
|
||||||
|
|
||||||
|
## Tài liệu tham khảo
|
||||||
|
|
||||||
|
- [What is Ansible](https://www.youtube.com/watch?v=1id6ERvfozo)
|
||||||
|
- [Ansible 101 - Episode 1 - Introduction to Ansible](https://www.youtube.com/watch?v=goclfp6a2IQ)
|
||||||
|
- [NetworkChuck - You need to learn Ansible right now!](https://www.youtube.com/watch?v=5hycyr-8EKs&t=955s)
|
||||||
|
- [Your complete guide to Ansible](https://www.youtube.com/playlist?list=PLnFWJCugpwfzTlIJ-JtuATD2MBBD7_m3u)
|
||||||
|
|
||||||
|
Playlist cuối cùng được liệt kê ở trên có rất nhiều đoạn mã và ý tưởng cho bài viết này, nó là một video hướng dẫn tuyệt vời.
|
||||||
|
|
||||||
|
Hẹn gặp lại vào [ngày 67](day67.md)
|
Loading…
Reference in New Issue
Block a user