如何使用 Ansible 在 Ubuntu 18.04 上安装和设置 LEMP

介绍

服务器自动化现在在系统管理中起着至关重要的作用,因为现代应用环境的可调用性质。 配置管理 工具如 Ansible 通常用于通过为新服务器建立标准程序来简化服务器设置的自动化过程,同时也减少了与手动设置相关的人为错误。

Ansible提供了一个简单的架构,不需要在节点上安装特殊软件,它还提供了一组强大的功能和内置模块,可方便编写自动化脚本。

本指南解释了如何使用 Ansible 来自动化我们关于 Ubuntu 18.04 上如何安装 Linux, Nginx, MySQL 和 PHP (LEMP) 的指南中的步骤(https://andsky.com/tech/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-ubuntu-18-04)。LEMP 软件堆栈是一种可以用于服务动态 Web 页面和 Web 应用程序的软件组。这是描述一个 Linux 操作系统的缩写,具有 Nginx (发音为**E**ngine-X) 网页服务器。后端数据存储在 MySQL 数据库中,动态处理由 PHP 处理。

前提条件

为了执行我们在本指南中讨论的播放簿提供的自动设置,您将需要:

  • One Ansible 控制节点:安装并配置为使用 SSH 键连接您的 Ansible 主机的 Ubuntu 18.04 机器,请确保控制节点具有具有 sudo 权限的常规用户和启用防火墙,如我们在 初始服务器设置指南中所解释的那样。 为了设置 Ansible,请遵循我们在 如何在 Ubuntu 18.04 上安装和配置 Ansible上的指南。

<$>[注] 在继续之前,您需要先确保您的 Ansible 控制节点能够在您的 Ansible 主机(s)上连接和执行命令。

这个 Playbook 能做什么?

这个 Ansible 演示本提供了通过我们关于 [如何在 Ubuntu 18.04 上安装 Linux, Nginx, MySQL, PHP (LEMP 堆栈) 的指南中描述的程序手动运行的替代方案(https://andsky.com/tech/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-ubuntu-18-04)。

运行此播放簿将在您的 Ansible 主机上执行以下操作:

安裝「aptitude」,以 Ansible 為「apt」包管理器的替代方案。 2 安裝所需的 LEMP 套件 3 使用所提供的範本設定 Nginx 配置檔案 4 啟用新的 Nginx 配置並禁用預設套件 5 設定 MySQL 使用者 root 的密碼 6 刪除匿名 MySQL 帳戶和資料庫測試 7 設定 UFW 以允許配置端口上的 HTTP 流量 (80以預設)。( _8)8 使用所提供的範本設定 PHP 測試

一旦播放簿完成运行,您将有一个在 Nginx 上运行的Web PHP环境,基于您在配置变量中定义的选项。

如何使用这个 Playbook

我们需要做的第一件事是从 do-community/ansible-playbooks 存储库中获取 LEMP 播放簿及其依赖。

如果您之前在遵循不同的指南时克隆了此存储库,请访问现有的ansible-playbooks副本并运行一个git pull命令,以确保您更新了内容:

1[environment local]
2cd ~/ansible-playbooks
3git pull

如果这是你第一次使用Do-community/ansible-playbooks存储库,你应该开始将存储库克隆到你的主文件夹:

1[environment local]
2cd ~
3git clone https://github.com/do-community/ansible-playbooks.git
4cd ansible-playbooks

我们感兴趣的文件位于lemp_ubuntu1804文件夹中,其结构如下:

1lemp_ubuntu1804
2├── files
3   ├── info.php.j2
4   └── nginx.conf.j2
5├── vars
6   └── default.yml
7├── playbook.yml
8└── readme.md

以下是这些文件中的每一个是什么:

  • files/info.php.j2:用于在 Web 服务器的根 上设置 PHP 测试页面的模板文件* files/nginx.conf.j2:用于设置 Nginx 服务器的模板文件

导演

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

我们将编辑播放簿的变量文件,以自定义MySQL和Nginx的配置。访问lemp_ubuntu1804目录,并使用您所选择的命令行编辑器打开vars/default.yml文件:

1[environment local]
2cd lemp_ubuntu1804
3nano vars/default.yml

此文件包含一些需要您的注意的变量:

1[label vars/default.yml]
2[environment local]
3---
4mysql_root_password: "mysql_root_password"
5http_host: "your_domain"
6http_conf: "your_domain.conf"
7http_port: "80"

下列列表包含每个变量的简要解释,以及您可能想要如何更改它们:

  • mysql_root_password: MySQL 帐户 root 所需的密码
  • http_host:本网站服务器的主机名称或 IP 地址
  • http_conf:在 /etc/nginx/sites-available 中创建的配置文件名称,通常设置为主机或应用程序名称以便更容易识别
  • http_port: Nginx 端口将用于服务本网站。

一旦您完成了vars/default.yml中的变量更新,请保存并关闭此文件. 如果您使用了nano,请按CTRL + X,Y,然后按ENTER

您现在已经准备好在一个或多个服务器上运行此播放书了。大多数播放书已配置为在您的库存中的每个服务器上执行,默认情况下。我们可以使用‘l’flag 来确保只有一个服务器子集或单个服务器受到播放书的影响。

要只在「server1」上執行播放簿,以「sammy」方式連接,您可以使用以下命令:

1[environment local]
2ansible-playbook playbook.yml -l server1 -u sammy

你会得到类似于此的输出:

 1[secondary_label Output]
 2
 3PLAY [all] *****************************************************************************************************************************
 4
 5TASK [Gathering Facts] *****************************************************************************************************************
 6ok: [server1]
 7
 8TASK [Install Prerequisites] ***********************************************************************************************************
 9changed: [server1] => (item=aptitude)
10
11...
12
13TASK [UFW - Allow HTTP on port 80] *****************************************************************************************************
14changed: [server1]
15
16TASK [Sets Up PHP Info Page] ***********************************************************************************************************
17changed: [server1]
18
19RUNNING HANDLER [Reload Nginx] *********************************************************************************************************
20changed: [server1]
21
22PLAY RECAP *****************************************************************************************************************************
23server1         : ok=12 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

<$>[注] :有关如何运行 Ansible 播放本的更多信息,请参阅我们的 Ansible Cheat Sheet Guide

当播放簿完成运行时,进入您的 Web 浏览器并访问服务器的主机或 IP 地址,如播放簿变量配置,然后是 /info.php:

1http://server_host_or_IP/info.php

你会看到这样的页面:

phpinfo page

由于此页面包含有关您的PHP环境的敏感信息,建议您在完成设置后,通过运行rm -f /var/www/info.php命令将其从服务器中移除。

剧本内容

您可以在 lemp_ubuntu1804 文件夹中找到本教程中所示的 LEMP 服务器设置,在 DigitalOcean Community Playbooks 存储库中。

播放书的完整内容以及相关文件也包括在这里,以便您方便。

首选 / 默认.yml

Default.yml变量文件包含在播放簿任务中使用的值,例如MySQL root帐户的密码和在Nginx中配置的域名。

1[label vars/default.yml]
2[environment local]
3---
4mysql_root_password: "mysql_root_password"
5http_host: "your_domain"
6http_conf: "your_domain.conf"
7http_port: "80"

檔案/nginx.conf.j2

「nginx.conf.j2」文件是配置 Nginx Web 服务器的 Jinja 2 模板文件,该模板内使用的变量在「vars/default.yml」变量文件中定义。

 1[environment local]
 2[label files/nginx.conf.j2]
 3server {
 4       listen {{ http_port }};
 5       root /var/www/html;
 6       index index.php index.html index.htm index.nginx-debian.html;
 7       server_name {{ http_host }};
 8
 9       location / {
10               try_files $uri $uri/ =404;
11       }
12
13       location ~ \.php$ {
14               include snippets/fastcgi-php.conf;
15               fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
16       }
17
18       location ~ /\.ht {
19               deny all;
20       }
21}

檔案 / 資訊.php.j2

info.php.j2文件是另一个Jinja模板,用于在新配置的LEMP服务器的文档根中设置测试PHP脚本。

1[environment local]
2[label files/info.php.j2]
3<?php
4phpinfo();

图书馆.yml

playbook.yml文件定义了此设置中的所有任务,它从定义该设置的目标服务器组(所有)开始,然后它使用become: true来定义任务应该默认执行的特权升级(sudo)然后,它包括vars/default.yml变量文件来加载配置选项。

 1[label playbook.yml]
 2[environment local]
 3---
 4- hosts: all
 5  become: true
 6  vars_files:
 7   - vars/default.yml
 8
 9 tasks:
10   - name: Install Prerequisites
11     apt: name={{ item }} update_cache=yes state=latest force_apt_get=yes
12     loop: [ 'aptitude' ]
13
14   - name: Install LEMP Packages
15     apt: name={{ item }} update_cache=yes state=latest
16     loop: [ 'nginx', 'mysql-server', 'python3-pymysql', 'php-fpm', 'php-mysql' ]
17
18# Nginx Configuration
19
20   - name: Sets Nginx conf file
21     template:
22       src: "files/nginx.conf.j2"
23       dest: "/etc/nginx/sites-available/{{ http_conf }}"
24
25   - name: Enables new site
26     file:
27       src: "/etc/nginx/sites-available/{{ http_conf }}"
28       dest: "/etc/nginx/sites-enabled/{{ http_conf }}"
29       state: link
30     notify: Reload Nginx
31
32   - name: Removes "default" site
33     file:
34       path: "/etc/nginx/sites-enabled/default"
35       state: absent
36     notify: Reload Nginx
37
38# MySQL Configuration
39
40   - name: Sets the root password
41     mysql_user:
42       name: root
43       password: "{{ mysql_root_password }}"
44       login_unix_socket: /var/run/mysqld/mysqld.sock
45
46   - name: Removes all anonymous user accounts
47     mysql_user:
48       name: ''
49       host_all: yes
50       state: absent
51       login_user: root
52       login_password: "{{ mysql_root_password }}"
53
54   - name: Removes the MySQL test database
55     mysql_db:
56       name: test
57       state: absent
58       login_user: root
59       login_password: "{{ mysql_root_password }}"
60
61# UFW Configuration
62
63   - name: "UFW - Allow HTTP on port {{ http_port }}"
64     ufw:
65       rule: allow
66       port: "{{ http_port }}"
67       proto: tcp
68
69# Sets Up PHP Info Page
70
71   - name: Sets Up PHP Info Page
72     template:
73       src: "files/info.php.j2"
74       dest: "/var/www/html/info.php"
75
76# Handlers
77
78 handlers:
79   - name: Reload Nginx
80     service:
81       name: nginx
82       state: reloaded
83
84   - name: Restart Nginx
85     service:
86       name: nginx
87       state: restarted

您可以自由地修改这些文件,以便在您自己的工作流中最适合您的个人需求。

结论

在本指南中,我们使用 Ansible 来自动化在远程服务器上安装和设置 LEMP 环境的过程. 由于每个人在使用 MySQL 数据库和用户时通常都有不同的需求,我们建议您查看 官方 Ansible 文档 有关mysql_user Ansible 模块的更多信息和用例。

如果您想在本演示本中包含其他任务,以进一步定制服务器设置,请参阅我们介绍的 Ansible 指南 配置管理 101:编写 Ansible 演示本

Published At
Categories with 技术
comments powered by Disqus