IaC

Ngày 9: Tự động hóa quản lý cấu hình (configuration management)

Bức tranh toàn cảnh: Quản lý cấu hình

Ngay sau phần nói về Cơ sở hạ tầng dưới dạng mã, có nhiều khả năng sẽ có một số điểm giao khi chúng ta nói về Quản lý cấu hình hoặc Quản lý cấu hình ứng dụng.

Quản lý cấu hình là quá trình duy trì các ứng dụng, hệ thống và máy chủ ở trạng thái mong muốn. Sự trùng lặp với Cơ sở hạ tầng dưới dạng mã là IaC sẽ đảm bảo cơ sở hạ tầng của bạn ở trạng thái mong muốn nhưng sau đó, đặc biệt là terraform sẽ không quản lý trạng thái mong muốn của cài đặt hệ điều hành hoặc ứng dụng của bạn, đó là nơi các công cụ quản lý cấu hình xuất hiện đảm bảo rằng hệ thống và ứng dụng hoạt động theo cách được mong đợi khi có thay đổi.

Quản lý cấu hình giúp bạn không thực hiện các thay đổi nhỏ hoặc lớn mà không có sự quản lý bằng tài liệu.

Tình huống: Tại sao bạn muốn sử dụng Quản lý cấu hình

Kịch bản hoặc lý do bạn muốn sử dụng Quản lý cấu hình, hãy gặp quản trị viên hệ thống của chúng ta, người làm việc trên tất cả các hệ thống – anh ấy tên là Dũng.

Điều gì sẽ xảy ra nếu hệ thống của họ gặp sự cố, nếu có hỏa hoạn, một máy chủ hoạt động không tốt? Dũng biết chính xác phải làm gì anh ấy có thể khắc phục sự cố đó một cách dễ dàng. Tuy nhiên, các vấn đề sẽ trở nên khó khăn với Dũng nếu nhiều máy chủ bắt đầu gặp sự cố, đặc biệt khi bạn có môi trường lớn và ngày càng mở rộng. Đây là lý do tại sao Dũng cần phải có một công cụ quản lý cấu hình. Các công cụ Quản lý Cấu hình có thể giúp Dũng trông giống như một ngôi sao nhạc rock, tất cả những gì anh ấy phải làm là định cấu hình đúng mã cho phép anh ấy đưa ra hướng dẫn về cách thiết lập từng mã các máy chủ một cách hiệu quả và ở quy mô lớn.

Công cụ quản lý cấu hình

Có sẵn nhiều công cụ quản lý cấu hình và mỗi công cụ đều có các tính năng cụ thể giúp công cụ này hoạt động tốt hơn trong một số tình huống so với các công cụ khác.

Ở giai đoạn này, chúng ta sẽ xem nhanh các tùy chọn trong hình trên trước khi đưa ra lựa chọn chúng ta sẽ sử dụng tùy chọn nào.

  • Chef
    • Chef đảm bảo cấu hình được áp dụng nhất quán trong mọi môi trường, ở mọi quy mô lớn với cơ sở hạ tầng tự động hóa.
    • Chef là một công cụ mã nguồn mở được phát triển bởi OpsCode được viết bằng Ruby và Erlang.
    • Chef phù hợp nhất cho các tổ chức có cơ sở hạ tầng không đồng nhất và đang tìm kiếm các giải pháp hoàn thiện.
    • Recipes và Cookbooks xác định mã cấu hình cho hệ thống của bạn.
    • Pro – Có sẵn một bộ sưu tập lớn các recipes
    • Pro – Tích hợp tốt với Git, cung cấp khả năng kiểm soát phiên bản mạnh mẽ
    • Con – Phải học rất nhiều và cần một lượng thời gian đáng kể để làm quen.
    • Con – Máy chủ chính không có nhiều quyền kiểm soát.
    • Kiến trúc – Server/Client
    • Dễ dàng thiết lập – Trung bình
    • Language – Procedural – Chỉ định cách thực hiện tác vụ
  • Puppet
    • Puppet là công cụ quản lý cấu hình hỗ trợ triển khai tự động.
    • Puppet được xây dựng bằng Ruby và sử dụng DSL để viết bảng kê khai.
    • Puppet cũng hoạt động tốt với cơ sở hạ tầng không đồng nhất, nơi tập trung vào khả năng mở rộng.
    • Pro – Cộng đồng hỗ trợ lớn.
    • Pro – Cơ chế báo cáo được viết rất tốt.
    • Con – Các nhiệm vụ nâng cao yêu cầu kiến ​​thức về ngôn ngữ Ruby.
    • Con – Máy chủ chính không có nhiều quyền kiểm soát.
    • Kiến trúc – Server/Client
    • Dễ thiết lập – Trung bình
    • Language – Declarative – Chỉ định những việc cần làm
  • Ansible
    • Ansible là một công cụ tự động hóa CNTT giúp tự động hóa việc quản lý cấu hình, triển khai trên đám mây, triển khai và điều phối.
    • Cốt lõi của Ansible playbooks được viết bằng YAML (Nên làm một phần về YAML như chúng ta đã thấy điều này một vài lần)
    • Ansible hoạt động tốt khi các môi trường tập trung vào việc khởi động và chạy mọi thứ một cách nhanh chóng.
    • Hoạt động trên playbook cung cấp hướng dẫn cho máy chủ của bạn.
    • Pro – Không agents trên trên các node từ xa.
    • Pro – YAML rất dễ học.
    • Con – Tốc độ thực hiện thường kém hơn các công cụ khác (Nhanh hơn Dũng tự làm thủ công)
    • Con – YAML không mạnh bằng Ruby nhưng học nó dễ dàng hơn Ruby.
    • Kiến trúc – client only
    • Dễ thiết lập – Rất dễ
    • Language – Procedural – Chỉ định cách thực hiện tác vụ
  • SaltStack
    • SaltStack là một công cụ dựa trên CLI giúp tự động hóa việc quản lý cấu hình và thực thi từ xa.
    • SaltStack dựa trên Python trong khi các hướng dẫn được viết bằng YAML hoặc DSL của nó.
    • Hoàn hảo cho các môi trường ưu tiên khả năng mở rộng và khả năng phục hồi.
    • Pro – Dễ sử dụng khi thiết lập và chạy
    • Pro – Cơ chế báo cáo tốt
    • Con – Giai đoạn thiết lập khó khăn
    • Con – Giao diện người dùng web mới kém phát triển hơn nhiều so với các giao diện người dùng khác.
    • Kiến trúc – Server/Client
    • Dễ thiết lập – Trung bình
    • Language – Declarative – Chỉ định những việc cần làm

Ansible vs Terraform

Công cụ mà chúng ta sẽ sử dụng cho phần này sẽ là Ansible (Dễ sử dụng và yêu cầu cơ bản về ngôn ngữ dễ dàng hơn).

Tôi nghĩ rằng điều quan trọng là phải đề cập đến một số khác biệt giữa Ansible và Terraform trước khi chúng ta tìm hiểu sâu hơn về công cụ này.

Ansible Terraform
LoạiAnsible là công cụ quản lý cấu hìnhTerraform là công cụ điều phối
Cơ sở hạ tầngAnsible cung cấp hỗ trợ cho cơ sở hạ tầng có thể thay đổi (mutable)Terraform cung cấp hỗ trợ cho cơ sở hạ tầng không thể thay đổi (immutable)
Ngôn ngữAnsible tuân theo ngôn ngữ thủ tụcTerraform tuân theo ngôn ngữ khai báo
Cung cấpAnsible cung cấp cung cấp một phần (VM, Mạng, Lưu trữ)Terraform cung cấp cung cấp rộng rãi (VM, Mạng, Lưu trữ)
Đóng góiAnsible cung cấp hỗ trợ đầy đủ cho việc đóng gói & tạo templateTerraform cung cấp hỗ trợ một phần cho đóng gói & tạo template
Quản lý vòng đờiAnsible không có quản lý vòng đờiTerraform phụ thuộc nhiều vào vòng đời và quản lý trạng thái

Ansible: Bắt đầu

Chúng ta đã đề cập một chút về Ansible là gì và 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).

Xem thêm: Cách sử dụng Ansible

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. 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 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.

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 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.)

Xem thêm: Kiến thức về mạng

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

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.

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.

Xem thêm: Kiến thức cơ bản về Container

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.

- 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. 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

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

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.

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)

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.

Xem thêm: Điện toán đám mâ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.

[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.

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.j2ports.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.

- 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

“Đô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.

Ansible Playbooks (Tiếp tụ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 đã đi qua một số kịch bản của playbooks, và cuối cùng chúng ta đã có một playbook giúp máy chủ web01 và web02 trở thành các máy chủ web 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.

- 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

- 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

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 xem tôi đã thực hiện thay đổi 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ô.

Xem thêm: Tổng quan về Kubernetes

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 cấu hình cho các máy chủ web.

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:

- 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

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)
1 2Next page

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button