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ặ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ó
present
hoặ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
regexp
hoặc là dòng mới ở cuối. - trạng thái - Có
present
hoặ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 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