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

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ô-đunCách sử dụng
yêu cầuThực hiện lệnh trên một nút từ xa.
kịch bảnChuyể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ọcThực hiện lệnh thông qua shell ( /bin/sh) trên một nút từ xa.
bản mẫuSử dụng mẫu tệp cục bộ để tạo tệp trên một nút từ xa.
thích hợpQuản lý các gói apt trên hệ thống Debian hoặc Ubuntu.
gitTriể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_serversnhóm và đảm bảo Apache được khởi động. Nhiệm vụ được hoàn thành với tư cách là webadminngườ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ế myPlainTextPasswordbằ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.cfgtệ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 webservernhóm và thêm Linode của bạn vào nhóm. Mở tệp /etc/ansible/hoststrong 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.0bằ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.ymlvà thêm nội dung của ví dụ. Thay thế các giá trị sau trong tệp:

yourusernamevới tên người dùng bạn muốn tạo trên Linode

$6$rounds=656000$W.dSlbằ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 webservernhó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à rootngười dùng.
  • Phần này varstạo ra những NORMAL_USER_NAMEthứ 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 tasksPlaybook 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.ymlPlaybook. --ask-passTù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 rootTù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.ymlvà thêm nội dung của ví dụ. Thay thế các giá trị sau trong tệp:

yourusernamevớ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

web01bằ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.combằ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 commandmô-đun để thiết lập múi giờ của Linode theo giờ UTC.
  • Nhiệm vụ thứ hai sử dụng hostnamemô-đ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 lineinfilemô-đun. Nhiệm vụ này dùng hostvarsđể 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ủ. hostvarslà 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 aptmô-đun.

2.Chạy common_server_setup.ymlPlaybook. Điều này --ask-become-passyê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 để becomengườ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ế limitedUserAccountNamebằ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.ymlPlaybook để 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.ymlvà thêm nội dung của ví dụ. Thay thế các giá trị sau trong tệp:

yourusernamevớ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 connectionstác vụ, hãy thay thế giá trị passwordbằ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 servicetê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:

Nguồn: https://www.linode.com/docs/guides/running-ansible-playbooks/