<$>[信息] [标签使用可分析的研讨会套件材料自动设置服务器 ] 本研讨会工具包旨在帮助技术受众熟悉配置管理概念以及如何使用Ansible自动执行服务器基础架构设置。
其目的是为演讲者提供一套完整的资源来主持一场活动,并就Ansible发表介绍性演讲。它包括:
- **** 幻灯片和扬声器notes** ,包括演示短片和用于运行可选现场演示的命令。这场演讲大约持续了50分钟。
- **A** GitHub repository** ,包含演示应用程序代码和将该应用程序部署到Ubuntu服务器所需的Ansible脚本。
- 本教程指导用户在远程服务器上部署_TravelList_DemoLaravel应用程序。
本教程旨在通过额外的细节和说明来补充Talk演示。它也可以作为读者使用Ansible将Laravel应用程序部署到远程Ubuntu服务器上的参考。 <$>
[YouTube EVsqdS8kWSQ 480 854]
简介
由于现代应用程序环境的一次性性质,服务器自动化现在在系统管理中扮演着重要角色。Configuration management工具,如Ansible通常用于通过为新服务器建立标准程序来简化自动化服务器设置的过程。这具有减少与手动设置相关的人为错误的好处。
Ansible提供了一种简化的架构,不需要在节点上安装特殊软件。它还提供了一组健壮的功能和内置模块,便于编写自动化脚本。
本教程旨在随幻灯片和演讲者笔记一同设计,介绍如何设置清单文件和执行一组配置脚本,以在Ubuntu18.04上完全自动化设置远程Kit](https://docs.google.com/presentation/d/1zGFt32gtphr3U5ASUDrSJbH7cA9PuASygnL-tVUnNH8/edit?usp=sharing),服务器(L inux、(** E** )nginx、** M** ariaDB和** P** HP-fpm)的过程,并向该系统部署演示Laravel应用程序。
<$>[备注] 注意 :本材料旨在演示如何使用实战手册通过Ansible自动设置服务器。虽然我们的演示由运行在LEMP服务器上的Laravel应用程序组成,但我们鼓励读者修改和调整附带的设置以满足自己的需要。 <$>
前提条件
要学习本教程,您需要:
- 一个可分析的控制节点 :一台安装了可分析的Ubuntu 18.04机器,配置为使用SSH密钥连接到您的可分析的主机。确保控制节点具有具有sudo权限的常规用户并启用了防火墙,如我们的初始服务器Setup指南》和一组有效的SSH keys.要安装安可普,请遵循我们的指南如何在Ubuntu 18.04.上安装和配置安可普
- 一个或多个可攻击主机 :一个或多个远程Ubuntu 18.04服务器。每个主机都必须将控制节点的公钥添加到其`授权密钥‘文件中,如如何在Ubuntu 18.04](https://andsky.com/tech/tutorials/how-to-set-up-ssh-keys-on-ubuntu-1804# step-2-%E2%80%94-copy-the-public-key-to-ubuntu-server)上设置SSH密钥指南的[步骤2]中所述。如果您使用DigitalOceanDroplets作为节点,您可以使用Ctrl panel将您的公钥添加到您的可解析主机中。
第一步-克隆Demo资源库
我们需要做的第一件事是克隆包含Ansible预配脚本和演示Laravel应用程序的存储库,我们将把它们部署到远程服务器。所有必要的文件都可以在do-community/ansible-laravel-demoGithub存储库中找到。
以sudo用户身份登录到Ansible控制节点后,克隆存储库并导航到git
命令创建的目录:
1git clone https://github.com/do-community/ansible-laravel-demo.git
2cd ansible-laravel-demo
现在,您可以运行ls
命令来检查克隆存储库的内容:
1ls -l --group-directories-first
您将看到如下输出:
1[label ansible-laravel-demo]
2drwxrwxr-x 3 sammy sammy 4096 Mar 24 15:24 application
3drwxrwxr-x 2 sammy sammy 4096 Mar 24 15:24 group_vars
4drwxrwxr-x 7 sammy sammy 4096 Mar 24 15:24 roles
5-rw-rw-r-- 1 sammy sammy 102 Mar 24 15:24 inventory-example
6-rw-rw-r-- 1 sammy sammy 1987 Mar 24 15:24 laravel-deploy.yml
7-rw-rw-r-- 1 sammy sammy 794 Mar 24 15:24 laravel-env.j2
8-rw-rw-r-- 1 sammy sammy 920 Mar 24 15:24 readme.md
9-rw-rw-r-- 1 sammy sammy 318 Mar 24 15:24 server-setup.yml
以下是每个文件夹和文件的概述以及它们是什么:
应用程序/
:此目录包含本研讨会结束时要部署到远程服务器上的demo Laravel应用程序。group_vars/
:此目录包含变量文件,其中包含应用程序设置的自定义选项,例如数据库凭据和应用程序文件在远程服务器上的存储位置。roles](https://andsky.com/tech/tutorials/how-to-use-ansible-roles-to-abstract-your-infrastructure-environment)/
:该目录包含处理Ubuntu Lemp服务器配置的不同[可扩展角色]。Inventory-Example
:该文件可以作为基础,为您的基础设施创建自定义清单。laravel-ploy.yml
:本剧本将演示的laravel应用部署到远程服务器。laravel-env.j2
:laravel-ploy.yml
剧本使用该模板设置应用环境文件。Readme.md
:该文件包含关于该存储库中包含的预配的一般信息。server-setup.yml
:本剧本将使用Roles/
目录中定义的角色来配置LEMP服务器。
第二步-建立清单文件并测试节点连接
现在,我们将创建一个清单文件,以列出我们要使用Ansible管理的主机。首先,将Inventory-Example
文件复制到名为Hosts
的新文件中:
1cp inventory-example hosts
现在,使用您选择的文本编辑器打开新的库存文件,并使用您自己的服务器更新它。这里,我们将使用nan
:
1nano hosts
研讨会套件附带的示例清单包含两个Anable组:dev
和Production
。这是为了演示如何使用组变量在多个环境中自定义部署。如果您希望使用单个节点测试此设置,您可以使用dev
或Production
组,并从清单文件中删除另一个。
1[label ansible-laravel-demo/hosts]
2[dev]
3203.0.113.0.101
4
5[prod]
6203.0.113.0.102
7
8[all:vars]
9ansible_python_interpreter=/usr/bin/python3
<$>[备注]
注意 :ansible_python_parstrter
变量定义了远程主机上的Python可执行文件的路径。在这里,我们告诉Ansible为这个清单文件中的所有主机设置这个变量。
<$>
完成后保存并关闭该文件。如果您使用的是Nan
,您可以通过点击CTRL+X
,然后点击Y
和Enter
来确认。
调整完清单文件后,可以执行ping
Anable模块来测试控制节点是否能够连接到主机:
1ansible all -i hosts -m ping -u root
让我们来分析一下这个命令:
all
:该选项告诉Ansible从指定的清单文件中对 所有** 主机执行以下命令。-i Hosts
:指定使用哪种盘点。未提供该选项时,Ansible会尝试使用默认库存,默认库存通常位于/etc/ansible/Hosts
。-m ping
:这将执行ping
Ansible模块,该模块将测试到节点的连通性,以及在远程系统上是否可以找到Python可执行文件。-u root
:该选项指定使用哪个远程用户连接到节点。我们在这里使用 根** 帐户作为示例,因为这通常是新服务器上唯一可用的帐户。根据您的基础设施提供商和SSH配置,可能需要其他连接选项。
如果正确设置了到节点的SSH连接,您将获得以下输出:
1[secondary_label Output]
2203.0.113.0.101 | SUCCESS => {
3 "changed": false,
4 "ping": "pong"
5}
6203.0.113.0.102 | SUCCESS => {
7 "changed": false,
8 "ping": "pong"
9}
pong
响应表示您的控制节点能够连接到您管理的节点,并且Ansible能够在远程主机上执行Python命令。
第三步-设置变量文件
在运行本研讨会工具包中包含的攻略之前,您首先需要编辑变量文件,该文件包含要创建的远程用户名和要使用MariaDB设置的数据库凭据等设置。
使用您选择的文本编辑器打开group_vars/all
文件:
1nano group_vars/all.yml
1[label ansible-laravel-demo/group_vars/all.yml]
2---
3# Initial Server Setup
4remote_user: sammy
5
6# MySQL Setup
7mysql_root_password: MYSQL_ROOT_PASSWORD
8mysql_app_db: travellist
9mysql_app_user: travellist_user
10mysql_app_pass: DB_PASSWORD
11
12# Web Server Setup
13http_host: "{{ ansible_facts.eth0.ipv4.address }}"
14remote_www_root: /var/www
15app_root_dir: travellist-demo
16document_root: "{{ remote_www_root }}/{{ app_root_dir }}/public"
17
18# Laravel Env Variables
19app_name: Travellist
20app_env: dev
21app_debug: true
22app_url: "http://{{ http_host }}"
23db_host: localhost
24db_port: 3306
25db_database: "{{ mysql_app_db }}"
26db_user: "{{ mysql_app_user }}"
27db_pass: "{{ mysql_app_pass }}"
需要你注意的变量有:
远程用户
:在远程服务器上创建指定的用户,并授予sudo
权限。mysql_root_password
:该变量定义MariaDB服务器的数据库根密码。请注意,这应该是您自己选择的安全密码。mysql_app_db
:要为Laravel应用创建的数据库名称。您不需要更改此值,但如果愿意,您可以自由更改。该值将用于设置.env
Laravel配置文件。mysql_app_user
:Laravel应用的数据库用户名。同样,您不需要更改此值,但您可以自由更改。mysql_app_pass
:Laravel应用的数据库密码。这应该是您选择的安全密码。http_host
:远程主机的域名或IP地址。在这里,我们使用了一个包含`eth0‘网络接口的IPv4地址的可分析事实。如果您的域名指向您的远程主机,您可能希望为每个主机创建单独的变量文件,覆盖此值,以便Nginx配置包含每个服务器的正确主机名。
编辑完这些值后,保存并关闭该文件。
创建多个环境的额外变量文件
如果您已经设置了包含多个节点的清单文件,则可能需要创建额外的变量文件来相应地配置每个节点。在我们的示例清单中,我们创建了两个不同的组:dev
和Production
。为了避免在两个环境中具有相同的数据库凭据和其他设置,我们需要创建一个单独的变量文件来保存生产值。
您可能希望复制默认变量文件,并将其用作生产值的基础:
1cp group_vars/all.yml group_vars/production.yml
2nano group_vars/production.yml
由于all.yml
文件包含对所有环境都有效的默认值,因此您可以从新的Production.yml
文件中删除所有不需要更改的变量。此处突出显示了应为每个环境更新的变量:
1[label ansible-laravel-demo/group_vars/production]
2---
3# Initial Server Setup
4remote_user: prod_user
5
6# MySQL Setup
7mysql_root_password: MYSQL_PROD_ROOT_PASSWORD
8mysql_app_pass: MYSQL_PROD_APP_PASSWORD
9
10# Laravel Env Variables
11app_env: prod
12app_debug: false
请注意,我们已经将app_env
值更改为prod
,并将app_debug
值设置为False
。这些是针对生产环境推荐的Laravel设置。
完成自定义生产变量后,保存并关闭文件。
使用Ansible Vault加密变量文件
如果您计划与其他用户共享您的Ansible设置,确保变量文件中的数据库凭据和其他敏感数据的安全非常重要。这可以通过Ansible Vault实现,该功能默认情况下包含在Ansible中。Anable Vault允许您加密可变文件,以便只有具有访问Vault密码的用户才能查看、编辑或解密这些文件。运行剧本或使用加密文件的命令时,也需要存储库密码。
要加密您的生产变量文件,请运行:
1ansible-vault encrypt group_vars/production.yml
系统将提示您提供保管库密码并进行确认。完成后,如果您检查该文件的内容,您将看到数据现在已加密。
如果您想在不更改变量文件内容的情况下查看变量文件,可以使用view
命令:
1ansible-vault view group_vars/production.yml
系统将提示您提供与使用ansible-vault
加密该文件时定义的密码相同的密码。输入密码后,文件的内容将显示在您的终端中。要退出文件视图,请键入q
。
要编辑以前使用Anable Vault加密的文件,请使用edit
vault命令:
1ansible-vault edit group_vars/production.yml
此命令将提示您提供该文件的电子仓库密码。然后,您的默认终端编辑器将用于打开该文件进行编辑。进行所需更改后,保存并关闭该文件,Ansible Vault将再次自动对其进行加密。
现在,您已经完成了变量文件的设置。在下一步中,我们将运行剧本在您的远程服务器(S)上设置nginx、php-fpm和MariaDB(它们与Ubuntu等基于Linux的操作系统一起构成LEMP堆栈)。
第四步-运行LEMP攻略
在将演示Laravel应用程序部署到远程服务器之前,我们需要设置一个LEMP环境来为应用程序提供服务。server-setup.yml
剧本包括设置此设置所需的Ansible角色。要检查其内容,请运行:
1cat server-setup.yml
1[label ansible-laravel-demo/server-setup.yml]
2---
3- hosts: all
4 become: true
5 roles:
6 - { role: setup, tags: ['setup'] }
7
8 - { role: mariadb, tags: ['mysql', 'mariadb', 'db', 'lemp'] }
9
10 - { role: php, tags: ['php', 'web', 'php-fpm', 'lemp'] }
11
12 - { role: nginx, tags: ['nginx', 'web', 'http', 'lemp'] }
13
14 - { role: composer, tags: ['composer'] }
以下是本攻略中包含的所有角色的概述:
setup
:包含创建新的系统用户并为其授予sudo
权限以及启用ufw
防火墙所需的任务。mariadb
:安装MariaDB数据库服务器,创建应用数据库和用户。php
:安装运行Laravel应用程序所需的php-fpm
和PHP模块。nginx
:安装Nginx Web服务器,并开启80
端口访问。Composer
:全局安装Composer。
请注意,我们已经在每个角色中设置了一些标记。这是为了便于在必要时仅重新运行本攻略的部分内容。例如,如果您对nginx模板文件进行了更改,则可能只希望运行nginx角色。
以下命令将在您的库存文件中的所有服务器上执行此剧本。只有当您在上一步中使用了anable-vault
加密变量文件时,才需要使用--Ask-vault-pass
:
1ansible-playbook -i hosts server-setup.yml -u root --ask-vault-pass
您将得到类似于以下内容的输出:
1[secondary_label Output]
2PLAY [all] **********************************************************************************************
3
4TASK [Gathering Facts] **********************************************************************************
5ok: [203.0.113.0.101]
6ok: [203.0.113.0.102]
7
8TASK [setup : Install Prerequisites] ********************************************************************
9changed: [203.0.113.0.101]
10changed: [203.0.113.0.102]
11
12...
13
14RUNNING HANDLER [nginx : Reload Nginx] ******************************************************************
15changed: [203.0.113.0.101]
16changed: [203.0.113.0.102]
17
18PLAY RECAP **********************************************************************************************
19203.0.113.0.101 : ok=31 changed=27 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
20203.0.113.0.102 : ok=31 changed=27 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
您的节点(S)现在已经准备好使用nginx+php-fpm服务于PHP应用程序,并使用MariaDB作为数据库服务器。在下一步中,我们将使用`laravel-ploy.yml‘Ansible剧本部署附带的演示Laravel应用程序。
第五步-部署Laravel应用
现在您的远程服务器(S)上已经有了一个可以工作的LEMP环境,您可以执行`laravel-ploy.yml‘剧本了。本攻略将执行以下任务:
1.在远程服务器上创建应用程序文档根目录(如果尚未创建)。
2.使用sync
模块将本地应用文件夹同步到远程服务器。
3.使用acl
模块为www-data 用户设置存储文件夹的权限。
4.基于laravel-env.j2
模板设置.env
应用文件。
5.使用Composer安装应用依赖项。
6.生成应用安全密钥。
7.为storage
文件夹设置公共链接。
8.运行数据库迁移和种子程序。
本攻略应由具有sudo
权限的非超级用户执行。当您在上一步执行server-setup.yml
剧本时,应该已经创建了该用户,使用的名称由Remote_user
变量定义。
当你准备好了,运行laravel-deploy.yml
剧本:
1ansible-playbook -i hosts laravel-deploy.yml -u sammy --ask-vault-pass
只有当您在上一步中使用了anable-avult
加密变量文件时,才需要使用--Ask-vault-pass
。
您将得到类似于以下内容的输出:
1[secondary_label Output]
2PLAY [all] **********************************************************************************************
3
4TASK [Gathering Facts] **********************************************************************************
5ok: [203.0.113.0.101]
6ok: [203.0.113.0.102]
7
8TASK [Make sure the remote app root exists and has the right permissions] *******************************
9ok: [203.0.113.0.101]
10ok: [203.0.113.0.102]
11
12TASK [Rsync application files to the remote server] *****************************************************
13ok: [203.0.113.0.101]
14ok: [203.0.113.0.102]
15
16...
17
18TASK [Run Migrations + Seeders] *************************************************************************
19ok: [203.0.113.0.101]
20ok: [203.0.113.0.102]
21
22PLAY RECAP **********************************************************************************************
23203.0.113.0.101 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
24203.0.113.0.102 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
执行完成后,您可以通过将浏览器指向节点的域名或IP地址来访问演示应用程序:
1http://node_domain_or_IP
您将看到如下所示的页面:
结论
本教程演示了如何设置Ansible库存文件并连接到远程节点,以及如何运行Ansible剧本来设置LEMP服务器并将Laravel演示应用部署到其中。本指南补充了使用Ansible Workshop Kit的自动服务器设置docs.google.com/presentation/d/1zGFt32gtphr3U5ASUDrSJbH7cA9PuASygnL-tVUnNH8/edit? usp=sharing),并附带一个演示GitHub存储库,其中包含所有必要的文件,以跟进本研讨会的演示组件。