引言
由于现代应用程序环境的可任意使用性质,服务器自动化现在在系统管理中扮演着重要角色。 通过建立新服务器的标准流程,组态管理工具比如 Ansible 通常被用来简化自动化服务器设置的过程。 这样做的好处是减少了与手动设置相关的人为错误。
安塞波提供了一个简化的架构,不需要在节点上安装特殊的软件。 它还提供了一组健壮的特性和内置模块,这些特性和模块有助于编写自动化脚本。
本教程旨在配合使用 Ansible Workshop Kit 的自动化服务器安装的幻灯片和演讲者说明,向您展示如何设置一个库存文件和执行一组配置脚本,以完全自动化在18.04上设置远程 LEMP 服务器(l inux,(e) Nginx,m ariaDB 和 p HP-FPM)的过程,并将一个演示 Laravel 应用程序部署到这个系统。
注意: 本材料旨在演示如何使用剧本自动设置安塞贝的服务器。 虽然我们的演示包含一个运行在 LEMP 服务器上的 Laravel 应用程序,但是我们鼓励读者修改和调整包含的设置,以适应他们自己的需要。
先决条件
要遵循本教程,你需要:
- 一个安塞控制节点: 一个安装了安塞的 Ubuntu 18.04机器,并配置为使用 SSH 密钥连接到您的安塞主机。 确保控制节点有一个具有 sudo 权限的常规用户和启用了防火墙(如我们的 Initial Server Setup 指南所述) ,以及一组有效的 SSH 密钥。 要安装 Ansible,请按照我们的指南在 Ubuntu 18.04上安装和配置。
- 一个或多个安塞主机: 一个或多个远程 Ubuntu 18.04服务器。 每个主机都必须将控制节点的公钥添加到其授权密钥文件中,正如如何在 Ubuntu 18.04指南中设置 SSH 密钥的步骤2所解释的那样。 如果你使用 DigitalOcean 作为节点,你可以使用控制面板将你的公钥添加到你的安塞主机。
步骤1ー克隆演示存储库
我们需要做的第一件事是克隆包含 Ansible provisioning 脚本的存储库和我们将部署到远程服务器的演示 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 角色。
- 库存示例: 此文件可用作基础,以便为基础结构创建自定义库存。
- Yml: 这个剧本将把演示的 Laravel 应用程序部署到远程服务器。
- Laravel-env. j2: 这个模板被 laravel-deploy. yml playbook 用于设置应用程序环境文件。
- Readme.md: 此文件包含有关此存储库中包含的配置的一般信息。
- Yml: 本剧本将使用 roles / 目录中定义的角色提供 LEMP 服务器。
步骤2ー建立库存文件并测试与节点的连接
现在,我们将创建一个库存文件,列出我们希望使用 Ansible 管理的主机。 首先,将库存示例文件复制到一个名为 hosts 的新文件:
- cp inventory-example hosts
现在,使用您选择的文本编辑器打开新的库存文件,并用您自己的服务器更新它。 在这里,我们将使用 nano:
- nano hosts
随车间工具包附带的示例库存包含两个 Ansible 组: dev 和 production。 这是为了演示如何使用组变量在多个环境中自定义部署。 如果希望用单个节点测试这个设置,可以使用 dev 或生产组,并从库存文件中删除另一个。
[dev]
203.0.113.0.101
[prod]
203.0.113.0.102
[all:vars]
ansible_python_interpreter=/usr/bin/python3
注意: 可用的 Python 解释器变量定义了远程主机上的 Python 可执行文件的路径。 在这里,我们告诉安塞可以为这个库存文件中的所有主机设置这个变量。
完成后保存并关闭文件。 如果你正在使用 nano,你可以通过按 ctrl + x,然后按 y 键和 ENTER 键来确认。
一旦你完成了库存文件的调整,你可以执行 ping Ansible 模块来测试控制节点是否能够连接到主机:
- ansible all -i hosts -m ping -u root
让我们分解一下这个命令:
- All: 此选项告诉 Ansible 从指定的库存文件中对所有主机运行以下命令。
- - i 主机: 指定应使用哪些库存。 如果没有提供此选项,Ansible 将尝试使用默认库存,该库存通常位于 / etc / Ansible / hosts。
- - m ping: 这将执行 ping Ansible 模块,该模块将测试节点的连接性以及是否可以在远程系统上找到 Python 可执行文件。
- - u 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 设置的数据库凭据。
使用您选择的文本编辑器打开组 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 }}"
需要你注意的变量有:
- 远程用户: 将在远程服务器上创建指定的用户并授予 sudo 特权。
- Mysql root password: 这个变量定义 MariaDB 服务器的数据库 root 密码。 请注意,这应该是一个您自己选择的安全密码。
- Mysql app db: 为 Laravel 应用程序创建的数据库名称。 您不需要更改这个值,但是如果您愿意,您可以随意更改。 此值将用于设置。 配置文件。
- Mysql app user: Laravel 应用程序的数据库用户的名称。 同样,您不需要更改这个值,但是您可以自由地这样做。
- Mysql 应用程序传递: Laravel 应用程序的数据库密码。这应该是您选择的安全密码。
- Http host: 远程主机的域名或 IP 地址。 在这里,我们使用了一个可能的事实,即包含了 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 设置。
完成自定义生产变量后,保存并关闭该文件。
用安塞库加密可变文件
如果您计划与其他用户共享您的安塞布局,那么保证变量文件中的数据库凭据和其他敏感数据的安全是非常重要的。 这是可能的与安塞避难所,一个功能,是包括与安塞的默认。 安塞库允许你加密可变文件,只有访问密码的用户才能查看、编辑或解密这些文件。 要运行一个 playbook 或使用加密文件的命令,也需要使用 vault 密码。
要加密您的生产变量文件,请运行:
- ansible-vault encrypt group_vars/production.yml
您将被提示提供一个保险库密码并确认它。 一旦完成,如果检查该文件的内容,您将看到数据现在已经加密。
如果你想查看变量文件而不改变它的内容,你可以使用 view 命令:
- ansible-vault view group_vars/production.yml
系统将提示您提供在使用 ansible-vault 对该文件进行加密时定义的相同密码。 提供密码后,文件的内容将出现在您的终端中。 要退出文件视图,输入 q。
要编辑以前使用安塞库加密的文件,请使用编辑库命令:
- ansible-vault edit group_vars/production.yml
此命令将提示您提供该文件的保险库密码。 然后使用默认的终端编辑器打开文件进行编辑。 在做出所需的修改之后,保存并关闭文件,文件将由安塞库自动再次加密。
您现在已经完成了变量文件的设置。 在下一步,我们将运行剧本在远程服务器上设置 Nginx、 PHP-FPM 和 MariaDB (它与基于 linux 的操作系统如 Ubuntu 一起构成了 LEMP 堆栈)。
第四步: 运行 LEMP Playbook
在将演示的 Laravel 应用程序部署到远程服务器之前,我们需要设置一个为应用程序服务的 LEMP 环境。 服务器设置。 的剧本中包含了安塞贝角色,这些角色是设置剧本所必需的。 要检查其内容,请运行:
- 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 数据库服务器并创建应用程序数据库和用户。
- Php: 安装运行 Laravel 应用程序所必需的 PHP-fpm 和 PHP 模块。
- 安装 Nginx web 服务器并在端口80上启用访问。
- 作曲家: 全球安装作曲家。
注意,我们已经在每个角色中设置了一些标记。 这是为了便于重新运行本剧本的一部分,如果有必要的话。 例如,如果您对 Nginx 模板文件进行了更改,您可能希望只运行 Nginx 角色。
下面的命令将在库存文件中的所有服务器上执行此剧本。 只有在上一步中使用了安全库对变量文件进行加密时,才需要使用 ask-vault-pass:
- 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 部署包含的 demo Laravel 应用程序。 安塞皮剧本。
第五步ー部署 Laravel 应用程序
现在您的远程服务器上已经有了一个工作的 LEMP 环境,您可以执行 laravel-deploy。 战术手册。 本剧本将执行以下任务:
- 如果尚未创建,则在远程服务器上创建应用程序文档根目录。
- 使用同步模块将本地应用程序文件夹同步到远程服务器。
- 使用 acl 模块为存储文件夹上的 www-data 用户设置权限。
- 根据 laravel-env. j2模板设置. env 应用程序文件。
- 使用 Composer 安装应用程序依赖项。
- 生成应用程序安全密钥。
- 为存储文件夹设置一个公共链接。
- 运行数据库迁移和播种器。
此剧本应该由具有 sudo 权限的非根用户执行。 这个用户应该是在您执行服务器安装程序时创建的。 使用由远程用户变量定义的名称。
准备好后,使用下面的代码运行 laravel-deploy. yml playbook:
- ansible-playbook -i hosts laravel-deploy.yml -u sammy --ask-vault-pass
只有在上一步中使用了安全库对变量文件进行加密时,才需要使用 -- ask-vault-pass。
你会得到类似这样的输出:
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 playbooks 来设置 LEMP 服务器并为其部署 Laravel 演示应用程序。 这个指南称赞了自动化服务器设置与 Ansible Workshop Kit 的幻灯片和演讲者说明,并附有一个演示 GitHub 存储库,其中包含所有必要的文件,以跟进这个工作坊的演示组件。