如何在 Ubuntu 20.04(Nginx)上使用 Ansible 部署静态 HTML 网站

如果你正在跟随这个系列的所有部分,在这个时候,你应该熟悉安装系统包,应用模板,并在Ansible播放书中使用处理器。

首先,在您的 Ansible 控制节点上创建一个新目录,在那里您将设置 Ansible 文件和一个演示静态 HTML 网站,将其部署到您的远程服务器上。

1mkdir ~/ansible-nginx-demo
2cd ~/ansible-nginx-demo

接下来,将现有库存文件复制到新目录中. 在本示例中,我们将使用您在本系列开始时设置的相同库存:

1cp ~/ansible-practice/inventory .

这将从您的主目录中的名为ansible-practice的文件夹中复制名为库存的文件,并将其保存到当前目录中。

获取演示网站

对于这个演示,我们将使用一个静态的HTML网站,这是我们的主题(https://www.digitalocean.com/community/tutorial_series/how-to-build-a-website-with-html)系列。 通过下面的命令下载演示网站文件开始:

1curl -L https://github.com/do-community/html_demo_site/archive/refs/heads/main.zip -o html_demo.zip

你需要unzip来解包这个下载的内容. 要确保你有这个工具安装,运行:

1sudo apt install unzip

然后,卸载 demo 网站文件:

1unzip html_demo.zip

这将在当前工作目录中创建一个名为html_demo_site-main的新目录,您可以用ls -la命令检查目录的内容:

1ls -la html_demo_site-main
1[secondary_label Output]
2total 28
3drwxrwxr-x 3 sammy sammy 4096 sep 18 2020 .
4drwxrwxr-x 5 sammy sammy 4096 mrt 25 15:03 ..
5-rw-rw-r-- 1 sammy sammy 1289 sep 18 2020 about.html
6drwxrwxr-x 2 sammy sammy 4096 sep 18 2020 images
7-rw-rw-r-- 1 sammy sammy 2455 sep 18 2020 index.html
8-rw-rw-r-- 1 sammy sammy 1079 sep 18 2020 LICENSE
9-rw-rw-r-- 1 sammy sammy 675 sep 18 2020 README.md

为 Nginx 配置创建模板

您现在将设置需要配置远程 Web 服务器的 Nginx 模板,在您的ansible-demo目录中创建一个新的文件夹,以保持非播放书文件:

1mkdir files

然后打开一个名为「nginx.conf.j2」的新文件:

1nano files/nginx.conf.j2

此模板文件包含一个 Nginx 服务器块配置,用于静态 HTML 网站. 它使用三个变量: document_root, app_rootserver_name. 在创建播放簿时,我们将稍后定义这些变量。

 1[label ~/ansible-nginx-demo/files/nginx.conf.j2]
 2server {
 3  listen 80;
 4
 5  root {{ document_root }}/{{ app_root }};
 6  index index.html index.htm;
 7
 8  server_name {{ server_name }};
 9
10  location / {
11   default_type "text/html";
12   try_files $uri.html $uri $uri/ =404;
13  }
14}

保存并关闭文件,当你完成。

创建一个新的 Ansible Playbook

接下来,我们将创建一个新的Ansible播放簿,并设置我们在本指南的上一节中使用的变量:打开名为playbook.yml的新文件:

1nano playbook.yml

本剧本以 " 主持人 " 定义设定为全体 ' ,并用 " 来 " 指示说明 默认情况下可以以 **root** 用户( 和手动运行的) 运行所有任务 。 在本剧本'var'部分,我们将创造出三个变量:'server_name','document_root'和'app-root'. 这些变量被用在Nginx配置模板中来设置这个网络服务器将响应的域名或IP地址,以及网站文件位于服务器的完整路径. 对于这个演示,我们将使用 anbile_default_ ipv4. address` 事实变量,因为它包含远程服务器的公开IP地址,但您可以用您的服务器主机名来替换这个值, 以防它有一个DNS服务内恰当配置的域名来指向这个服务器 :

1[label ~/ansible-nginx-demo/playbook.yml]
2---
3- hosts: all
4  become: yes
5  vars:
6    server_name: "{{ ansible_default_ipv4.address }}"
7    document_root: /var/www/html
8    app_root: html_demo_site-main
9  tasks:

接下来的部分将引导你通过所有任务,你需要包括在这个演讲本,使它完全功能。

安装所需的包

以下任务将更新apt缓存,然后在远程节点上安装nginx包:

1[label ~/ansible-nginx-demo/playbook.yml]
2. . .
3    - name: Update apt cache and install Nginx
4      apt:
5        name: nginx
6        state: latest
7        update_cache: yes

将网站文件上传到远程节点

下一个任务将使用内置的复制模块将网站文件上传到远程文档根中,我们将使用document_root变量来设置应用程序文件夹应该创建的服务器上的目的地。

1[label ~/ansible-nginx-demo/playbook.yml]
2. . .
3    - name: Copy website files to the server's document root
4      copy:
5        src: "{{ app_root }}"
6        dest: "{{ document_root }}"
7        mode: preserve

应用并启用自定义 Nginx 配置

现在我们将应用 Nginx 模板,该模板将配置 Web 服务器来托管您的静态 HTML 文件. 配置文件设置为 /etc/nginx/sites-available后,我们将在 /etc/nginx-sites-enabled 中创建一个符号链接到该文件,并通知 Nginx 服务进行后续重新启动。

 1[label ~/ansible-nginx-demo/playbook.yml]
 2. . .
 3    - name: Apply Nginx template
 4      template:
 5        src: files/nginx.conf.j2
 6        dest: /etc/nginx/sites-available/default
 7      notify: Restart Nginx
 8
 9    - name: Enable new site
10      file:
11        src: /etc/nginx/sites-available/default
12        dest: /etc/nginx/sites-enabled/default
13        state: link
14      notify: Restart Nginx

在 UFW 上允许端口 80

接下来,包括在端口 80 上允许 tcp 访问的任务:

1[label ~/ansible-nginx-demo/playbook.yml]
2. . .
3    - name: Allow all access to tcp port 80
4      ufw:
5        rule: allow
6        port: '80'
7        proto: tcp
8. . .

为 Nginx 服务创建处理器

要完成这本书,唯一剩下的就是设置重新启动 Nginx处理器:

1[label ~/ansible-nginx-demo/playbook.yml]
2. . .
3  handlers:
4    - name: Restart Nginx
5      service:
6        name: nginx
7        state: restarted

运行已完成的剧本

一旦你完成了在播放簿文件中包含所有所需的任务,它将看起来像这样:

 1[label ~/ansible-nginx-demo/playbook.yml]
 2---
 3- hosts: all
 4  become: yes
 5  vars:
 6    server_name: "{{ ansible_default_ipv4.address }}"
 7    document_root: /var/www
 8    app_root: html_demo_site-main
 9  tasks:
10    - name: Update apt cache and install Nginx
11      apt:
12        name: nginx
13        state: latest
14        update_cache: yes
15
16    - name: Copy website files to the server's document root
17      copy:
18        src: "{{ app_root }}"
19        dest: "{{ document_root }}"
20        mode: preserve
21
22    - name: Apply Nginx template
23      template:
24        src: files/nginx.conf.j2
25        dest: /etc/nginx/sites-available/default
26      notify: Restart Nginx
27
28    - name: Enable new site
29      file:
30        src: /etc/nginx/sites-available/default
31        dest: /etc/nginx/sites-enabled/default
32        state: link
33      notify: Restart Nginx
34
35    - name: Allow all access to tcp port 80
36      ufw:
37        rule: allow
38        port: '80'
39        proto: tcp
40
41  handlers:
42    - name: Restart Nginx
43      service:
44        name: nginx
45        state: restarted

要在您在库存文件中设置的服务器(服务器)上运行此播放簿,请运行ansible-playbook使用您在本系列的介绍中运行连接测试时使用的相同的连接参数。

1ansible-playbook -i inventory playbook.yml -u sammy -K

你会看到这样的输出:

 1[secondary_label Output]
 2BECOME password: 
 3
 4PLAY [all] **********************************************************************************************
 5
 6TASK [Gathering Facts] **********************************************************************************
 7ok: [203.0.113.10]
 8
 9TASK [Update apt cache and install Nginx] ***************************************************************
10ok: [203.0.113.10]
11
12TASK [Copy website files to the server's document root] *************************************************
13changed: [203.0.113.10]
14
15TASK [Apply Nginx template] *****************************************************************************
16changed: [203.0.113.10]
17
18TASK [Enable new site] **********************************************************************************
19ok: [203.0.113.10]
20
21TASK [Allow all access to tcp port 80] ******************************************************************
22ok: [203.0.113.10]
23
24RUNNING HANDLER [Restart Nginx] *************************************************************************
25changed: [203.0.113.10]
26
27PLAY RECAP **********************************************************************************************
28203.0.113.10                : ok=7 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

一旦播放簿完成,如果您进入您的浏览器并访问您的服务器的主机名称或IP地址,您现在应该看到以下页面:

HTML Demo Site Deployed by Ansible

恭喜,您已成功自动部署静态HTML网站到远程 Nginx服务器,使用Ansible。

如果您对演示网站中的任何文件进行更改,您可以重新运行播放簿,而复制任务将确保任何文件更改都反映在远程主机中。

Published At
Categories with 技术
comments powered by Disqus