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,absenthoặcpresent. 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ó presenthoặcabsent, 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 regexphoặc là dòng mới ở cuối.
-  trạng thái - Có presenthoặcabsent.
 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 insertbefore và insertafter 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 , tasks và handlers .  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.
Các tin liên quan
Apache vs Nginx: Cân nhắc thực tế2015-01-28
Cách cài đặt WordPress với Apache trên FreeBSD 10.1
2015-01-14
Cách cài đặt một Apache, MySQL và PHP (FAMP) 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
 

