Thứ ba, 14/04/2020 | 00:00 GMT+7

Tự động thiết lập server với Ansible: Bộ công cụ hội thảo DigitalOcean

Bộ công cụ hội thảo này được thiết kế để giúp khán giả kỹ thuật làm quen với các khái niệm quản lý cấu hình và cách sử dụng Ansible để tự động cài đặt cơ sở hạ tầng server .

Tự động cài đặt server với tài liệu bộ công cụ hội thảo Ansible

Mục đích là cung cấp một bộ tài nguyên hoàn chỉnh cho một diễn giả để tổ chức một sự kiện và cung cấp một bài nói chuyện giới thiệu về Ansible. Nó bao gồm:

  • Trang trình bày và ghi chú của người thuyết trình bao gồm các video demo ngắn và các lệnh để chạy một bản demo trực tiếp tùy chọn. Buổi nói chuyện này kéo dài khoảng 50 phút.
  • Kho lưu trữ GitHub chứa mã ứng dụng demo và các tập lệnh Ansible cần thiết để triển khai ứng dụng đó lên server Ubuntu.
  • Hướng dẫn này hướng dẫn user triển khai ứng dụng Laravel demo trên Travellist trên server từ xa.

Hướng dẫn này nhằm bổ sung cho bản demo nói chuyện với các chi tiết bổ sung và làm sáng tỏ. Nó cũng đóng role là tài liệu tham khảo cho những người đọc đang tìm cách triển khai ứng dụng Laravel tới server Ubuntu từ xa bằng Ansible.

Tự động hóa server hiện nay đóng một role thiết yếu trong quản trị hệ thống, do tính chất dùng một lần của các môi trường ứng dụng hiện đại. Các công cụ quản lý cấu hình như Ansible thường được sử dụng để hợp lý hóa quá trình tự động hóa cài đặt server bằng cách cài đặt các quy trình tiêu chuẩn cho các server mới. Điều này có lợi là giảm lỗi do con người liên quan đến cài đặt thủ công.

Ansible cung cấp một kiến trúc đơn giản không yêu cầu cài đặt phần mềm đặc biệt trên các nút. Nó cũng cung cấp một bộ tính năng mạnh mẽ và các module tích hợp giúp tạo điều kiện thuận lợi cho việc viết các tập lệnh tự động hóa.

Hướng dẫn này, được thiết kế để đi kèm với Trang trình bày và ghi chú của diễn giả cho Cài đặt server tự động với Ansible Workshop Kit , sẽ chỉ cho bạn cách cài đặt file khoảng không quảng cáo và thực thi một bộ tập lệnh cấp phép để hoàn toàn tự động hóa quá trình cài đặt server LEMP từ xa ( L inux, ( E ) Nginx, M ariaDB và P HP-FPM) trên Ubuntu 18.04 và triển khai ứng dụng Laravel demo cho hệ thống này.

Lưu ý : Tài liệu này nhằm trình bày cách sử dụng sách phát để tự động cài đặt server với Ansible. Mặc dù bản trình diễn của ta bao gồm một ứng dụng Laravel chạy trên server LEMP, người đọc được khuyến khích sửa đổi và điều chỉnh cài đặt đi kèm cho phù hợp với nhu cầu của riêng họ.

Yêu cầu

Để làm theo hướng dẫn này, bạn cần :

  • Một nút điều khiển Ansible : máy Ubuntu 18.04 được cài đặt và cấu hình Ansible để kết nối với các server Ansible của bạn bằng các SSH key . Đảm bảo rằng nút điều khiển có regular user với quyền sudo và firewall được kích hoạt, như được giải thích trong hướng dẫn Cài đặt Server Ban đầu của ta và một bộ khóa SSH hợp lệ. Để cài đặt Ansible, hãy làm theo hướng dẫn của ta về Cách cài đặt và cấu hình Ansible trên Ubuntu 18.04 .
  • Một hoặc nhiều Server Ansible : một hoặc nhiều server Ubuntu 18.04 từ xa. Mỗi server phải có public key của nút điều khiển được thêm vào file authorized_keys của nó, như được giải thích trong Bước 2 của hướng dẫn Cách cài đặt SSH key trên Ubuntu 18.04 .Trong trường hợp bạn đang sử dụng DigitalOcean Server làm nút, bạn có thể sử dụng control panel để thêm public key vào server Ansible của bạn .

Bước 1 - Nhân bản Kho lưu trữ Demo

Điều đầu tiên ta cần làm là sao chép kho chứa các tập lệnh cấp phép Ansible và ứng dụng Laravel demo mà ta sẽ triển khai cho các server từ xa. Tất cả các file cần thiết có thể được tìm thấy tại repository Github do-community / ansible-laravel-demo .

Sau khi đăng nhập vào nút điều khiển Ansible với quyền là user sudo của bạn, hãy sao chép repository và chuyển đến folder được tạo bởi git :

  • git clone https://github.com/do-community/ansible-laravel-demo.git
  • cd ansible-laravel-demo

Bây giờ, bạn có thể chạy ls để kiểm tra nội dung của repository nhân bản:

  • ls -l --group-directories-first

Bạn sẽ thấy kết quả như thế này:

ansible-laravel-demo
drwxrwxr-x 3 sammy sammy 4096 Mar 24 15:24 application drwxrwxr-x 2 sammy sammy 4096 Mar 24 15:24 group_vars drwxrwxr-x 7 sammy sammy 4096 Mar 24 15:24 roles -rw-rw-r-- 1 sammy sammy  102 Mar 24 15:24 inventory-example -rw-rw-r-- 1 sammy sammy 1987 Mar 24 15:24 laravel-deploy.yml -rw-rw-r-- 1 sammy sammy  794 Mar 24 15:24 laravel-env.j2 -rw-rw-r-- 1 sammy sammy  920 Mar 24 15:24 readme.md -rw-rw-r-- 1 sammy sammy  318 Mar 24 15:24 server-setup.yml 

Dưới đây là tổng quan về từng folder và file này và chúng là gì:

  • application/ : Thư mục này chứa ứng dụng Laravel demo sẽ được triển khai trên server từ xa vào cuối hội thảo.
  • group_vars/ : Thư mục này chứa các file biến có chứa các tùy chọn tùy chỉnh để cài đặt ứng dụng, chẳng hạn như thông tin xác thực database và nơi lưu trữ các file ứng dụng trên server từ xa.
  • roles/ : Thư mục này chứa các role Ansible khác nhau xử lý việc cung cấp server LEMP Ubuntu.
  • inventory-example : Tệp này được dùng làm cơ sở để tạo khoảng không quảng cáo tùy chỉnh cho cơ sở hạ tầng của bạn.
  • laravel-deploy.yml : laravel-deploy.yml này sẽ triển khai ứng dụng Laravel demo cho server từ xa.
  • laravel-env.j2 : Mẫu này được sử dụng bởi laravel-deploy.yml để cài đặt file môi trường ứng dụng.
  • readme.md : Tệp này chứa thông tin chung về việc cung cấp có trong repository này.
  • server-setup.yml : server-setup.yml này sẽ cung cấp một server LEMP sử dụng các role được xác định trong các roles/ folder .

Bước 2 - Cài đặt file khoảng không quảng cáo và kiểm tra kết nối với các nút

Bây giờ ta sẽ tạo một file khoảng không quảng cáo để liệt kê các server ta muốn quản lý bằng Ansible. Đầu tiên, sao chép file inventory-example về inventory-example file mới có tên là hosts :

  • cp inventory-example hosts

Bây giờ, hãy sử dụng editor mà bạn chọn để mở file kiểm kê mới và cập nhật file đó với các server của bạn . Ở đây, ta sẽ sử dụng nano :

  • nano hosts

Ví dụ về khoảng không quảng cáo đi kèm với bộ công cụ hội thảo chứa hai group Ansible: devproduction . Điều này nghĩa là để chứng minh cách sử dụng các biến group để tùy chỉnh triển khai trong nhiều môi trường. Nếu bạn muốn kiểm tra cài đặt này với một nút duy nhất, bạn có thể sử dụng một trong hai dev hoặc production group và loại bỏ một trong những khác từ file tồn kho.

ansible-laravel-demo / hosts
[dev] 203.0.113.0.101  [prod] 203.0.113.0.102  [all:vars] ansible_python_interpreter=/usr/bin/python3 

Lưu ý : biến ansible_python_interpreter xác định đường dẫn đến file thực thi Python trên server từ xa. Ở đây, ta đang yêu cầu Ansible đặt biến này cho tất cả các server trong file khoảng không quảng cáo này.

Lưu file khi bạn hoàn tất. Nếu bạn đang sử dụng nano , bạn có thể thực hiện điều đó bằng cách nhấn CTRL+X , sau đó nhấn YENTER để xác nhận.

Sau khi điều chỉnh xong file khoảng không quảng cáo của bạn , bạn có thể thực thi module ping Ansible để kiểm tra xem nút điều khiển có thể kết nối với server hay không:

  • ansible all -i hosts -m ping -u root

Hãy chia nhỏ lệnh này:

  • all : Tùy chọn này yêu cầu Ansible chạy lệnh sau trên tất cả các server từ file khoảng không quảng cáo được chỉ định.
  • -i hosts : Chỉ định khoảng không quảng cáo nào nên được sử dụng. Khi tùy chọn này không được cung cấp, Ansible sẽ cố gắng sử dụng khoảng không quảng cáo mặc định, thường được đặt tại /etc/ansible/hosts .
  • -m ping : Điều này sẽ thực thi module ping Ansible, module này sẽ kiểm tra kết nối với các nút và có thể tìm thấy file thực thi Python trên các hệ thống từ xa hay không.
  • -u root : Tùy chọn này chỉ định user từ xa nào nên được sử dụng để kết nối với các nút. Ta đang sử dụng account gốc ở đây làm ví dụ vì đây thường là account duy nhất có sẵn trên các server mới. Các tùy chọn kết nối khác có thể cần thiết tùy thuộc vào nhà cung cấp cơ sở hạ tầng và cấu hình SSH của bạn.

Nếu kết nối SSH của bạn với các nút được cài đặt đúng cách, bạn sẽ nhận được kết quả sau:

Output
203.0.113.0.101 | SUCCESS => { "changed": false, "ping": "pong" } 203.0.113.0.102 | SUCCESS => { "changed": false, "ping": "pong" }

Phản hồi pong nghĩa là nút điều khiển của bạn có thể kết nối với các nút được quản lý của bạn và Ansible có thể thực thi các lệnh Python trên các server từ xa.

Bước 3 - Cài đặt file biến

Trước khi chạy các playbook có trong bộ công cụ hội thảo này, trước tiên, bạn cần chỉnh sửa file biến có chứa các cài đặt như tên của user từ xa để tạo và thông tin đăng nhập database để cài đặt với MariaDB.

Mở group_vars/all bằng cách sử dụng editor mà bạn chọn:

  • nano group_vars/all.yml
ansible-laravel-demo / group_vars / all.yml
--- # Initial Server Setup remote_user: sammy  # MySQL Setup mysql_root_password: MYSQL_ROOT_PASSWORD mysql_app_db: travellist mysql_app_user: travellist_user mysql_app_pass: DB_PASSWORD  # Web Server Setup http_host: "{{ ansible_facts.eth0.ipv4.address }}" remote_www_root: /var/www app_root_dir: travellist-demo document_root: "{{ remote_www_root }}/{{ app_root_dir }}/public"  # Laravel Env Variables app_name: Travellist app_env: dev app_debug: true app_url: "http://{{ http_host }}" db_host: localhost db_port: 3306 db_database: "{{ mysql_app_db }}" db_user: "{{ mysql_app_user }}" db_pass: "{{ mysql_app_pass }}" 

Các biến số bạn cần chú ý là:

  • remote_user : User được chỉ định sẽ được tạo trên server từ xa và được cấp quyền sudo .
  • mysql_root_password : Biến này xác định password root của database cho server MariaDB. Lưu ý đây phải là password an toàn do chính bạn chọn.
  • mysql_app_db : Tên của database để tạo cho ứng dụng Laravel. Bạn không cần thay đổi giá trị này, nhưng bạn có thể tự do làm như vậy nếu muốn. Giá trị này sẽ được sử dụng để cài đặt các .env file cấu hình Laravel.
  • mysql_app_user : Tên của user database cho ứng dụng Laravel. , bạn không bắt buộc phải thay đổi giá trị này, nhưng bạn có thể tự do làm như vậy.
  • mysql_app_pass : Mật khẩu database cho ứng dụng Laravel. Đây phải là password an toàn do bạn chọn.
  • http_host : Tên domain hoặc địa chỉ IP của server lưu trữ từ xa. Ở đây, ta đang sử dụng một dữ kiện Ansible có chứa địa chỉ ipv4 cho network interface eth0 . Trong trường hợp bạn có domain trỏ đến server từ xa của bạn , bạn có thể cần tạo các file biến riêng biệt cho từng server , overrides giá trị này để cấu hình Nginx chứa tên server chính xác cho mỗi server .

Khi bạn hoàn tất việc chỉnh sửa các giá trị này, hãy lưu file .

Tạo các file biến bổ sung cho nhiều môi trường

Nếu bạn đã cài đặt file khoảng không quảng cáo của bạn với nhiều nút, bạn có thể cần tạo các file biến bổ sung để cấu hình từng nút cho phù hợp. Trong khoảng không quảng cáo mẫu của ta , ta đã tạo ra hai group riêng biệt: devproduction . Để tránh có cùng thông tin xác thực database và các cài đặt khác trong cả hai môi trường, ta cần tạo một file biến riêng biệt để giữ các giá trị production .

Bạn có thể cần sao chép file biến mặc định và sử dụng file đó làm cơ sở cho các giá trị production của bạn :

  • cp group_vars/all.yml group_vars/production.yml
  • nano group_vars/production.yml

Bởi vì file all.yml chứa các giá trị mặc định phải hợp lệ cho tất cả các môi trường, bạn có thể xóa tất cả các biến không cần thay đổi khỏi file production.yml mới. Các biến mà bạn nên cập nhật cho từng môi trường được đánh dấu ở đây:

ansible-laravel-demo / group_vars / production
--- # Initial Server Setup remote_user: prod_user  # MySQL Setup mysql_root_password: MYSQL_PROD_ROOT_PASSWORD mysql_app_pass: MYSQL_PROD_APP_PASSWORD  # Laravel Env Variables app_env: prod app_debug: false 

Lưu ý ta đã thay đổi giá trị app_env thành prod và đặt giá trị app_debug thành false . Đây là các cài đặt Laravel được khuyến khích cho môi trường production .

Sau khi bạn hoàn tất việc tùy chỉnh các biến production của bạn , hãy lưu file .

Mã hóa các file biến với Ansible Vault

Nếu bạn dự định chia sẻ cài đặt Ansible của bạn với những user khác, điều quan trọng là phải giữ an toàn thông tin đăng nhập database và dữ liệu nhạy cảm khác trong các file biến của bạn. Điều này có thể thực hiện được với Ansible Vault, một tính năng có trong Ansible theo mặc định. Ansible Vault cho phép bạn mã hóa các file biến để chỉ những user có quyền truy cập vào password vault mới có thể xem, chỉnh sửa hoặc giải mã các file này. Mật khẩu vault cũng cần thiết để chạy playbook hoặc lệnh sử dụng các file được mã hóa.

Để mã hóa file biến production của bạn, hãy chạy:

  • ansible-vault encrypt group_vars/production.yml

Bạn sẽ được yêu cầu cung cấp password vault và xác nhận nó. Sau khi hoàn tất, nếu bạn kiểm tra nội dung của file đó, bạn sẽ thấy rằng dữ liệu hiện đã được mã hóa.

Nếu bạn muốn xem file biến mà không thay đổi nội dung của nó, bạn có thể sử dụng lệnh view :

  • ansible-vault view group_vars/production.yml

Bạn sẽ được yêu cầu cung cấp cùng một password mà bạn đã xác định khi mã hóa file đó bằng ansible-vault . Sau khi cung cấp password , nội dung của file sẽ xuất hiện trong terminal của bạn. Để thoát khỏi chế độ xem file , hãy nhập q .

Để chỉnh sửa file đã được mã hóa trước đó bằng Ansible Vault, hãy sử dụng lệnh edit vault:

  • ansible-vault edit group_vars/production.yml

Lệnh này sẽ nhắc bạn cung cấp password vault cho file đó. Editor terminal mặc định của bạn sau đó sẽ được sử dụng để mở file để chỉnh sửa. Sau khi áp dụng các thay đổi mong muốn, hãy lưu file , file sẽ được Ansible Vault tự động mã hóa lại.

Đến đây bạn đã hoàn tất việc cài đặt các file biến của bạn . Trong bước tiếp theo, ta sẽ chạy playbook để cài đặt Nginx, PHP-FPM và MariaDB (cùng với hệ điều hành dựa trên Linux như Ubuntu, tạo thành LEMP ) trên (các) server từ xa của bạn.

Bước 4 - Chạy LEMP Playbook

Trước khi triển khai ứng dụng Laravel demo cho (các) server từ xa, ta cần cài đặt môi trường LEMP sẽ phục vụ ứng dụng. server-setup.yml bao gồm các role Ansible cần thiết để cài đặt điều này. Để kiểm tra nội dung của nó, hãy chạy:

  • cat server-setup.yml
ansible-laravel-demo / server-setup.yml
--- - hosts: all   become: true   roles:     - { role: setup, tags: ['setup'] }      - { role: mariadb, tags: ['mysql', 'mariadb', 'db', 'lemp'] }      - { role: php, tags: ['php', 'web', 'php-fpm', 'lemp'] }      - { role: nginx, tags: ['nginx', 'web', 'http', 'lemp'] }      - { role: composer, tags: ['composer'] } 

Dưới đây là tổng quan về tất cả các role có trong sách vở này:

  • setup : Chứa các việc cần thiết để tạo user hệ thống mới và cấp cho họ các quyền sudo , cũng như kích hoạt firewall ufw .
  • mariadb : Cài đặt server database MariaDB và tạo database ứng dụng và user .
  • php : Cài đặt các module php-fpm và PHP cần thiết để chạy ứng dụng Laravel.
  • nginx : Cài đặt web server Nginx và cho phép truy cập trên cổng 80 .
  • composer : Cài đặt Composer trên phạm vi global .

Lưu ý ta đã cài đặt một vài thẻ trong mỗi role . Điều này là để tạo điều kiện cho việc chỉ chạy lại các phần của playbook này, nếu cần. Ví dụ: nếu bạn áp dụng các thay đổi đối với file mẫu Nginx của bạn , bạn có thể chỉ muốn chạy role Nginx.

Lệnh sau sẽ thực thi playbook này trên tất cả các server từ file kho của bạn. --ask-vault-pass chỉ cần thiết trong trường hợp bạn đã sử dụng ansible-vault để mã hóa các file biến trong bước trước:

  • ansible-playbook -i hosts server-setup.yml -u root --ask-vault-pass

Bạn sẽ nhận được kết quả tương tự như sau:

Output
PLAY [all] ********************************************************************************************** TASK [Gathering Facts] ********************************************************************************** ok: [203.0.113.0.101] ok: [203.0.113.0.102] TASK [setup : Install Prerequisites] ******************************************************************** changed: [203.0.113.0.101] changed: [203.0.113.0.102] ... RUNNING HANDLER [nginx : Reload Nginx] ****************************************************************** changed: [203.0.113.0.101] changed: [203.0.113.0.102] PLAY RECAP ********************************************************************************************** 203.0.113.0.101 : ok=31 changed=27 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1 203.0.113.0.102 : ok=31 changed=27 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1

(Các) nút của bạn hiện đã sẵn sàng để phục vụ các ứng dụng PHP sử dụng Nginx + PHP-FPM, với MariaDB làm server database . Trong bước tiếp theo, ta sẽ triển khai ứng dụng Laravel demo đi kèm với laravel-deploy.yml Ansible.

Bước 5 - Triển khai ứng dụng Laravel

Đến đây bạn có một môi trường LEMP hoạt động trên (các) server từ xa của bạn , bạn có thể thực thi laravel-deploy.yml . Playbook này sẽ thực hiện các việc sau:

  1. Tạo root tài liệu ứng dụng trên server từ xa, nếu nó chưa được tạo.
  2. Đồng bộ hóa folder ứng dụng local với server từ xa bằng module sync .
  3. Sử dụng module acl để đặt quyền cho user www-data trên folder lưu trữ.
  4. Cài đặt file ứng dụng .env dựa trên mẫu laravel-env.j2 .
  5. Cài đặt các phần phụ thuộc của ứng dụng với Composer.
  6. Tạo khóa bảo mật ứng dụng.
  7. Cài đặt liên kết công khai cho folder storage .
  8. Chạy di chuyển database và trình seeding .

Playbook này phải được thực thi bởi user không phải root có quyền sudo . User này nên được tạo khi bạn thực thi playbook server-setup.yml ở bước trước, sử dụng tên được xác định bởi biến remote_user .

Khi đã sẵn sàng , hãy chạy laravel-deploy.yml với:

  • ansible-playbook -i hosts laravel-deploy.yml -u sammy --ask-vault-pass

--ask-vault-pass chỉ cần thiết trong trường hợp bạn đã sử dụng ansible-vault để mã hóa các file biến trong bước trước.

Bạn sẽ nhận được kết quả tương tự như sau:

Output
PLAY [all] ********************************************************************************************** TASK [Gathering Facts] ********************************************************************************** ok: [203.0.113.0.101] ok: [203.0.113.0.102] TASK [Make sure the remote app root exists and has the right permissions] ******************************* ok: [203.0.113.0.101] ok: [203.0.113.0.102] TASK [Rsync application files to the remote server] ***************************************************** ok: [203.0.113.0.101] ok: [203.0.113.0.102] ... TASK [Run Migrations + Seeders] ************************************************************************* ok: [203.0.113.0.101] ok: [203.0.113.0.102] PLAY RECAP ********************************************************************************************** 203.0.113.0.101 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 203.0.113.0.102 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

Khi quá trình thực thi kết thúc, bạn có thể truy cập ứng dụng demo bằng cách trỏ trình duyệt của bạn đến domain hoặc địa chỉ IP của nút:

http://node_domain_or_IP 

Bạn sẽ thấy một trang như thế này:

Bản trình diễn danh sách du lịch của Laravel

Kết luận

Hướng dẫn này sẽ cài đặt file kiểm kê Ansible và kết nối với các nút từ xa cũng như cách chạy sách phát Ansible để cài đặt server LEMP và triển khai ứng dụng demo Laravel cho nó. Hướng dẫn này khen ngợi Cài đặt server tự động với các trang trình bày và ghi chú của diễn giả Ansible Workshop Kit, đồng thời kèm theo kho lưu trữ GitHub demo chứa tất cả các file cần thiết để theo dõi thành phần demo của hội thảo này.


Tags:

Các tin trước

Cách cài đặt server phát nhạc trực tuyến Ampache trên Ubuntu 18.04 2020-04-08
Thiết lập server ban đầu với CentOS 8 2020-02-06
Cách thiết lập Nền tảng Cloud IDE server mã trên Ubuntu 18.04 [Quickstart] 2020-01-02
Cách thiết lập server lưu trữ đối tượng bằng Minio trên Ubuntu 18.04 2019-12-13
Cách xây dựng server GraphQL trong Node.js bằng GraphQL-yoga và MongoDB 2019-12-12
Cách thiết lập server GraphQL trong Node.js với server Apollo và Sequelize 2019-12-12
Cách sử dụng Ansible để tự động thiết lập server ban đầu trên Ubuntu 18.04 2019-11-27
Cách sử dụng Ansible để tự động thiết lập server ban đầu trên Ubuntu 18.04 2019-11-27
Cách sử dụng Ansible để tự động thiết lập server ban đầu trên Ubuntu 18.04 2019-11-27
Sử dụng Sự kiện do server gửi trong Node.js để tạo ứng dụng thời gian thực 2019-11-18
Cách thiết lập front-end server PageKite trên Debian 9 2019-10-25