此研讨会工具包旨在帮助技术受众熟悉配置管理概念以及如何使用 Ansible 来自动化服务器基础架构设置。
目的是为演讲者提供一套完整的资源来主持活动并就 Ansible 进行介绍性演讲。这包括:
- 幻灯片和演讲者笔记,包括用于运行可选现场演示的简短演示视频和命令。本次演讲大约持续 50 分钟。
- 一个包含演示应用程序代码和必要的 Ansible 脚本的GitHub 存储库,用于将该应用程序部署到 Ubuntu 服务器。
- 本教程将引导用户在远程服务器上部署Travellist演示 Laravel应用程序。
本教程旨在通过额外的细节和说明来补充谈话演示。它还可以作为寻求使用 Ansible 将 Laravel 应用程序部署到远程 Ubuntu 服务器的读者的参考。
介绍
由于现代应用程序环境的一次性特性,服务器自动化现在在系统管理中发挥着重要作用。Ansible等配置管理工具通常用于通过为新服务器建立标准程序来简化服务器设置自动化的过程。这有利于减少与手动设置相关的人为错误。
Ansible 提供了一个简化的架构,不需要在节点上安装特殊的软件。它还提供了一组强大的功能和内置模块,有助于编写自动化脚本。
本教程旨在配合使用 Ansible Workshop Kit 自动设置服务器的幻灯片和演讲者笔记,将向您展示如何设置清单文件并执行一组配置脚本以完全自动化设置远程 LEMP 服务器的过程(大号inux下,(ë)Nginx的,中号ariaDB和P HP-FPM)在Ubuntu 18.04和部署演示Laravel应用到这个系统。
注意:本材料旨在演示如何使用剧本通过 Ansible 自动设置服务器。尽管我们的演示包含在 LEMP 服务器上运行的 Laravel 应用程序,但我们鼓励读者修改和调整包含的设置以满足自己的需求。
先决条件
要学习本教程,您需要:
- 一个 Ansible 控制节点:一台安装了 Ansible 并配置为使用 SSH 密钥连接到 Ansible 主机的 Ubuntu 18.04 机器。确保控制节点有一个具有 sudo 权限和启用防火墙的普通用户,如我们的初始服务器设置指南中所述,以及一组有效的SSH 密钥。要设置 Ansible,请按照我们关于如何在 Ubuntu 18.04 上安装和配置 Ansible 的指南进行操作。
- 一台或多台 Ansible 主机:一台或多台远程 Ubuntu 18.04 服务器。每个主机都必须将控制节点的公钥添加到其
authorized_keys
文件中,如如何在 Ubuntu 18.04 上设置 SSH 密钥指南的步骤 2 中所述。如果您使用 DigitalOcean Droplets作为节点,您可以使用控制面板将您的公钥添加到您的 Ansible 主机。
步骤 1 — 克隆演示存储库
我们需要做的第一件事是克隆包含 Ansible 配置脚本和我们将部署到远程服务器的演示 Laravel 应用程序的存储库。所有必要的文件都可以在do-community/ansible-laravel-demo Github 存储库中找到。
以 sudo 用户身份登录 Ansible 控制节点后,克隆存储库并导航到git
命令创建的目录:
- git clone https://github.com/do-community/ansible-laravel-demo.git
- cd ansible-laravel-demo
现在,您可以运行ls
命令来检查克隆存储库的内容:
- ls -l --group-directories-first
你会看到这样的输出:
drwxrwxr-x 3 sammy sammy 4096 Mar 24 15:24 application
drwxrwxr-x 2 sammy sammy 4096 Mar 24 15:24 group_vars
drwxrwxr-x 7 sammy sammy 4096 Mar 24 15:24 roles
-rw-rw-r-- 1 sammy sammy 102 Mar 24 15:24 inventory-example
-rw-rw-r-- 1 sammy sammy 1987 Mar 24 15:24 laravel-deploy.yml
-rw-rw-r-- 1 sammy sammy 794 Mar 24 15:24 laravel-env.j2
-rw-rw-r-- 1 sammy sammy 920 Mar 24 15:24 readme.md
-rw-rw-r-- 1 sammy sammy 318 Mar 24 15:24 server-setup.yml
以下是对每个文件夹和文件及其内容的概述:
application/
:此目录包含演示 Laravel 应用程序,该应用程序将在研讨会结束时部署在远程服务器上。group_vars/
:此目录包含变量文件,其中包含应用程序设置的自定义选项,例如数据库凭据以及应用程序文件在远程服务器上的存储位置。roles/
:此目录包含处理 Ubuntu LEMP 服务器配置的不同Ansible 角色。inventory-example
:此文件可用作为基础架构创建自定义清单的基础。laravel-deploy.yml
:这个剧本会将演示 Laravel 应用程序部署到远程服务器。laravel-env.j2
: 这个模板是laravel-deploy.yml
playbook 用来设置应用环境文件的。readme.md
:此文件包含有关此存储库中包含的配置的一般信息。server-setup.yml
:此剧本将使用roles/
目录中定义的角色来配置 LEMP 服务器。
步骤 2 — 设置清单文件并测试与节点的连接
我们现在将创建一个清单文件来列出我们要使用 Ansible 管理的主机。首先,将inventory-example
文件复制到一个名为 的新文件中hosts
:
- cp inventory-example hosts
现在,使用您选择的文本编辑器打开新的清单文件并使用您自己的服务器更新它。在这里,我们将使用nano
:
- nano hosts
研讨会套件附带的示例清单包含两个 Ansible 组:dev
和production
. 这是为了演示如何使用组变量在多个环境中自定义部署。如果您希望使用单个节点测试此设置,您可以使用dev
或production
组并从清单文件中删除另一个。
[dev]
203.0.113.0.101
[prod]
203.0.113.0.102
[all:vars]
ansible_python_interpreter=/usr/bin/python3
注意:该ansible_python_interpreter
变量定义了远程主机上 Python 可执行文件的路径。在这里,我们告诉 Ansible 为这个清单文件中的所有主机设置这个变量。
完成后保存并关闭文件。如果您正在使用nano
,您可以通过点击CTRL+X
、 然后Y
和ENTER
进行确认。
调整ping
完清单文件后,您可以执行Ansible 模块来测试控制节点是否能够连接到主机:
- ansible all -i hosts -m ping -u root
让我们分解这个命令:
all
:此选项告诉 Ansible在指定清单文件中的所有主机上运行以下命令。-i hosts
:指定应该使用哪个库存。如果未提供此选项,Ansible 将尝试使用默认清单,该清单通常位于/etc/ansible/hosts
。-m ping
:这将执行ping
Ansible 模块,该模块将测试与节点的连接以及是否可以在远程系统上找到 Python 可执行文件。-u root
:此选项指定应使用哪个远程用户连接到节点。我们在此处使用root帐户作为示例,因为这通常是新服务器上唯一可用的帐户。根据您的基础架构提供商和 SSH 配置,可能需要其他连接选项。
如果正确设置了到节点的 SSH 连接,您将获得以下输出:
Output203.0.113.0.101 | SUCCESS => {
"changed": false,
"ping": "pong"
}
203.0.113.0.102 | SUCCESS => {
"changed": false,
"ping": "pong"
}
的pong
响应装置您的控制节点能够连接到被管理节点,以及Ansible是能够在远程主机执行Python命令。
步骤 3 — 设置变量文件
在运行此研讨会工具包中包含的剧本之前,您首先需要编辑包含设置的变量文件,例如要创建的远程用户的名称和要使用 MariaDB 设置的数据库凭据。
group_vars/all
使用您选择的文本编辑器打开文件:
- nano group_vars/all.yml
---
# Initial Server Setup
remote_user: sammy
# MySQL Setup
mysql_root_password: MYSQL_ROOT_PASSWORD
mysql_app_db: travellist
mysql_app_user: travellist_user
mysql_app_pass: DB_PASSWORD
# Web Server Setup
http_host: "{{ ansible_facts.eth0.ipv4.address }}"
remote_www_root: /var/www
app_root_dir: travellist-demo
document_root: "{{ remote_www_root }}/{{ app_root_dir }}/public"
# Laravel Env Variables
app_name: Travellist
app_env: dev
app_debug: true
app_url: "http://{{ http_host }}"
db_host: localhost
db_port: 3306
db_database: "{{ mysql_app_db }}"
db_user: "{{ mysql_app_user }}"
db_pass: "{{ mysql_app_pass }}"
需要注意的变量是:
remote_user
: 指定的用户将在远程服务器上创建并被授予sudo
权限。mysql_root_password
:这个变量定义了 MariaDB 服务器的数据库 root 密码。请注意,这应该是您自己选择的安全密码。mysql_app_db
:要为 Laravel 应用程序创建的数据库的名称。您不需要更改此值,但如果您愿意,您可以随意更改。该值将用于设置.env
Laravel 配置文件。mysql_app_user
:Laravel 应用程序的数据库用户名。同样,您不需要更改此值,但您可以随意更改。mysql_app_pass
:Laravel 应用程序的数据库密码。这应该是您选择的安全密码。http_host
:远程主机的域名或IP地址。在这里,我们使用 Ansible 事实,其中包含eth0
网络接口的 ipv4 地址。如果您有指向远程主机的域名,您可能希望为每个主机创建单独的变量文件,覆盖此值,以便 Nginx 配置包含每个服务器的正确主机名。
完成这些值的编辑后,保存并关闭文件。
为多个环境创建额外的变量文件
如果您设置了具有多个节点的清单文件,您可能需要创建额外的变量文件来相应地配置每个节点。在我们的示例清单中,我们创建了两个不同的组:dev
和production
。为了避免在两种环境中使用相同的数据库凭据和其他设置,我们需要创建一个单独的变量文件来保存生产值。
您可能希望复制默认变量文件并将其用作生产值的基础:
- cp group_vars/all.yml group_vars/production.yml
- nano group_vars/production.yml
因为该all.yml
文件包含对所有环境都有效的默认值,所以您可以从新production.yml
文件中删除所有不需要更改的变量。您应该为每个环境更新的变量在此处突出显示:
---
# Initial Server Setup
remote_user: prod_user
# MySQL Setup
mysql_root_password: MYSQL_PROD_ROOT_PASSWORD
mysql_app_pass: MYSQL_PROD_APP_PASSWORD
# Laravel Env Variables
app_env: prod
app_debug: false
请注意,我们已将app_env
值更改为 并将值prod
设置app_debug
为false
。这些是推荐用于生产环境的 Laravel 设置。
完成自定义生产变量后,保存并关闭文件。
使用 Ansible Vault 加密变量文件
如果您计划与其他用户共享您的 Ansible 设置,请务必确保变量文件中的数据库凭据和其他敏感数据的安全。这可以通过 Ansible Vault 实现,这是 Ansible 默认包含的功能。Ansible Vault 允许您加密变量文件,以便只有有权访问 Vault 密码的用户才能查看、编辑或取消加密这些文件。保管库密码也是运行剧本或使用加密文件的命令所必需的。
要加密您的生产变量文件,请运行:
- ansible-vault encrypt group_vars/production.yml
系统将提示您提供保管库密码并确认。完成后,如果您检查该文件的内容,您将看到数据现在已加密。
如果要查看变量文件而不更改其内容,可以使用以下view
命令:
- ansible-vault view group_vars/production.yml
系统将提示您提供在使用ansible-vault
.加密该文件时定义的相同密码。提供密码后,文件的内容将出现在您的终端中。要退出文件视图,请键入q
。
要编辑之前使用 Ansible Vault 加密的文件,请使用edit
vault 命令:
- ansible-vault edit group_vars/production.yml
此命令将提示您提供该文件的保管库密码。然后将使用您的默认终端编辑器打开文件进行编辑。进行所需的更改后,保存并关闭文件,Ansible Vault 将再次自动对其进行加密。
您现在已经完成了变量文件的设置。在下一步中,我们将运行剧本以在您的远程服务器上设置 Nginx、PHP-FPM 和 MariaDB(它们与基于 Linux 的操作系统(如 Ubuntu)一起构成 LEMP 堆栈)。
第 4 步 — 运行 LEMP 手册
在将演示 Laravel 应用程序部署到远程服务器之前,我们需要设置一个为应用程序提供服务的 LEMP 环境。该server-setup.yml
剧本包括设置此操作所需的 Ansible 角色。要检查其内容,请运行:
- cat server-setup.yml
---
- hosts: all
become: true
roles:
- { role: setup, tags: ['setup'] }
- { role: mariadb, tags: ['mysql', 'mariadb', 'db', 'lemp'] }
- { role: php, tags: ['php', 'web', 'php-fpm', 'lemp'] }
- { role: nginx, tags: ['nginx', 'web', 'http', 'lemp'] }
- { role: composer, tags: ['composer'] }
以下是本剧本中包含的所有角色的概述:
setup
:包含创建新系统用户并授予他们sudo
权限以及启用ufw
防火墙所需的任务。mariadb
:安装 MariaDB 数据库服务器并创建应用程序数据库和用户。php
:安装php-fpm
和运行 Laravel 应用程序所需的 PHP 模块。nginx
:安装 Nginx Web 服务器并启用端口访问80
。composer
:全局安装 Composer。
请注意,我们在每个角色中设置了一些标签。这是为了便于在必要时仅重新运行此剧本的部分内容。例如,如果您更改 Nginx 模板文件,您可能只想运行 Nginx 角色。
以下命令将从您的清单文件中的所有服务器上执行此剧本。在--ask-vault-pass
你用的是只有在必要的情况下ansible-vault
在前面的步骤加密变量文件:
- ansible-playbook -i hosts server-setup.yml -u root --ask-vault-pass
你会得到类似这样的输出:
OutputPLAY [all] **********************************************************************************************
TASK [Gathering Facts] **********************************************************************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
TASK [setup : Install Prerequisites] ********************************************************************
changed: [203.0.113.0.101]
changed: [203.0.113.0.102]
...
RUNNING HANDLER [nginx : Reload Nginx] ******************************************************************
changed: [203.0.113.0.101]
changed: [203.0.113.0.102]
PLAY RECAP **********************************************************************************************
203.0.113.0.101 : ok=31 changed=27 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
203.0.113.0.102 : ok=31 changed=27 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
您的节点现在已准备好使用 Nginx+PHP-FPM 为 PHP 应用程序提供服务,并使用 MariaDB 作为数据库服务器。在下一步中,我们将使用laravel-deploy.yml
Ansible playbook部署包含的演示 Laravel 应用程序。
第 5 步 – 部署 Laravel 应用程序
现在您在远程服务器上有一个可用的 LEMP 环境,您可以执行laravel-deploy.yml
剧本。该剧本将执行以下任务:
- 在远程服务器上创建应用程序文档根目录(如果尚未创建)。
- 使用
sync
模块将本地应用程序文件夹同步到远程服务器。 - 使用该
acl
模块为www-data用户设置存储文件夹的权限。 .env
根据laravel-env.j2
模板设置应用程序文件。- 使用 Composer 安装应用程序依赖项。
- 生成应用程序安全密钥。
- 为
storage
文件夹设置公共链接。 - 运行数据库迁移和播种机。
此剧本应由具有sudo
权限的非 root 用户执行。当您server-setup.yml
在上一步中执行playbook时,应该已使用remote_user
变量定义的名称创建了此用户。
准备好后,使用以下命令运行laravel-deploy.yml
剧本:
- ansible-playbook -i hosts laravel-deploy.yml -u sammy --ask-vault-pass
的--ask-vault-pass
情况下,你用的是只需要ansible-vault
在上一步中加密变量文件。
你会得到类似这样的输出:
OutputPLAY [all] **********************************************************************************************
TASK [Gathering Facts] **********************************************************************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
TASK [Make sure the remote app root exists and has the right permissions] *******************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
TASK [Rsync application files to the remote server] *****************************************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
...
TASK [Run Migrations + Seeders] *************************************************************************
ok: [203.0.113.0.101]
ok: [203.0.113.0.102]
PLAY RECAP **********************************************************************************************
203.0.113.0.101 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
203.0.113.0.102 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
执行完成后,您可以通过将浏览器指向您节点的域名或 IP 地址来访问演示应用程序:
http://node_domain_or_IP
你会看到一个这样的页面:
结论
本教程演示了如何设置 Ansible 清单文件并连接到远程节点,以及如何运行 Ansible playbook 来设置 LEMP 服务器并向其部署 Laravel 演示应用程序。本指南通过 Ansible Workshop Kit 的幻灯片和演讲者笔记补充了自动化服务器设置,并附有一个演示GitHub 存储库,其中包含所有必要文件,以跟进本次研讨会的演示组件。