Hướng dẫn Ansible cho người mới bắt đầu: Playbook, Lệnh & Ví dụ

Ansible là gì?

Có khả năng là một công cụ điều phối và tự động hóa nguồn mở để cung cấp phần mềm, quản lý cấu hình và triển khai phần mềm. Ansible có thể dễ dàng chạy và cấu hình các hệ thống giống Unix cũng như Windows hệ thống cung cấp cơ sở hạ tầng dưới dạng mã. Nó chứa ngôn ngữ lập trình khai báo riêng để cấu hình và quản lý hệ thống.

Ansible nổi tiếng vì cài đặt đơn giản, dễ sử dụng liên quan đến khả năng kết nối với khách hàng, thiếu đại lý cho khách hàng Ansible và vô số kỹ năng. Nó hoạt động bằng cách kết nối thông qua SSH cho máy khách, do đó, nó không cần một tác nhân đặc biệt ở phía máy khách và bằng cách đẩy các mô-đun đến máy khách, các mô-đun sau đó được thực thi cục bộ ở phía máy khách và đầu ra được đẩy trở lại máy chủ Ansible.

Vì nó sử dụng SSH, nên nó có thể dễ dàng kết nối với máy khách bằng SSH-Keys, đơn giản hóa toàn bộ quá trình. Chi tiết máy khách, như tên máy chủ hoặc địa chỉ IP và cổng SSH, được lưu trữ trong các tệp gọi là tệp inventory. Sau khi bạn đã tạo tệp inventory và điền vào, ansible có thể sử dụng tệp đó.

Tại sao nên sử dụng Ansible?

Dưới đây là một số ưu/lợi ích quan trọng của việc sử dụng Ansible

  • Một trong những ưu điểm đáng kể nhất của Ansible là mọi người đều có thể sử dụng miễn phí.
  • Không cần bất kỳ kỹ năng quản trị hệ thống đặc biệt nào để cài đặt và sử dụng Ansible và tài liệu chính thức rất toàn diện.
  • Tính mô-đun của nó liên quan đến plugin, mô-đun, kho lưu trữ và sách giải trí khiến Ansible trở thành người bạn đồng hành hoàn hảo để điều phối các môi trường lớn.
  • Ansible rất nhẹ và nhất quán, đồng thời không có ràng buộc nào liên quan đến hệ điều hành hoặc phần cứng cơ bản.
  • Nó cũng rất an toàn nhờ khả năng không cần tác nhân và do sử dụng các tính năng bảo mật OpenSSH.
  • Một ưu điểm khác khuyến khích việc áp dụng Ansible là quá trình học tập suôn sẻ được xác định bởi tài liệu toàn diện cũng như cấu trúc và cấu hình dễ học.

Lịch sử của Ansible

Đây là những dấu mốc quan trọng trong lịch sử của ansible:

  • Vào tháng 2012 năm XNUMX, dự án Ansible bắt đầu. Nó được phát triển lần đầu tiên bởi Michael DeHaan, người tạo ra Cobbler và Func, Bộ điều khiển mạng hợp nhất Fedora.
  • Ban đầu được gọi là AnsibleWorks Inc, công ty tài trợ cho công cụ ansible đã được RedHat mua lại vào năm 2015 và sau đó, cùng với RedHat, được chuyển dưới sự bảo trợ của IBM.
  • Hiện tại, Ansible được đưa vào các bản phân phối như Fedora Linux, RHEL, Centos và Oracle Linux.

Các thuật ngữ quan trọng được sử dụng trong Ansible

  • Máy chủ Ansible

    Máy nơi Ansible được cài đặt và từ đó tất cả các tác vụ và sách giải trí sẽ được chạy

  • Mô-đun

    Về cơ bản, mô-đun là một lệnh hoặc tập hợp các lệnh Ansible tương tự được thực thi ở phía máy khách.

  • Nhiệm vụ

    Nhiệm vụ là một phần bao gồm một thủ tục duy nhất cần được hoàn thành

  • Vai trò

    Một cách tổ chức các tác vụ và các tệp liên quan để sau này được gọi trong sổ tay hướng dẫn

  • Thực tế

    Thông tin được lấy từ hệ thống máy khách từ các biến toàn cục bằng thao tác thu thập dữ kiện

  • Hàng tồn kho

    Tệp chứa dữ liệu về máy chủ khách hàng ansible. Được định nghĩa trong các ví dụ sau là tệp máy chủ

  • Play

    Thực hiện một vở kịch

  • Handler

    Tác vụ chỉ được gọi nếu có trình thông báo

  • Thông báo

    Phần được gán cho một tác vụ gọi trình xử lý nếu đầu ra bị thay đổi

  • Nhãn

    Đặt tên cho một nhiệm vụ có thể được sử dụng sau này để chỉ phát hành nhiệm vụ hoặc nhóm nhiệm vụ cụ thể đó.

Cài đặt Ansible trong Linux

Khi bạn đã so sánh và cân nhắc các lựa chọn của mình và quyết định sử dụng Ansible, bước tiếp theo là cài đặt nó trên hệ thống của bạn. Chúng ta sẽ thực hiện các bước cài đặt khác nhau Linux các bản phân phối phổ biến nhất trong hướng dẫn nhỏ tiếp theo.

Cài đặt Ansible trên hệ thống Centos/RedHat

Bước 1) Cài đặt kho EPEL

[root@ansible-server ~]# sudo yum install epel-release

Bước 2) Cài đặt gói ansible

[root@ansible-server ~]# sudo  yum install -y ansible

Cài đặt Ansible trên hệ thống Centos/RedHat

Cài đặt ansible trên Ubuntu/hệ thống Debian

Bước 1) Thực hiện cập nhật các gói

$ sudo apt update

Bước 2) Cài đặt gói phần mềm-thuộc tính-chung

$ sudo apt install software-properties-common

Bước 3) Cài đặt kho lưu trữ gói cá nhân ansible

$ sudo apt-add-repository ppa:ansible/ansible

Bước 4) Cài đặt ansible

$ sudo apt update
$ sudo apt install ansible

Các lệnh đặc biệt ansible

Một trong những cách đơn giản nhất có thể sử dụng Ansible là sử dụng các lệnh đặc biệt. Chúng có thể được sử dụng khi bạn muốn đưa ra một số lệnh trên máy chủ hoặc một loạt máy chủ. Các lệnh đặc biệt không được lưu trữ để sử dụng trong tương lai nhưng thể hiện một cách nhanh chóng để tương tác với các máy chủ mong muốn.

Đối với hướng dẫn Ansible này, một tệp máy chủ hai máy chủ đơn giản sẽ được cấu hình, chứa Host1 và Host2.

Bạn có thể đảm bảo rằng các máy chủ có thể truy cập được từ máy chủ ansible bằng cách đưa ra lệnh ping trên tất cả các máy chủ.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping
host1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Các lệnh đặc biệt ansible

Giải thích:

  1. Trạng thái của lệnh, trong trường hợp này là THÀNH CÔNG
  2. Máy chủ nơi lệnh chạy
  3. Lệnh được đưa ra thông qua tham số -m, trong trường hợp này là ping
  4. Với tham số -i, bạn có thể trỏ đến tệp máy chủ.


Bạn chỉ có thể đưa ra lệnh tương tự trên một máy chủ cụ thể nếu cần.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Các lệnh đặc biệt ansible

Giải thích:

  1. Tham số giới hạn chỉ có thể được sử dụng để ra lệnh trên các máy chủ cụ thể trong tệp của máy chủ
  2. Tên của máy chủ như được xác định trong tệp kiểm kê

Nếu bạn cần sao chép nhanh một tệp đến nhiều đích, bạn có thể sử dụng mô-đun sao chép trong ansible sử dụng SCP. Vì vậy, lệnh và đầu ra của nó trông như dưới đây:

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"
host1 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.43-256741011164877/source",
    "state": "file",
    "uid": 0
}
host2 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.6-280302911361278/source",
    "state": "file",
    "uid": 0
}

Các lệnh đặc biệt ansible

Giải thích:

  1. Sao chép mô-đun được xác định
  2. Đối số mô-đun, trong trường hợp này, là đường dẫn tuyệt đối nguồn và đường dẫn tuyệt đối đích.
  3. Đầu ra lệnh Ansible phản ánh sự thành công của lệnh sao chép và các chi tiết khác như tổng kiểm tra sha1 hoặc md5 để kiểm tra tính toàn vẹn của tệp và siêu dữ liệu như chủ sở hữu, kích thước hoặc quyền. Thật dễ dàng để cài đặt một gói trên nhiều máy chủ. Ansible có một số mô-đun tương tác với các trình cài đặt đã sử dụng, như yum, apt, dnf, v.v.

Trong ví dụ tiếp theo, bạn sẽ tìm hiểu cách cài đặt gói thông qua mô-đun yum trên hai máy chủ Centos.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [


"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.xservers.ro\n * epel: fedora.mirrors.telekom.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: remi.schlundtech.de\n * remi-safe: remi.schlundtech.de\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version                Repository       Size\n================================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.leadhosts.com\n * epel: mirrors.nav.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: mirrors.uni-ruse.bg\n * remi-safe: mirrors.uni-ruse.bg\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version                Repository       Size\n================================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

Các lệnh đặc biệt ansible

Giải thích:

  1. Mô-đun Yum được sử dụng trong ví dụ này
  2. Nó xác định các đối số của mô-đun và trong trường hợp này, bạn sẽ chọn tên của gói và trạng thái của nó. Ví dụ: nếu trạng thái vắng mặt, gói sẽ được tìm kiếm và nếu tìm thấy, gói sẽ bị xóa
  3. Khi được tô màu vàng, bạn sẽ thấy đầu ra của lệnh ansible với trạng thái đã thay đổi, nghĩa là trong trường hợp này, gói đã được tìm thấy và cài đặt.
  4. Trạng thái của lệnh yum install được phát hành qua ansible. Trong trường hợp này, gói ncdu.x86_64 0:1.14-1.el7 đã được cài đặt.

Tất nhiên, tất cả các tùy chọn trình cài đặt yum đều có thể được sử dụng thông qua ansible, bao gồm cập nhật, cài đặt, phiên bản mới nhất hoặc xóa.

Trong ví dụ dưới đây, lệnh tương tự được đưa ra để xóa gói ncdu đã cài đặt trước đó.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version               Repository        Size\n================================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n================================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version               Repository        Size\n================================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n================================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

Các lệnh đặc biệt ansible

Giải thích:

  1. Đầu ra của lệnh yum cho thấy gói đã bị xóa.

Một tính năng hữu ích và thiết yếu khác mà ansible sử dụng để tương tác với máy chủ của khách hàng là thu thập một số thông tin về hệ thống. Vì vậy, nó lấy thông tin phần cứng, phần mềm và phiên bản từ hệ thống và lưu trữ từng giá trị trong một biến có thể được sử dụng sau này.

Nếu bạn cần thông tin chi tiết về hệ thống sẽ được sửa đổi thông qua ansible, có thể sử dụng lệnh tiếp theo. Mô-đun thiết lập thu thập dữ kiện từ các biến hệ thống.

Các lệnh đặc biệt ansible

Playbook Ansible

Playbook Ansible là cách gửi lệnh đến các hệ thống từ xa thông qua các tập lệnh. Ansible playbook được sử dụng để cấu hình các môi trường hệ thống phức tạp nhằm tăng tính linh hoạt bằng cách thực thi một tập lệnh cho một hoặc nhiều hệ thống. Ansible playbook có xu hướng giống một ngôn ngữ cấu hình hơn là một ngôn ngữ lập trình.

Các lệnh playbook Ansible sử dụng định dạng YAML nên không cần nhiều cú pháp nhưng phải tôn trọng thụt lề. Đúng như tên gọi, playbook là một tập hợp các vở kịch. Thông qua sổ tay, bạn có thể chỉ định các vai trò cụ thể cho một số máy chủ và các vai trò khác cho các máy chủ khác. Bằng cách đó, bạn có thể sắp xếp nhiều máy chủ trong các tình huống rất đa dạng, tất cả trong một sổ tay.

Để có tất cả các chi tiết chính xác trước khi tiếp tục với các ví dụ về playbook của Ansible, trước tiên chúng ta phải xác định một tác vụ. Đây là giao diện cho các mô-đun ansible dành cho các vai trò và playbook.

Bây giờ, chúng ta hãy tìm hiểu Playbook Ansible thông qua một ví dụ với một playbook với một lần chơi, bao gồm nhiều nhiệm vụ như sau:

---

- hosts: group1
  tasks:
  - name: Install lldpad package
    yum:
      name: lldpad
      state: latest
  - name: check lldpad service status
    service:
      name: lldpad
      state: started

Playbook Ansible

Trong ví dụ về Playbook Ansible ở trên, nhóm 1 máy chủ trong tệp của máy chủ được nhắm mục tiêu để cài đặt gói lldpad bằng mô-đun yum và sau đó dịch vụ lldpad được tạo sau khi cài đặt sẽ bắt đầu sử dụng mô-đun dịch vụ được sử dụng chủ yếu để tương tác với nhóm systemd.

Giải thích:

  1. Nhóm máy chủ mà playbook sẽ chạy trên đó
  2. Mô-đun Yum được sử dụng trong nhiệm vụ này để cài đặt lldpad
  3. Mô-đun dịch vụ được sử dụng để kiểm tra xem dịch vụ có hoạt động hay không sau khi cài đặt

Mỗi playbook ansible hoạt động với một tệp kiểm kê. Tệp kiểm kê chứa danh sách các máy chủ được chia thành các nhóm để kiểm soát tốt hơn các chi tiết như Địa chỉ IP và cổng SSH cho mỗi máy chủ.

Tệp kiểm kê mà bạn có thể sử dụng cho ví dụ về Playbook Ansible này trông như bên dưới. Có hai nhóm, được đặt tên là nhóm1 và nhóm2, mỗi nhóm chứa Host1 và Host2 tương ứng.

[group1]
host1 ansible_host=192.168.100.2 ansible_ssh_port=22
[group2]
host2 ansible_host=192.168.100.3 ansible_ssh_port=22

Playbook Ansible

Giải thích:

  1. Tên nhóm
  2. Tên máy chủ, với địa chỉ IP và cổng ssh, trong trường hợp này là tên mặc định, 22.

Một ví dụ về sổ tay Ansible hữu ích khác lần này có hai lượt chơi cho hai máy chủ là lượt tiếp theo. Đối với nhóm máy chủ đầu tiên, nhóm 1, selinux sẽ được bật. Nếu nó được bật thì một thông báo sẽ xuất hiện trên màn hình của máy chủ.

Đối với nhóm máy chủ thứ hai, gói httpd sẽ chỉ được cài đặt nếu ansible_os_family là RedHat và ansible_system_vendor là HP.

Ansible_os_family và ansible_system_vendor là các biến được thu thập bằng tùy chọn Gather_facts và có thể được sử dụng như trong ví dụ có điều kiện này.

---

- hosts: group1
  tasks:
  - name: Enable SELinux
    selinux:
      state: enabled
    when: ansible_os_family == 'Debian'
    register: enable_selinux

  - debug:
      Imsg: "Selinux Enabled. Please restart the server to apply changes."
    when: enable_selinux.changed == true

- hosts: group2
  tasks:
  - name: Install apache
    yum:
      name: httpd
      state: present
    when: ansible_system_vendor == 'HP' and ansible_os_family == 'RedHat'

Playbook Ansible

Giải thích:

  1. Ví dụ về mệnh đề When, Trong trường hợp này, khi loại hệ điều hành là Debian. Biến ansible_os_family được thu thập thông qua chức năng Gather_facts.
  2. Đầu ra tác vụ được đăng ký để sử dụng trong tương lai, với tên là Enable_selinux
  3. Một ví dụ khác về mệnh đề When. Trong trường hợp này, một thông báo sẽ được hiển thị cho người dùng máy chủ nếu SELinux thực sự đã được bật trước đó.
  4. Một ví dụ khác về mệnh đề When bao gồm hai quy tắc

Bên cạnh các tác vụ, còn có một số tác vụ cụ thể được gọi là trình xử lý. Trình xử lý phải có một tên duy nhất trong toàn bộ cẩm nang. Chúng hoạt động theo cách tương tự như một tác vụ thông thường nhưng trình xử lý có thể được thông báo qua trình thông báo.

Nếu trình xử lý không được thông báo trong quá trình chạy playbook thì nó sẽ không chạy. Tuy nhiên, nếu có nhiều tác vụ thông báo cho trình xử lý thì tác vụ này sẽ chỉ chạy một lần sau khi tất cả tác vụ hoàn tất.

Trong ví dụ hiển thị bên dưới, bạn có thể thấy một tác vụ cụ thể có phần thông báo yêu cầu một tác vụ khác như thế nào. Nếu đầu ra của tác vụ đầu tiên bị thay đổi thì tác vụ xử lý sẽ được gọi. Ví dụ tốt nhất là thay đổi tệp cấu hình và sau đó khởi động lại dịch vụ cụ thể đó.

---

- hosts: group2
  tasks:
  - name: sshd config file modify port
    lineinfile:
     path: /etc/ssh/sshd_config
     regexp: 'Port 28675'
     line: '#Port 22'
    notify:
       - restart sshd
handlers
    - name: restart sshd
      service: sshd
        name: sshd
        state: restarted

Trong trường hợp này, nếu tác vụ đầu tiên, “cổng sửa đổi tập tin cấu hình sshd” bị thay đổi, nghĩa là nếu cổng đó không phải là 28675 ngay từ đầu thì nó sẽ được sửa đổi và tác vụ sẽ thông báo cho trình xử lý có cùng tên để chạy , và nó sẽ khởi động lại dịch vụ sshd.

Playbook Ansible

Giải thích:

  1. Ví dụ về trình thông báo
  2. Ví dụ về trình xử lý

Vai trò Ansible

Khi xử lý các sổ tay mở rộng, việc chia nhiệm vụ thành các vai trò sẽ dễ dàng hơn. Điều này cũng giúp tái sử dụng các vai trò trong tương lai. Vai trò là một tập hợp các nhiệm vụ, có thể được di chuyển từ sổ tay này sang sổ tay khác, có thể chạy độc lập nhưng chỉ thông qua tệp sổ tay.

Vai trò được lưu trữ trong các thư mục riêng biệt và có cấu trúc thư mục cụ thể.

[root@ansible-server test2]# tree
.
`-- role1
    |-- defaults
    |   `-- main.yml
    |-- handlers
    |   `-- main.yml
    |-- meta
    |   `-- main.yml
    |-- README.md
    |-- tasks
    |   `-- main.yml
    |-- tests
    |   |-- inventory
    |   `-- test.yml
    `-- vars
        `-- main.yml

7 directories, 8 files

Tệp yaml trong thư mục mặc định chứa danh sách các biến mặc định sẽ được sử dụng cùng với sổ tay. Thư mục handlers được sử dụng để lưu trữ các handlers. Thư mục meta được cho là có thông tin về tác giả và vai trò phụ thuộc. Trong thư mục tác vụ có tệp yaml chính cho vai trò.

Thư mục kiểm tra chứa tệp sổ tay yaml mẫu và tệp kiểm kê mẫu và chủ yếu được sử dụng cho mục đích thử nghiệm trước khi tạo vai trò thực tế.

Thư mục vars chứa tệp yaml trong đó tất cả các biến được vai trò sử dụng sẽ được xác định. Các mẫu thư mục và tệp thư mục phải chứa các tệp và mẫu sẽ được các tác vụ trong vai trò sử dụng.

Để tạo cây thư mục cho một vai trò, bạn nên sử dụng lệnh sau với tham số cuối cùng là tên vai trò:

[root@ansible-server test2]# ansible-galaxy init role1

Ansible cũng hoạt động tốt với các mẫu. Là ngôn ngữ tạo khuôn mẫu, nó sử dụng Jinja2.

Trong ví dụ tiếp theo, bạn sẽ tìm hiểu mẫu jinja2 cơ bản trông như thế nào và sử dụng nó trong một vai trò.

Vào thời gian chạy, tùy thuộc vào, giả sử máy chủ của bạn được đặt ở trung tâm dữ liệu nào, bạn có thể chọn từ nhiều máy chủ tên, mỗi máy chủ tên tương ứng với một trung tâm dữ liệu, bằng cách sử dụng biến “resolver_ip_addresses”.

{% for resolver in resolver_ip_addresses %}
nameserver {{ resolver }}
{% endfor %}

options timeout:1
options attempts:5
options rotate

Trong ví dụ này, trong thư mục playbook, có một số biến được xác định, bao gồm một biến có tên là Resolver_ip_addresses với các giá trị khác nhau tùy thuộc vào trung tâm dữ liệu.

- name: Set resolver for server
  template:
    src: dns.j2
    dest: /etc/resolv.conf
    group: root
    owner: root
    mode: "0644"
    tag: resolver	

Vai trò Ansible

Giải thích:

  1. Tên của mẫu sẽ được sử dụng. Mẫu nằm trong thư mục mẫu trong đường dẫn vai trò
  2. Đường dẫn đích của tên tệp sẽ được thay thế bằng mẫu, ở phía máy khách.
  3. Quyền của tệp đích

Các tác vụ vai trò cũng có thể có trường thẻ có tên được gán. Nhiều nhiệm vụ có thể chia sẻ cùng một thẻ. Khi chạy một playbook ansible, bạn cũng có thể chỉ định thẻ để các tác vụ đó sẽ được thực thi.

Nghiên cứu trường hợp Ansible

Trong phần này, chúng tôi sẽ phân tích một Nghiên cứu điển hình về một playbook ansible thiết yếu có ba vai trò. Mục đích của việc này là đưa ra một ví dụ thực tế về những gì chúng ta đã nói trước đây. Một số ví dụ được sử dụng trước đây trong hướng dẫn Playbook Ansible này sẽ được điều chỉnh và sử dụng trong playbook này.

Dưới đây là cấu trúc thư mục của playbook. Tệp Yaml sẽ được sử dụng sẽ là p4.yml.

[root@ansible-server test_ansible]# ls -lrth
total 16K
-rw-r--r--. 1 root root   0 Jul  3 10:13 testfile
-rw-r--r--. 1 root root 203 Jul  3 13:30 p1.yml
-rw-r--r--. 1 root root 125 Jul  3 15:00 hosts
-rw-r--r--. 1 root root 488 Jul  3 16:40 p2.yml
-rw-r--r--. 1 root root 188 Jul  4 17:33 p4.yml
drwxr-xr-x. 5 root root  47 Jul  4 17:35 roles
[root@ansible-server test_ansible]# cd roles
[root@ansible-server roles]# ls -lrth
total 12K
drwxr-xr-x. 9 root root 4.0K Jul  4 12:52 httpd
drwxr-xr-x. 9 root root 4.0K Jul  4 13:55 selinux
drwxr-xr-x. 9 root root 4.0K Jul  4 16:54 resolver

Playbook có ba vai trò, một vai trò được gọi là trình phân giải, đặt một máy chủ tên cụ thể trên các máy chủ bằng cách sao chép tệp từ máy chủ đến đích /etc/resolv.conf. Một cái khác được gọi là httpd và nó cài đặt gói httpd với mô-đun yum, còn cái thứ ba kích hoạt SELinux và thông báo cho người dùng đã đăng nhập khởi động lại hệ thống. Mỗi vai trò được tạo bằng lệnh ansible-galaxy.

Vai trò của người giải quyết, tác vụ main.yml:

Nghiên cứu trường hợp Ansible

Vai trò httpd, tác vụ main.yml:

Nghiên cứu trường hợp Ansible

Vai trò Selinux, tác vụ main.yml:

Nghiên cứu trường hợp Ansible

Dưới đây là playbook p4.yml được định nghĩa. Nó sẽ chạy trên tất cả các máy chủ nếu không được chỉ định khác trong dòng lệnh, nó sẽ chạy với tư cách là người dùng root trên cổng 22 (SSH), nó sẽ thu thập thông tin trước khi chạy các vai trò và nó sẽ chạy cả ba vai trò đã đề cập trước đó. Mỗi vai trò có thể được chạy độc lập bằng cách chỉ định thẻ trong dòng lệnh ansible-playbook với tham số –t.

---

- hosts: all
  user: root
  port: 22
  gather_facts: True
  roles:
    - { role: selinux, tags: selinux }
    - { role: httpd, tags: httpd }
    - { role: resolver, tags: resolver }

Chạy playbook p4.yml trên hai máy chủ và diễn giải kết quả đầu ra. Lệnh tương tự có thể được chạy với tham số –check để chạy thử. Trong trường hợp bạn muốn sử dụng xác thực mật khẩu, hãy sử dụng tham số -k.

Nghiên cứu trường hợp Ansible

Giải thích:

  1. Lệnh Ansible-playbook chạy p4.yml
  2. Playbook bỏ qua vai trò SELinux vì nó đã được bật.
  3. Ansible thấy rằng gói httpd đã được cài đặt nên nó trả về ok.
  4. Trình phân giải đã được đặt và trình phân giải vai trò đã thay đổi trạng thái.

Bảng cheat lệnh Ansible

Cài đặt repo EPEL trên hệ thống Centos/RHEL

[root@ansible-server ~]# sudo yum install epel-release

Cài đặt gói ansible trên hệ thống Centos/RHEL

[root@ansible-server ~]# sudo  yum install -y ansible

Thực hiện cập nhật các gói trên Debian/Ubuntu hệ thống

$ sudo apt update

Cài đặt gói chung thuộc tính phần mềm trên Debian/Ubuntu hệ thống

$ sudo apt install software-properties-common

Cài đặt kho lưu trữ gói cá nhân ansible trên Debian/Ubuntu hệ thống

$ sudo apt-add-repository ppa:ansible/ansible

Cài đặt ansible trên Debian/Ubuntu hệ thống

$ sudo apt update
$ sudo apt install ansible

Đưa ra lệnh ping trên tất cả các máy chủ được xác định trong tệp kiểm kê có tên là máy chủ

 
[root@ansible-server test_ansible]# ansible -i hosts all -m ping

Chỉ phát lệnh ping trên Host2

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2

Copy file “testfile” trên tất cả các máy trong file Inventory

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"

Cài đặt gói ncdu trên tất cả các máy chủ

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'

Xóa gói ncdu trên tất cả các máy chủ

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'

Xây dựng cấu trúc thư mục cho vai trò có tên role1.

[root@ansible-server test2]# ansible-galaxy init role1

Playbook p4.yml chạy khô

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml --check

Chạy playbook p4.yml với xác thực mật khẩu cho tất cả máy chủ

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml -k

Tổng kết

Trong một thế giới mà công nghệ liên tục thay đổi với tốc độ chóng mặt và phát triển cực kỳ nhanh chóng, các quản trị viên hệ thống và kỹ sư devops phải nghĩ ra nhiều cách tiếp cận khác nhau về cách tự động hóa các tác vụ thường xuyên và sắp xếp nhiều máy chủ.

Trong khi có rất nhiều thay thế cho Ansible (Chef, Puppet) ngoài kia làm điều tương tự với một số điểm khác biệt, Ansible đã cố gắng vượt lên trên tất cả nhờ sự đơn giản, tính bảo mật được cải thiện và quan trọng nhất là quá trình học tập suôn sẻ. Do những đặc tính này và khả năng tiếp nhận Ansible nhanh chóng, chúng tôi đã tạo một hướng dẫn chứa đầy các ví dụ để bạn có thể có trải nghiệm đầu tiên liền mạch hơn nữa khi làm việc với Ansible.

Trong hướng dẫn cơ bản về Ansible này, chúng tôi đã mô tả ansible và nói một chút về lịch sử của nó. Chúng tôi đã đề cập đến những điểm mạnh của Ansible và những lợi thế mà ansible có thể mang lại cho việc tự động hóa và điều phối cơ sở hạ tầng ở các quy mô khác nhau. Chúng tôi đã xác định các thuật ngữ được sử dụng thiết yếu trong Ansible và xác định cấu trúc của sách chơi Ansible. Các ví dụ kỹ lưỡng kèm theo tất cả thông tin với lời giải thích chi tiết.