如何在Ubuntu20.04(Nginx)上使用Ansible部署静态HTML网站

来自菜鸟教程
跳转至:导航、​搜索

如果您正在阅读本系列的所有部分,那么此时您应该熟悉安装系统包、应用模板以及在 Ansible playbook 中使用处理程序。 在本系列的这一部分中,您将使用到目前为止所见的内容来创建一个剧本,该剧本自动设置远程 Nginx 服务器以在 Ubuntu 20.04 上托管静态 HTML 网站。

首先在 Ansible 控制节点上创建一个新目录,您将在其中设置 Ansible 文件和要部署到远程服务器的演示静态 HTML 网站。 这可以在您的主文件夹中您选择的任何位置。 在本例中,我们将使用 ~/ansible-nginx-demo

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

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

cp ~/ansible-practice/inventory .

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

获取演示网站

对于这个演示,我们将使用一个静态 HTML 网站,它是我们的 如何在 HTML 系列中编码的主题。 首先通过运行以下命令下载演示网站文件:

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

你需要 unzip 来解压这个下载的内容。 为确保您已安装此工具,请运行:

sudo apt install unzip

然后,解压缩演示网站文件:

unzip html_demo.zip

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

ls -la html_demo_site-main
Outputtotal 28
drwxrwxr-x 3 sammy sammy 4096 sep 18  2020 .
drwxrwxr-x 5 sammy sammy 4096 mrt 25 15:03 ..
-rw-rw-r-- 1 sammy sammy 1289 sep 18  2020 about.html
drwxrwxr-x 2 sammy sammy 4096 sep 18  2020 images
-rw-rw-r-- 1 sammy sammy 2455 sep 18  2020 index.html
-rw-rw-r-- 1 sammy sammy 1079 sep 18  2020 LICENSE
-rw-rw-r-- 1 sammy sammy  675 sep 18  2020 README.md

为 Nginx 的配置创建模板

您现在将设置配置远程 Web 服务器所需的 Nginx 模板。 在 ansible-demo 目录中创建一个新文件夹来保存非剧本文件:

mkdir files

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

nano files/nginx.conf.j2

此模板文件包含静态 HTML 网站的 Nginx 服务器块配置。 它使用三个变量:document_rootapp_rootserver_name。 我们稍后会在创建剧本时定义这些变量。 将以下内容复制到您的模板文件中:

~/ansible-nginx-demo/files/nginx.conf.j2

server {
  listen 80;

  root {{ document_root }}/{{ app_root }};
  index index.html index.htm;

  server_name {{ server_name }};
  
  location / {
   default_type "text/html";
   try_files $uri.html $uri $uri/ =404;
  }
}

完成后保存并关闭文件。

创建一个新的 Ansible 剧本

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

nano playbook.yml

该剧本以 hosts 定义设置为 allbecome 指令开始,该指令告诉 Ansible 默认以 root 用户身份运行所有任务(与使用 sudo 手动运行命令相同)。 在本剧本的 var 部分中,我们将创建三个变量:server_namedocument_rootapp_root。 这些变量在 Nginx 配置模板中用于设置此 Web 服务器将响应的域名或 IP 地址,以及网站文件在服务器上所在位置的完整路径。 对于这个演示,我们将使用 ansible_default_ipv4.address 事实变量,因为它包含远程服务器的公共 IP 地址,但是如果它在 DNS 服务中正确配置了域名,您可以用您的服务器的主机名替换这个值指向此服务器:

~/ansible-nginx-demo/playbook.yml

---
- hosts: all
  become: yes
  vars:
    server_name: "{{ ansible_default_ipv4.address }}"
    document_root: /var/www/html
    app_root: html_demo_site-main
  tasks:

您可以暂时保持此文件打开。 接下来的部分将引导您完成所有需要包含在本手册中以使其完全正常运行的任务。

安装所需的软件包

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

~/ansible-nginx-demo/playbook.yml

. . .
    - name: Update apt cache and install Nginx
      apt:
        name: nginx
        state: latest
        update_cache: yes

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

下一个任务将使用 copy 内置模块将网站文件上传到远程文档根目录。 我们将使用 document_root 变量在服务器上设置应创建应用程序文件夹的目标。

~/ansible-nginx-demo/playbook.yml

. . .
    - name: Copy website files to the server's document root
      copy:
        src: "{{ app_root }}"
        dest: "{{ document_root }}"
        mode: preserve

应用和启用自定义 Nginx 配置

我们现在将应用 Nginx 模板,该模板将配置 Web 服务器以托管您的静态 HTML 文件。 将配置文件设置为 /etc/nginx/sites-available 后,我们将在 /etc/nginx-sites-enabled 中创建指向该文件的符号链接,并通知 Nginx 服务以进行后续重启。 整个过程将需要两个单独的任务:

~/ansible-nginx-demo/playbook.yml

. . .
    - name: Apply Nginx template
      template:
        src: files/nginx.conf.j2
        dest: /etc/nginx/sites-available/default
      notify: Restart Nginx

    - name: Enable new site
      file:
        src: /etc/nginx/sites-available/default
        dest: /etc/nginx/sites-enabled/default
        state: link
      notify: Restart Nginx

在 UFW 上允许端口 80

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

~/ansible-nginx-demo/playbook.yml

. . .
    - name: Allow all access to tcp port 80
      ufw:
        rule: allow
        port: '80'
        proto: tcp
. . .

为 Nginx 服务创建处理程序

要完成这个剧本,剩下要做的就是设置 Restart Nginx 处理程序:

~/ansible-nginx-demo/playbook.yml

. . .
  handlers:
    - name: Restart Nginx
      service:
        name: nginx
        state: restarted  

运行完成的剧本

在您的剧本文件中包含所有必需的任务后,它将如下所示:

~/ansible-nginx-demo/playbook.yml

---
- hosts: all
  become: yes
  vars:
    server_name: "{{ ansible_default_ipv4.address }}"
    document_root: /var/www
    app_root: html_demo_site-main
  tasks:
    - name: Update apt cache and install Nginx
      apt:
        name: nginx
        state: latest
        update_cache: yes

    - name: Copy website files to the server's document root
      copy:
        src: "{{ app_root }}"
        dest: "{{ document_root }}"
        mode: preserve

    - name: Apply Nginx template
      template:
        src: files/nginx.conf.j2
        dest: /etc/nginx/sites-available/default
      notify: Restart Nginx

    - name: Enable new site
      file:
        src: /etc/nginx/sites-available/default
        dest: /etc/nginx/sites-enabled/default
        state: link
      notify: Restart Nginx

    - name: Allow all access to tcp port 80
      ufw:
        rule: allow
        port: '80'
        proto: tcp

  handlers:
    - name: Restart Nginx
      service:
        name: nginx
        state: restarted

要在您在清单文件中设置的服务器上执行此 playbook,请使用您在本系列介绍中运行连接测试时使用的相同连接参数运行 ansible-playbook。 在这里,我们将使用名为 inventory 的清单文件和 sammy 用户连接到远程服务器。 因为 playbook 需要 sudo 才能运行,所以我们还包括 -K 参数,以在 Ansible 提示时提供远程用户的 sudo 密码:

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

你会看到这样的输出:

OutputBECOME password: 

PLAY [all] **********************************************************************************************

TASK [Gathering Facts] **********************************************************************************
ok: [203.0.113.10]

TASK [Update apt cache and install Nginx] ***************************************************************
ok: [203.0.113.10]

TASK [Copy website files to the server's document root] *************************************************
changed: [203.0.113.10]

TASK [Apply Nginx template] *****************************************************************************
changed: [203.0.113.10]

TASK [Enable new site] **********************************************************************************
ok: [203.0.113.10]

TASK [Allow all access to tcp port 80] ******************************************************************
ok: [203.0.113.10]

RUNNING HANDLER [Restart Nginx] *************************************************************************
changed: [203.0.113.10]

PLAY RECAP **********************************************************************************************
203.0.113.10                : ok=7    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

剧本完成后,如果您转到浏览器并访问服务器的主机名或 IP 地址,您现在应该会看到以下页面:

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

如果您对演示网站中的任何文件进行了更改,您可以再次运行 playbook,copy 任务将确保任何文件更改都反映在远程主机中。 因为 Ansible 具有幂等行为,所以多次运行 playbook 不会触发已经对系统进行的更改。