如何使用Ansible在Ubuntu18.04上安装和设置LEMP
介绍
由于现代应用程序环境的一次性性质,服务器自动化现在在系统管理中发挥着重要作用。 配置管理工具,例如Ansible,通常用于通过为新服务器建立标准程序来简化服务器设置自动化的过程,同时减少与手动设置相关的人为错误。
Ansible 提供了一个简单的架构,不需要在节点上安装特殊软件。 它还提供了一组强大的功能和内置模块,有助于编写自动化脚本。
本指南解释了如何使用 Ansible 自动执行我们关于 如何在 Ubuntu 18.04 上安装 Linux、Nginx、MySQL 和 PHP (LEMP) 的指南中包含的步骤。 LEMP 软件堆栈是一组可用于提供动态网页和 Web 应用程序的软件。 这是描述 Linux 操作系统的首字母缩写词,带有 Nginx(发音为“Engine-X”)Web 服务器。 后端数据存储在MySQL数据库中,动态处理由PHP处理。
先决条件
为了执行我们在本指南中讨论的剧本提供的自动设置,您需要:
- 一个 Ansible 控制节点:安装了 Ansible 并配置为使用 SSH 密钥连接到 Ansible 主机的 Ubuntu 18.04 机器。 确保控制节点具有具有 sudo 权限的普通用户并启用了防火墙,如我们的 初始服务器设置 指南中所述。 要设置 Ansible,请按照我们关于 如何在 Ubuntu 18.04 上安装和配置 Ansible 的指南进行操作。
- 一个或多个 Ansible 主机:一个或多个远程 Ubuntu 18.04 服务器以前按照 如何使用 Ansible 在 Ubuntu 18.04 上自动进行初始服务器设置的指南设置。
在继续之前,您首先需要确保您的 Ansible 控制节点能够连接并在您的 Ansible 主机上执行命令。 如需连接测试,请查看 如何在 Ubuntu 18.04 上安装和配置 Ansible 的第 3 步。
这个剧本有什么作用?
这个 Ansible playbook 提供了一种替代方法来手动运行我们在 如何在 Ubuntu 18.04 上安装 Linux、Nginx、MySQL、PHP(LEMP 堆栈)的指南中概述的过程。
运行此 playbook 将在您的 Ansible 主机上执行以下操作:
- 安装
aptitude,这是 Ansible 首选的apt包管理器的替代方案。 - 安装所需的 LEMP 包。
- 使用提供的模板设置 Nginx 配置文件。
- 启用新的 Nginx 配置并禁用默认配置。
- 设置 MySQL root 用户的密码。
- 删除匿名 MySQL 帐户和测试数据库。
- 设置 UFW 以允许配置端口上的 HTTP 流量(默认为
80)。 - 使用提供的模板设置 PHP 测试脚本。
一旦 playbook 完成运行,您将根据您在配置变量中定义的选项,在 Nginx 之上运行一个 Web PHP 环境。
如何使用本手册
我们需要做的第一件事是从 do-community/ansible-playbooks 存储库中获取 LEMP playbook 及其依赖项。 我们需要将此存储库克隆到 Ansible 控制节点内的本地文件夹。
如果您之前按照不同的指南克隆了此存储库,请访问您现有的 ansible-playbooks 副本并运行 git pull 命令以确保您已更新内容:
cd ~/ansible-playbooks git pull
如果这是您第一次使用 do-community/ansible-playbooks 存储库,您应该首先将存储库克隆到您的主文件夹:
cd ~ git clone https://github.com/do-community/ansible-playbooks.git cd ansible-playbooks
我们感兴趣的文件位于 lemp_ubuntu1804 文件夹中,其结构如下:
lemp_ubuntu1804 ├── files │ ├── info.php.j2 │ └── nginx.conf.j2 ├── vars │ └── default.yml ├── playbook.yml └── readme.md
以下是每个文件的内容:
files/info.php.j2:用于在 Web 服务器的根目录上设置 PHP 测试页面的模板文件files/nginx.conf.j2:用于设置 Nginx 服务器的模板文件。 目录。vars/default.yml:用于自定义剧本设置的变量文件。playbook.yml:剧本文件,包含要在远程服务器上执行的任务。readme.md:包含有关此剧本的信息的文本文件。
我们将编辑 playbook 的变量文件以自定义 MySQL 和 Nginx 的配置。 访问 lemp_ubuntu1804 目录并使用您选择的命令行编辑器打开 vars/default.yml 文件:
cd lemp_ubuntu1804 nano vars/default.yml
此文件包含一些需要您注意的变量:
变量/default.yml
--- mysql_root_password: "mysql_root_password" http_host: "your_domain" http_conf: "your_domain.conf" http_port: "80"
以下列表包含每个变量的简要说明以及您可能希望如何更改它们:
mysql_root_password:root MySQL 帐户所需的密码。http_host:此 Web 服务器的主机名或 IP 地址。http_conf:要在/etc/nginx/sites-available内部创建的配置文件的名称,通常设置为主机名或应用程序名,以便于识别。http_port:Nginx 将用于服务该站点的端口。 默认情况下这是端口80,但如果您想在不同的端口上为您的站点或应用程序提供服务,请在此处输入。
更新完 vars/default.yml 中的变量后,保存并关闭此文件。 如果您使用 nano,请按 CTRL + X、Y,然后按 ENTER。
您现在已准备好在一台或多台服务器上运行此 playbook。 大多数 playbook 配置为在每个 server in your inventory, by default. We can use the-lflag to make sure that only a subset of servers, or a single server, is affected by the playbook. We can also use the-u` 标志上执行,以指定我们使用远程服务器上的哪个用户来连接和执行远程主机上的 playbook 命令.
要仅在 server1 上执行 playbook,连接为 sammy,可以使用以下命令:
ansible-playbook playbook.yml -l server1 -u sammy
你会得到类似这样的输出:
Output PLAY [all] ***************************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************** ok: [server1] TASK [Install Prerequisites] *********************************************************************************************************** changed: [server1] => (item=aptitude) ... TASK [UFW - Allow HTTP on port 80] ***************************************************************************************************** changed: [server1] TASK [Sets Up PHP Info Page] *********************************************************************************************************** changed: [server1] RUNNING HANDLER [Reload Nginx] ********************************************************************************************************* changed: [server1] PLAY RECAP ***************************************************************************************************************************** server1 : ok=12 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
注意:有关如何运行 Ansible playbook 的更多信息,请查看我们的 Ansible 备忘单指南 。
当 playbook 运行完成后,转到您的 Web 浏览器并访问服务器的主机或 IP 地址,如 playbook 变量中配置的那样,然后是 /info.php:
http://server_host_or_IP/info.php
你会看到这样的页面:
由于此页面包含有关您的 PHP 环境的敏感信息,因此建议您在完成设置后通过运行 rm -f /var/www/info.php 命令将其从服务器中删除。
剧本内容
您可以在 DigitalOcean Community Playbooks 存储库中的 lemp_ubuntu1804 文件夹中找到本教程中介绍的 LEMP 服务器设置。 要直接复制或下载脚本内容,请单击每个脚本顶部的 Raw 按钮。
为方便起见,此处还包含了剧本的全部内容及其相关文件。
变量/default.yml
default.yml 变量文件包含将在 playbook 任务中使用的值,例如 MySQL root 帐户的密码和要在 Nginx 中配置的域名。
变量/default.yml
--- mysql_root_password: "mysql_root_password" http_host: "your_domain" http_conf: "your_domain.conf" http_port: "80"
文件/nginx.conf.j2
nginx.conf.j2 文件是一个 Jinja 2 模板文件,用于配置 Nginx Web 服务器。 此模板中使用的变量在 vars/default.yml 变量文件中定义。
文件/nginx.conf.j2
server {
listen {{ http_port }};
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name {{ http_host }};
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
文件/info.php.j2
info.php.j2 文件是另一个 Jinja 模板,用于在新配置的 LEMP 服务器的文档根目录中设置测试 PHP 脚本。
文件/info.php.j2
<?php phpinfo();
剧本.yml
playbook.yml 文件是定义此设置中的所有任务的位置。 它首先定义应作为此设置目标的服务器组 (all),然后使用 become: true 定义应使用权限提升执行的任务 ([ X197X]) 默认情况下。 然后,它包含 vars/default.yml 变量文件以加载配置选项。
剧本.yml
---
- hosts: all
become: true
vars_files:
- vars/default.yml
tasks:
- name: Install Prerequisites
apt: name={{ item }} update_cache=yes state=latest force_apt_get=yes
loop: [ 'aptitude' ]
- name: Install LEMP Packages
apt: name={{ item }} update_cache=yes state=latest
loop: [ 'nginx', 'mysql-server', 'python3-pymysql', 'php-fpm', 'php-mysql' ]
# Nginx Configuration
- name: Sets Nginx conf file
template:
src: "files/nginx.conf.j2"
dest: "/etc/nginx/sites-available/{{ http_conf }}"
- name: Enables new site
file:
src: "/etc/nginx/sites-available/{{ http_conf }}"
dest: "/etc/nginx/sites-enabled/{{ http_conf }}"
state: link
notify: Reload Nginx
- name: Removes "default" site
file:
path: "/etc/nginx/sites-enabled/default"
state: absent
notify: Reload Nginx
# MySQL Configuration
- name: Sets the root password
mysql_user:
name: root
password: "{{ mysql_root_password }}"
login_unix_socket: /var/run/mysqld/mysqld.sock
- name: Removes all anonymous user accounts
mysql_user:
name: ''
host_all: yes
state: absent
login_user: root
login_password: "{{ mysql_root_password }}"
- name: Removes the MySQL test database
mysql_db:
name: test
state: absent
login_user: root
login_password: "{{ mysql_root_password }}"
# UFW Configuration
- name: "UFW - Allow HTTP on port {{ http_port }}"
ufw:
rule: allow
port: "{{ http_port }}"
proto: tcp
# Sets Up PHP Info Page
- name: Sets Up PHP Info Page
template:
src: "files/info.php.j2"
dest: "/var/www/html/info.php"
# Handlers
handlers:
- name: Reload Nginx
service:
name: nginx
state: reloaded
- name: Restart Nginx
service:
name: nginx
state: restarted
随意修改这些文件以最适合您自己工作流程中的个人需求。
结论
在本指南中,我们使用 Ansible 自动执行在远程服务器上安装和设置 LEMP 环境的过程。 因为每个人在使用 MySQL 数据库和用户时通常有不同的需求,我们鼓励您查看 官方 Ansible 文档 以获取 mysql_user Ansible 模块的更多信息和用例。
如果您想在此 playbook 中包含其他任务以进一步自定义您的服务器设置,请参阅我们的 Ansible 入门指南 配置管理 101:编写 Ansible Playbooks。