Thứ tư, 18/02/2015 | 00:00 GMT+7

Cách cấu hình Apache bằng Ansible trên Ubuntu 14.04

Apache là một trong những web server phổ biến nhất hiện nay được sử dụng trên Internet. Nó dễ dàng cài đặt và cấu hình trên các bản phân phối Linux như Ubuntu và Debian, vì nó có trong repository và bao gồm cấu hình mặc định hoạt động ngoài hộp.

Ansible là một công cụ tự động hóa cho phép bạn cấu hình từ xa hệ thống, cài đặt phần mềm và thực hiện các việc phức tạp trên một group server lớn mà không cần phải đăng nhập thủ công vào từng server . Không giống như các lựa chọn thay thế khác, Ansible được cài đặt trên một server duy nhất, thậm chí có thể là máy local của bạn và sử dụng SSH để giao tiếp với từng server từ xa. Điều này cho phép cấu hình server mới cực kỳ nhanh chóng, vì không có gói yêu cầu nào được cài đặt trên mỗi server mới. Nó cực kỳ dễ sử dụng và dễ hiểu, vì nó sử dụng playbook ở định dạng yaml bằng cú pháp dựa trên module đơn giản.

Yêu cầu

Đối với hướng dẫn này, ta sẽ cài đặt Ansible trên một Server chính của Ubuntu 14.04 mới và sử dụng nó để cấu hình Apache trên Server thứ hai. Điều đó nói rằng, hãy nhớ rằng một trong những lợi ích của Ansible là bạn có thể cài đặt nó trên máy local của bạn và quản lý các server khác mà không cần phải ssh vào chúng theo cách thủ công.

Đối với hướng dẫn này, bạn cần :

  • Hai server Ubuntu 14.04: một server chính với Ansible và một server phụ sẽ chạy Apache được cấu hình thông qua Ansible
  • Sudo user không phải root cho cả Server.
  • Ansible được cài đặt trên Server chính. Làm theo hướng dẫn này (lên đến phần Cài đặt SSH key ). Mặc dù hướng dẫn đó được viết cho Ubuntu 12.04, nhưng nó vẫn có liên quan đến Ubuntu 14.04.
  • Các SSH key cho Server chính để cho phép đăng nhập trên Server thứ cấp, bạn có thể thực hiện theo hướng dẫn này trên Server chính.
  • Bản ghi DNS đang hoạt động hoặc cài đặt thủ công file server local trên máy local của bạn (sử dụng địa chỉ IP của Server thứ cấp của bạn), để cài đặt và sử dụng Server ảo sẽ được cấu hình .

Lưu ý : Hướng dẫn này tuân theo các khái niệm được giải thích trong hướng dẫn hiện có:
Cách cấu hình Server Web Apache trên Ubuntu hoặc Debian VPS . Vui lòng xem lại hướng dẫn đó nếu bạn muốn biết thêm thông tin hoặc muốn xem lại quy trình thủ công cùng với quy trình Ansible.

Bước 1 - Cấu hình Ansible

Trong phần này ta sẽ cấu hình Ansible để có thể quản lý server của bạn.

Bước đầu tiên, khi Ansible được cài đặt, là cho Ansible biết server nào cần nói chuyện. Để làm điều này, ta cần tạo một file Ansible hosts. Tệp server Ansible chứa các group server mà ta đề cập đến khi chạy các lệnh Ansible. Theo mặc định, nó nằm trong /etc/ansible/hosts . Tuy nhiên, điều đó được áp dụng trên phạm vi global trên toàn hệ thống của bạn và thường yêu cầu quyền admin . Thay vào đó, để mọi thứ đơn giản hơn, ta cần yêu cầu Ansible sử dụng file server local .

Ansible luôn tìm kiếm file ansible.cfg trong folder local mà nó đang được chạy từ đó và nếu được tìm thấy sẽ overrides cấu hình chung bằng các giá trị local . Với ý nghĩ này, tất cả những gì ta cần làm là nói với Ansible rằng ta muốn sử dụng file hosts trong folder local , thay vì file chung.

Tạo một folder mới (mà ta sẽ sử dụng cho phần còn lại của hướng dẫn này).

mkdir ansible-apache 

Di chuyển vào folder mới.

cd ~/ansible-apache/ 

Tạo một file mới có tên ansible.cfg và mở nó để chỉnh sửa.

nano ansible.cfg 

Trong file đó, ta muốn thêm vào hostfile tùy chọn cấu hình với giá trị của hosts , trong [defaults] group . Sao chép phần sau vào file ansible.cfg , sau đó lưu và đóng nó.

[defaults] hostfile = hosts 

Tiếp theo, file hosts cần được viết. Có rất nhiều tùy chọn có sẵn cho file server . Tuy nhiên, ta có thể bắt đầu với một cái gì đó rất đơn giản.

Tạo file hosts và mở file đó để chỉnh sửa.

nano hosts 

Sao chép phần sau vào file hosts .

[apache] secondary_server_ip ansible_ssh_user=username 

Điều này chỉ định một group server được gọi là apache chứa một server . Thay secondary_server_ip với hostname server thứ cấp hay địa chỉ IP, và username với Tên truy nhập SSH của bạn. Bây giờ Ansible sẽ có thể kết nối với server của bạn.

Lưu ý : Thành phần ansible_ssh_user= username là tùy chọn nếu bạn đang chạy Ansible với quyền user giống như server đích.

Để kiểm tra rằng Ansible đang hoạt động và có thể nói chuyện với server của bạn, bạn có thể chạy một lệnh cơ bản ansible . Ansible đi kèm với rất nhiều mô-đun mặc định , nhưng một nơi tốt để tham khảo là module ping . Nó kiểm tra xem nó có thể kết nối với từng server hay không, giúp dễ dàng kiểm tra tính chính xác của file hosts .

Cách sử dụng cơ bản của lệnh ansible chấp nhận group server và tên module : ansible <group> -m <module> . Để chạy lệnh ping , hãy nhập lệnh sau.

ansible apache -m ping 

Đầu ra sẽ như thế này:

111.111.111.111 | success >> {     "changed": false,     "ping": "pong" } 

Một module Ansible khác hữu ích để kiểm tra là module lệnh . Nó chạy các lệnh tùy chỉnh trên server và trả về kết quả. Để chạy command lệnh bằng lệnh echo , lệnh Unix lặp lại một chuỗi tới terminal , hãy nhập lệnh sau.

ansible apache -m command -a "/bin/echo hello sammy" 

Đầu ra sẽ như thế này:

111.111.111.111 | success | rc=0 >> hello sammy 

Đây là cách sử dụng cơ bản của Ansible. Sức mạnh thực sự đến từ việc tạo các playbook chứa nhiều nhiệm vụ Ansible. Ta sẽ đề cập đến những điều tiếp theo.

Bước 2 - Tạo Playbook

Trong phần này, ta sẽ tạo một playbook Ansible cơ bản để cho phép bạn chạy các module phức tạp hơn một cách dễ dàng.

Một playbook Ansible rất cơ bản là một file yaml chỉ định group server và một hoặc nhiều tác vụ sẽ được chạy trên các server trong group được chỉ định. Chúng khá đơn giản và dễ đọc, đó là một trong những lý do tại sao Ansible lại mạnh mẽ đến vậy.

Hãy tạo một version playbook cơ bản của lệnh hello sammy ở trên.

Tạo một file có tên apache.yml và mở nó để chỉnh sửa.

nano apache.yml 

Sao chép văn bản sau vào file , sau đó lưu và đóng nó.

--- - hosts: apache   tasks:     - name: run echo command       command: /bin/echo hello sammy 

Khai báo hosts: apache ở trên cùng, điều này cho Ansible biết rằng ta đang sử dụng group server apache . Điều này tương đương với việc chuyển nó qua lệnh ansible . Tiếp theo là danh sách các nhiệm vụ. Trong ví dụ này, ta có một nhiệm vụ với tên run echo command . Đây chỉ đơn giản là một mô tả nhằm mục đích cho user hiểu nhiệm vụ đang làm. Cuối cùng, dòng command: /bin/echo hello sammy chạy module command với các đối số /bin/echo hello sammy .

Lệnh ansible-playbook được sử dụng để chạy playbook và cách sử dụng đơn giản nhất là: ansible-playbook your-playbook.yml . Ta có thể chạy playbook vừa tạo bằng lệnh sau.

ansible-playbook apache.yml 

Đầu ra sẽ như thế này.

PLAY [apache] *****************************************************************  GATHERING FACTS *************************************************************** ok: [111.111.111.111]  TASK: [run echo command] ****************************************************** changed: [111.111.111.111]  PLAY RECAP ******************************************************************** 111.111.111.111            : ok=2    changed=1    unreachable=0    failed=0 

Điều quan trọng nhất cần lưu ý ở đây là playbook không trả về kết quả kết quả của module , vì vậy không giống như lệnh trực tiếp mà ta đã sử dụng ở Bước 1, ta không thể biết liệu hello sammy đã thực sự được in hay chưa. Điều này nghĩa là sách phát phù hợp hơn cho các việc mà bạn không cần xem kết quả kết quả . Ansible sẽ cho bạn biết liệu có lỗi xảy ra trong quá trình thực thi module hay không, vì vậy bạn thường chỉ cần dựa vào đó để biết nếu có gì sai.

Bước 3 - Cài đặt Apache

Bây giờ ta đã giới thiệu playbook, ta sẽ viết tác vụ cài đặt web server Apache.

Thông thường trên Ubuntu, cài đặt Apache là một trường hợp đơn giản là cài đặt gói apache2 thông qua apt-get . Để thực hiện điều này thông qua Ansible, ta sử dụng module apt của Ansible. Mô-đun apt chứa một số tùy chọn cho chức năng apt-get chuyên biệt. Các tùy chọn ta quan tâm là:

  • name : Tên của gói sẽ được cài đặt, một tên gói hoặc danh sách các gói.
  • trạng thái : Chấp nhận latest , absent hoặc present . Mới nhất đảm bảo version mới nhất đã được cài đặt, hiện tại chỉ cần kiểm tra xem nó đã được cài đặt chưa và xóa nó nếu nó được cài đặt.
  • update_cache : Cập nhật bộ nhớ đệm (thông qua apt-get update ) nếu được bật, đảm bảo nó được cập nhật.

Lưu ý : Các trình quản lý gói khác với apt cũng có các module . Mỗi trang module có các ví dụ thường bao gồm tất cả các trường hợp sử dụng chính, giúp bạn dễ dàng hiểu được cách sử dụng từng module . Hiếm khi phải tìm ở nơi khác để biết hướng dẫn sử dụng.

Bây giờ, hãy cập nhật playbook apache.yml của ta với module apt thay vì module command . Mở file apache.yml để chỉnh sửa lại.

nano apache.yml 

Xóa văn bản hiện có và sao chép văn bản sau vào đó.

--- - hosts: apache   sudo: yes   tasks:     - name: install apache2       apt: name=apache2 update_cache=yes state=latest 

Dòng apt cài đặt gói apache2 ( name=apache2 ) và đảm bảo ta đã cập nhật cache ( update_cache=yes ). Mặc dù nó là tùy chọn, bao gồm cả state=latest để rõ ràng rằng nó nên được cài đặt là một ý tưởng hay.

Trừ khi Playbook của bạn đang chạy dưới dạng root trên mỗi server lưu trữ, bạn sẽ phải sử dụng sudo đảm bảo các quyền phù hợp. Ansible hỗ trợ sudo như một phần của tùy chọn đơn giản trong Playbook. Nó cũng có thể được áp dụng thông qua lệnh ansible-playbook và ở cấp độ mỗi tác vụ.

Bây giờ chạy playbook.

ansible-playbook apache.yml --ask-sudo-pass 

Cờ --ask-sudo-pass sẽ nhắc bạn nhập password sudo trên Server thứ cấp. Điều này là cần thiết vì quá trình cài đặt yêu cầu quyền root; các lệnh khác mà ta đã chạy cho đến nay thì không.

Đầu ra sẽ như thế này.

PLAY [apache] *****************************************************************  GATHERING FACTS *************************************************************** ok: [111.111.111.111]  TASK: [install apache2] ******************************************************* changed: [111.111.111.111]  PLAY RECAP ******************************************************************** 111.111.111.111            : ok=2    changed=1    unreachable=0    failed=0 

Nếu bạn truy cập tên server hoặc địa chỉ IP của server phụ trong trình duyệt của bạn , bây giờ bạn sẽ nhận được Trang mặc định của Apache2 Ubuntu để chào đón bạn. Điều này nghĩa là bạn có một bản cài đặt Apache đang hoạt động trên server của bạn và bạn chưa kết thêm thủ công với nó để chạy lệnh.

Một khái niệm quan trọng cần lưu ý tại thời điểm này là không có tính bất thường , làm cơ sở cho cách các module Ansible hoạt động. Ý tưởng là bạn có thể chạy lặp lại cùng một lệnh, nhưng nếu mọi thứ đã được cấu hình trong lần chạy đầu tiên, thì tất cả các lần chạy tiếp theo không có thay đổi nào. Hầu hết tất cả các module Ansible đều hỗ trợ nó, bao gồm cả module apt .

Ví dụ: chạy lại cùng một lệnh playbook.

ansible-playbook apache.yml --ask-sudo-pass 

Đầu ra sẽ như thế này. Lưu ý phần changed=0 .

PLAY [apache] *****************************************************************  GATHERING FACTS *************************************************************** ok: [111.111.111.111]  TASK: [install apache2] ******************************************************* ok: [111.111.111.111]  PLAY RECAP ******************************************************************** 111.111.111.111            : ok=2    changed=0    unreachable=0    failed=0 

Điều này cho bạn biết rằng gói apache2 đã được cài đặt, vì vậy không có gì thay đổi. Khi xử lý các playbook phức tạp trên nhiều server , việc có thể xác định các server khác nhau trở nên rất hữu ích. Ví dụ: nếu bạn nhận thấy một server lưu trữ luôn cần cập nhật một cấu hình cụ thể, thì có khả năng một user hoặc quy trình trên server đó đang thay đổi nó. Nếu không có sự kiên định, điều này có thể không bao giờ được chú ý.

Bước 4 - Cấu hình module Apache

Bây giờ Apache đã được cài đặt, ta cần kích hoạt một module để Apache sử dụng.

Hãy để ta đảm bảo module mod_rewrite được bật cho Apache. Thông qua SSH, điều này có thể được thực hiện dễ dàng bằng cách sử dụng a2enmod và khởi động lại Apache. Tuy nhiên, ta cũng có thể làm điều đó rất dễ dàng với Ansible bằng cách sử dụng module apache2_module và một trình xử lý tác vụ để khởi động lại apache2 .

Mô-đun apache2_module có hai tùy chọn:

  • name - Tên của module để kích hoạt, chẳng hạn như rewrite .
  • trạng thái - Có present hoặc absent , tùy thuộc vào việc module cần được bật hoặc tắt.

Mở apache.yml để chỉnh sửa.

nano apache.yml 

Cập nhật file để bao gồm tác vụ này. Tệp bây giờ sẽ trông như thế này:

--- - hosts: apache   sudo: yes   tasks:     - name: install apache2       apt: name=apache2 update_cache=yes state=latest      - name: enabled mod_rewrite       apache2_module: name=rewrite state=present 

Tuy nhiên, ta cần khởi động lại apache2 sau khi module được kích hoạt. Một tùy chọn là thêm một tác vụ để khởi động lại apache2 , nhưng ta không muốn nó chạy mỗi khi ta áp dụng playbook của bạn . Để giải quyết vấn đề này, ta cần sử dụng một trình xử lý tác vụ . Cách thức hoạt động của các trình xử lý là một tác vụ có thể được yêu cầu thông báo cho một trình xử lý khi nó đã thay đổi và trình xử lý chỉ chạy khi tác vụ đã được thay đổi.

Để thực hiện việc này, ta cần thêm tùy chọn notify vào tác vụ apache2_module và sau đó ta có thể sử dụng module dịch vụ để khởi động lại apache2 trong một trình xử lý.

Điều đó dẫn đến một playbook trông giống như sau:

--- - hosts: apache   sudo: yes   tasks:     - name: install apache2       apt: name=apache2 update_cache=yes state=latest      - name: enabled mod_rewrite       apache2_module: name=rewrite state=present       notify:         - restart apache2    handlers:     - name: restart apache2       service: name=apache2 state=restarted 

Bây giờ, chạy lại playbook.

ansible-playbook apache.yml --ask-sudo-pass 

Đầu ra sẽ giống như sau:

PLAY [apache] *****************************************************************  GATHERING FACTS *************************************************************** ok: [111.111.111.111]  TASK: [install apache2] ******************************************************* ok: [111.111.111.111]  TASK: [enabled mod_rewrite] *************************************************** changed: [111.111.111.111]  NOTIFIED: [restart apache2] *************************************************** changed: [111.111.111.111]  PLAY RECAP ******************************************************************** 111.111.111.111            : ok=4    changed=2    unreachable=0    failed=0 

Nó có vẻ tốt cho đến nay. Bây giờ, hãy chạy lại lệnh và không có thay đổi nào và tác vụ khởi động lại sẽ không được liệt kê.

Bước 5 - Cấu hình các tùy chọn Apache

Bây giờ ta có một bản cài đặt Apache đang hoạt động, với các module yêu cầu của ta đã được bật, ta cần cấu hình Apache.

Theo mặc định, Apache lắng nghe trên cổng 80 cho tất cả truy cập HTTP . Vì lợi ích của hướng dẫn, ta hãy giả sử rằng ta muốn Apache lắng nghe trên cổng 8081. Với cấu hình Apache mặc định trên Ubuntu 14.04 x64, có hai file cần được cập nhật:

/etc/apache2/ports.conf     Listen 80  /etc/apache2/sites-available/000-default.conf     <VirtualHost *:80> 

Để làm điều này, ta có thể sử dụng module lineinfile . Mô-đun này cực kỳ mạnh mẽ và thông qua việc sử dụng nhiều tùy chọn cấu hình khác nhau, nó cho phép bạn thực hiện tất cả các loại thay đổi đối với file hiện có trên server . Đối với ví dụ này, ta sẽ sử dụng các tùy chọn sau:

  • dest - Tệp được cập nhật như một phần của lệnh.
  • regexp - Biểu thức chính quy được sử dụng để trùng với một dòng hiện có sẽ được thay thế.
  • line - Dòng sẽ được chèn vào file , thay thế dòng regexp hoặc là dòng mới ở cuối.
  • trạng thái - Có present hoặc absent .

Lưu ý : Mô-đun lineinfile sẽ nối thêm dòng ở cuối file nếu nó không trùng với dòng hiện có với regexp . Các tùy chọn insertbeforeinsertafter có thể chỉ định các dòng để thêm nó vào trước hoặc sau thay vì vào cuối, nếu cần.

Những gì ta cần làm để cập nhật cổng từ 80 lên 8081 là tìm kiếm các dòng hiện có xác định cổng 80 và thay đổi chúng để xác định cổng 8081 .

Mở file apache.yml để chỉnh sửa.

nano apache.yml 

Sửa đổi các dòng bổ sung để file trông giống như sau:

--- - hosts: apache   sudo: yes   tasks:     - name: install apache2       apt: name=apache2 update_cache=yes state=latest      - name: enabled mod_rewrite       apache2_module: name=rewrite state=present       notify:         - restart apache2      - name: apache2 listen on port 8081       lineinfile: dest=/etc/apache2/ports.conf regexp="^Listen 80" line="Listen 8081" state=present       notify:         - restart apache2      - name: apache2 virtualhost on port 8081       lineinfile: dest=/etc/apache2/sites-available/000-default.conf regexp="^<VirtualHost \*:80>" line="<VirtualHost *:8081>" state=present       notify:         - restart apache2    handlers:     - name: restart apache2       service: name=apache2 state=restarted 

Điều quan trọng cần lưu ý là ta cũng cần khởi động lại apache2 như một phần của quá trình này và ta có thể sử dụng lại cùng một trình xử lý nhưng hanlder sẽ chỉ được kích hoạt một lần mặc dù đã thay đổi nhiều tác vụ.

Bây giờ chạy playbook.

ansible-playbook apache.yml --ask-sudo-pass 

Sau khi Ansible kết thúc, bạn có thể truy cập server của bạn trong trình duyệt và nó sẽ phản hồi trên cổng 8081 , thay vì cổng 80 . Trong hầu hết các trình duyệt web, điều này có thể dễ dàng đạt được bằng cách thêm :port vào cuối URL: http://111.111.111.111: 8081 / .

Mô-đun lineinfile rất mạnh mẽ và làm cho việc xử lý các cấu hình hiện có thực sự dễ dàng. Điểm duy nhất là bạn cần biết điều gì sẽ xảy ra trong các file bạn đang thay đổi với nó, nhưng nó hỗ trợ nhiều tùy chọn hỗ trợ hầu hết các trường hợp sử dụng đơn giản.

Bước 6 - Cấu hình server ảo

Ansible có một số module cung cấp khả năng sao chép file mẫu local (sang Ansible) vào server . Hai module được sử dụng phổ biến nhất cho mục đích này là module sao chép và module mẫu . Mô-đun copy một file như hiện tại và không thực hiện thay đổi nào đối với file đó, trong khi module template mạnh mẽ hơn sao chép trên một mẫu và áp dụng thay thế biến cho các vùng bạn chỉ định bằng cách sử dụng dấu ngoặc nhọn kép (tức là {{ variable }} ).

Trong phần này, ta sẽ sử dụng module mẫu để cấu hình một server ảo mới trên server của bạn. Sẽ có rất nhiều thay đổi, vì vậy ta sẽ giải thích từng phần một và bao gồm toàn bộ file apache.yml được cập nhật ở cuối bước này.

Tạo cấu hình server ảo

Bước đầu tiên là tạo một cấu hình server ảo mới. Ta sẽ tạo file cấu hình server ảo trên Server chính và tải nó lên Server phụ bằng Ansible.

Đây là một ví dụ về cấu hình server ảo cơ bản mà ta có thể sử dụng làm điểm bắt đầu cho cấu hình của riêng mình. Lưu ý cả số cổng và domain , được đánh dấu bên dưới, đều được mã hóa cứng vào cấu hình.

<VirtualHost *:8081>     ServerAdmin webmaster@example.com     ServerName example.com     ServerAlias www.example.com     DocumentRoot /var/www/example.com     ErrorLog ${APACHE_LOG_DIR}/error.log     CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> 

Tạo một file mới có tên virtualhost.conf .

nano virtualhost.conf 

Dán phần sau vào virtualhost.conf . Bởi vì ta đang sử dụng các mẫu, nên thay đổi các giá trị được mã hóa cứng ở trên thành các biến để dễ dàng thay đổi trong tương lai.

<VirtualHost *:{{ http_port }}>     ServerAdmin webmaster@{{ domain }}     ServerName {{ domain }}     ServerAlias www.{{ domain }}     DocumentRoot /var/www/{{ domain }}     ErrorLog ${APACHE_LOG_DIR}/error.log     CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> 

Sử dụng các biến mẫu

Tiếp theo, ta cần cập nhật playbook của bạn để đẩy ra mẫu và sử dụng các biến.

Bước đầu tiên là thêm một phần vào playbook cho các biến. Nó được gọi là vars và ở cùng cấp độ với hosts , sudo , taskshandlers . Ta cần đặt cả hai biến được sử dụng trong mẫu ở trên và ta sẽ thay đổi cổng trở lại 80 trong quá trình này.

--- - hosts: apache   sudo: yes   vars:     http_port: 80     domain: example.com   tasks:     - name: install apache2 ... 

Các biến được dùng trong các việc và mẫu, vì vậy ta có thể cập nhật module lineinfile hiện có của lineinfile để sử dụng http_port được chỉ định, thay vì 8081 được mã hóa cứng mà ta đã chỉ định trước đó. Biến cần được thêm vào dòng và tùy chọn regexp cần được cập nhật để nó không tìm kiếm một cổng cụ thể. Các thay đổi sẽ giống như sau:

lineinfile: dest=/etc/apache2/ports.conf regexp="^Listen " line="Listen {{ http_port }}" state=present 
lineinfile: dest=/etc/apache2/sites-available/000-default.conf regexp="^<VirtualHost \*:" line="<VirtualHost *:{{ http_port }}>" 

Thêm module mẫu

Bước tiếp theo là thêm vào module mẫu để đẩy file cấu hình lên server . Ta sẽ sử dụng các tùy chọn này để làm cho điều đó xảy ra:

  • đích - Đường dẫn file đích để lưu mẫu đã cập nhật trên (các) server lưu trữ, tức là /etc/apache2/sites-available/{{ domain }}.conf .
  • src - Tệp mẫu nguồn, tức là virtualhost.conf .

Áp dụng những điều này vào sổ chơi của bạn sẽ dẫn đến một nhiệm vụ giống như sau:

- name: create virtual host file   template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ domain }}.conf 

Bật server ảo

Sắp xong! Những gì ta cần làm bây giờ là kích hoạt server ảo trong Apache. Điều này có thể được thực hiện theo hai cách: bằng cách chạy sudo a2ensite example.com hoặc liên kết thủ công file cấu hình vào /etc/apache2/sites-enabled/ . Tùy chọn trước đây an toàn hơn vì nó cho phép Apache kiểm soát quá trình. Đối với điều này, module command được sử dụng trở lại.

Cách sử dụng khá đơn giản, như ta đã khám phá ở trên:

- name: a2ensite {{ domain }}   command: a2ensite {{ domain }}   notify:   - restart apache2 

Ngăn chặn việc làm thêm

Cuối cùng, module command cần biết khi nào nó nên và không nên chạy, do đó, module không được chạy một cách không cần thiết nếu playbook được chạy nhiều lần. Trong trường hợp của ta , nó chỉ cần được chạy nếu file .conf chưa được tạo trên server .

Điều này được thực hiện bằng cách sử dụng tùy chọn creates , cho phép bạn cho module biết file nào đang được tạo trong quá trình thực thi module . Nếu file tồn tại, module sẽ không chạy. Bởi vì Apache tạo một softlink khi các trang web được kích hoạt, việc kiểm tra điều đó sẽ giải quyết được vấn đề.

Các thay đổi sẽ giống như sau:

- name: a2ensite {{ domain }}   command: a2ensite {{ domain }}   args:     creates: /etc/apache2/sites-enabled/{{ domain }}.conf   notify:   - restart apache2 

Điều quan trọng cần lưu ý là sử dụng phần args trong nhiệm vụ. Đây là một cách tùy chọn để liệt kê các tùy chọn module và trong trường hợp này, loại bỏ bất kỳ sự nhầm lẫn nào giữa tùy chọn module và chính lệnh là gì.

Playbook apache.yml cuối cùng

Bây giờ hãy áp dụng những thay đổi này. Mở apache.yml .

nano apache.yml 

Với tất cả các thay đổi ở trên, hãy thay đổi playbook apache.yml của bạn thành như thế này.

--- - hosts: apache   sudo: yes   vars:     http_port: 80     domain: example.com   tasks:     - name: install apache2       apt: name=apache2 update_cache=yes state=latest      - name: enabled mod_rewrite       apache2_module: name=rewrite state=present       notify:         - restart apache2      - name: apache2 listen on port {{ http_port }}       lineinfile: dest=/etc/apache2/ports.conf regexp="^Listen " line="Listen {{ http_port }}" state=present       notify:         - restart apache2      - name: apache2 virtualhost on port {{ http_port }}       lineinfile: dest=/etc/apache2/sites-available/000-default.conf regexp="^<VirtualHost \*:" line="<VirtualHost *:{{ http_port }}>"       notify:         - restart apache2      - name: create virtual host file       template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ domain }}.conf      - name: a2ensite {{ domain }}       command: a2ensite {{ domain }}       args:         creates: /etc/apache2/sites-enabled/{{ domain }}.conf       notify:         - restart apache2    handlers:     - name: restart apache2       service: name=apache2 state=restarted 

Lưu file , sau đó chạy playbook.

ansible-playbook apache.yml --ask-sudo-pass 

Nếu bây giờ bạn truy cập tên server hoặc địa chỉ IP của Server phụ trong trình duyệt của bạn , bạn sẽ thấy nó phản hồi lại trên cổng 80 , không phải cổng 8081 . Tiếp theo, hãy truy cập domain (tức là example.com ) mà ta đã chỉ định cho server ảo mới. Bởi vì ta chưa thêm các file nào vào, nó sẽ hiển thị trang lỗi Apache 404 thay vì trang chào mừng Apache. Nếu vậy, server ảo của bạn đang hoạt động bình thường và bạn vẫn chưa SSH vào Server thứ cấp của bạn để chạy một lệnh duy nhất.

Bước 7 - Sử dụng repository Git cho trang web

Trong phần này, ta sẽ sử dụng Ansible để sao chép repository Git nhằm cài đặt nội dung trang web .

Mọi trang web đều cần nội dung và mặc dù việc SSH trong và sao chép thủ công repository Git để cài đặt một trang web mới là điều bình thường, Ansible cung cấp cho ta các công cụ cần thiết để ta thực hiện tự động. Đối với ví dụ này, module git sẽ thực hiện những gì được yêu cầu.

Mô-đun git có rất nhiều tùy chọn, với những tùy chọn liên quan cho hướng dẫn này là:

  • đích - Đường dẫn trên server lưu trữ nơi lưu trữ sẽ được kiểm tra.
  • repo - Url kho sẽ được nhân bản. Điều này phải được truy cập bởi server .
  • cập nhật - Khi được đặt thành no , điều này ngăn Ansible cập nhật repository khi nó đã tồn tại.
  • accept_hostkey - Yêu cầu SSH chấp nhận bất kỳ khóa server không xác định nào khi kết nối qua SSH. Điều này rất hữu ích vì nó giúp tiết kiệm nhu cầu đăng nhập qua SSH để chấp nhận lần đăng nhập đầu tiên, nhưng nó loại bỏ khả năng kiểm tra thủ công chữ ký server . Tùy thuộc vào repository của bạn, bạn có thể cần tùy chọn này.

Theo mục đích của hướng dẫn, có một repository Git đơn giản với một trang index.html duy nhất có thể được sao chép vào server của bạn. Nếu bạn đã có một repository công cộng khác có chứa tương tự, vui lòng thay thế nó. Với ý nghĩ đó, tác vụ git sẽ giống như sau:

- name: clone basic html template   git: repo=https://github.com/do-community/ansible-apache-tutorial.git dest=/var/www/example.com update=no 

Tuy nhiên, nếu bạn chạy Playbook ngay bây giờ, bạn có thể sẽ gặp lỗi. Đầu tiên ta cần cài đặt gói git để Ansible có thể sử dụng nó để sao chép repository . Tác vụ apt cần được cập nhật để cài đặt cả gói apache2 và gói git . Kiểm tra tài liệu apt cho ta biết rằng tùy chọn name chỉ chiếm một gói duy nhất, vì vậy điều đó sẽ không hữu ích. Thay vào đó, ta cần sử dụng một danh sách các mục .

Ansible cung cấp khả năng chỉ định danh sách các mục để lặp lại và áp dụng nhiệm vụ cho từng mục. Chúng được chỉ định bằng cách sử dụng tùy chọn with_items như một phần của tác vụ và tác vụ apt của ta sẽ được cập nhật để trông giống như sau:

- name: install packages   apt: name={{ item }} update_cache=yes state=latest   with_items:     - apache2     - git 

Danh sách các mục sử dụng biến item và sẽ thực hiện nhiệm vụ cho từng mục trong danh sách.

Mở lại apache.yml .

nano apache.yml 

Cập nhật playbook để trùng với những điều sau:

--- - hosts: apache   sudo: yes    vars:     http_port: 80     domain: example.com    tasks:      - name: install packages       apt: name={{ item }} update_cache=yes state=latest       with_items:         - apache2         - git      - name: enabled mod_rewrite       apache2_module: name=rewrite state=present       notify:         - restart apache2      - name: apache2 listen on port {{ http_port }}       lineinfile: dest=/etc/apache2/ports.conf regexp="^Listen " line="Listen {{ http_port }}" state=present       notify:         - restart apache2      - name: apache2 virtualhost on port {{ http_port }}       lineinfile: dest=/etc/apache2/sites-available/000-default.conf regexp="^<VirtualHost \*:" line="<VirtualHost *:{{ http_port }}>"       notify:         - restart apache2      - name: create virtual host file       template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ domain }}.conf      - name: a2ensite {{ domain }}       command: a2ensite {{ domain }}       args:         creates: /etc/apache2/sites-enabled/{{ domain }}.conf       notify:         - restart apache2      - name: clone basic html template       git: repo=https://github.com/do-community/ansible-apache-tutorial.git dest=/var/www/example.com update=no    handlers:     - name: restart apache2       service: name=apache2 state=restarted 

Lưu file và chạy playbook.

ansible-playbook apache.yml --ask-sudo-pass 

Nó sẽ cài đặt git và sao chép thành công repository . Đến đây bạn sẽ thấy một cái gì đó khác với lỗi 404 khi bạn truy cập server ảo từ Bước 6. Đừng quên kiểm tra server không ảo vẫn trả về trang mặc định.

Tóm lại, bây giờ bạn đã cài đặt Git và một trang HTML cơ bản đã được sao chép qua Git vào server ảo mới của bạn. Vẫn không có lệnh SSH thủ công nào được yêu cầu. Nếu bạn chỉ theo đuổi một trang web HTML cơ bản và nó nằm trong repository lưu trữ Git công khai, thì bạn đã hoàn tất!

Kết luận

Ta vừa tạo Ansible Playbook để tự động hóa toàn bộ quá trình cấu hình server của bạn để chạy Server Web Apache, với server ảo và repository Git. Tất cả những điều đó đã đạt được mà không cần đăng nhập trực tiếp vào server và phần tốt nhất là bạn có thể chạy Playbook mới của bạn trên hầu hết các server Ubuntu để đạt được kết quả tương tự.

Lưu ý : nếu server của bạn đã được cài đặt và sửa đổi Apache, rất có thể bạn cần phải xử lý từng sửa đổi để đưa máy về trạng thái yêu cầu. Về mặt tích cực, Ansible sẽ chỉ sửa những sửa đổi này nếu chúng tồn tại, vì vậy, thật an toàn khi có chúng trong Playbook chính!

Ansible cực kỳ mạnh mẽ và cũng có một đường cong học tập rất dễ dàng. Bạn có thể bắt đầu sử dụng các khái niệm cơ bản được đề cập trong hướng dẫn này và duy trì ở cấp độ này hoặc tìm hiểu thêm nhiều điều để đi đến những phần thực sự phức tạp. Dù bằng cách nào, bạn có thể cấu hình và quản lý (các) server của bạn mà không cần phải đăng nhập thủ công cho hầu hết, nếu không phải tất cả, các việc .

Bạn có thể duyệt qua Danh sách module Ansible để xem Ansible có khả năng gì khác.


Tags:

Các tin liên quan

Apache vs Nginx: Cân nhắc thực tế
2015-01-28
Cách cài đặt một Apache, MySQL và PHP (FAMP) trên FreeBSD 10.1
2015-01-14
Cách cài đặt WordPress với Apache trên FreeBSD 10.1
2015-01-14
Cách triển khai ứng dụng Rails với Passenger và Apache trên Ubuntu 14.04
2014-11-21
Cách sử dụng JRuby để chạy ứng dụng Rails trên Apache Tomcat 7 và Ubuntu 14.04
2014-11-14
Cách cấu hình quyền truy cập WebDAV với Apache trên Ubuntu 14.04
2014-09-22
Cách cài đặt và bảo mật phpMyAdmin với Apache trên server CentOS 7
2014-08-07
Cách sử dụng Apache JMeter để thực hiện kiểm tra tải trên web server
2014-06-24
Cách cấu hình OCSP Stapling trên Apache và Nginx
2014-06-12
Cách tạo chứng chỉ SSL trên Apache cho Ubuntu 14.04
2014-04-23