服务器自动化是一种以高效且精通技术的方式管理和监控服务器的安全且可靠的过程。与由专门专家团队控制的数据中心管理服务器的传统方式不同,所有服务器都使用自动化进行管理。因此,人为错误被降至最低。
像 Ansible, Puppet, Terraform 等配置管理工具,通常用于自动化服务器。这些工具通过为新服务器建立标准程序来使用自动化设置服务器,同时消除手动操作时可能出现的错误。
Ansible 是一个强大的开源项目。它灵活、易于使用,并且具有最简化的架构。使用 Ansible playbook 不需要编程背景,也不需要在节点上安装软件。最重要的是,它具有出色的功能,可以编写脚本并简化自动化。
在本指南中,我们将 引导您完成在 Ubuntu 20.04 上使用 Ansible 安装和配置 LAMP 的步骤.
前提条件
要学习本教程,您需要:
- 安装 Ubuntu 在您的系统上。
- 一个或多个 Ansible 主机:最初必须设置一个或多个运行最新 Ubuntu 的远程 Ansible 主机。请按照教程 使用 Ansible 和 Ubuntu 20.04 自动化服务器设置 进行设置。
- 一个 Ansible 控制节点:一台安装并配置了 Ansible 的 Ubuntu 机器,并使用 SSH 密钥:
-
- 控制节点必须具有 具有 sudo 特权的用户 且防火墙处于 开启.
- 如果您在设置 Ansible 时需要帮助,请查看关于 在 Ubuntu 20.04 上安装和配置 Ansible.
Ansible Playbook 的目的是什么?
此 Ansible playbook 是运行我们指南中概述的步骤的另一种方法 LAMP 栈设置 – Linux Apache MySQL PHP.
运行 Ansible playbook 将在您的 Ansible 主机上执行以下操作:
-
安装 aptitude,这是 apt 包管理器,这是 Ansible 首选的。
-
安装所有必要的 LAMP 包。
-
创建一个新的 Apache VirtualHost 并配置专用的文档根目录。
-
开启 开启 新的 VirtualHost.
-
关闭 关闭 默认的 Apache 网站,即设置 disable_default 变量为 true.
-
为 MySQL root 用户选择密码。
-
删除匿名 MySQL 帐户和测试数据库。
-
设置 UFW 以允许配置端口上的 HTTP 流量,默认值为 80.
-
设置 PHP 测试脚本。
Ansible playbook 运行完成后,您将看到一个根据我们设置的配置在 Apache 之上运行的 Web PHP 环境。
使用 Ansible Playbook
首先,从 do-community/ansible-playbooks 仓库获取 LAMP playbook 及其依赖项。接下来,将带有 LAMP playbook 的仓库克隆到 Ansible 控制节点内的本地文件夹中。
运行 git pull 命令,以确保您可以访问我们将在本教程中使用的正确内容:
|
1 2 |
cd ~/ansible-playbooks git pull |
如果您是第一次使用 do-community/ansible-playbooks 仓库,请考虑将该仓库克隆到您的主文件夹中:
|
1 2 3 |
cd ~ git clone https://github.com/do-community/ansible-playbooks.git cd ansible-playbooks |
转到 lamp_ubuntu2004 文件夹,您将看到以下结构:
|
1 2 3 4 5 6 7 8 |
lamp_ubuntu2004 ├── files │ ├── apache.conf.j2 │ └── info.php.j2 ├── vars │ └── default.yml ├── playbook.yml └── readme.md |
以下是这些文件含义的概述:
-
files/info.php.j2:这是一个模板文件,您可以在其中在 Web 服务器的根目录下设置 PHP 测试页面。
-
files/apache.conf.j2:另一个用于设置 Apache VirtualHost 的模板文件。
-
vars/default.yml:这是一个用于自定义 playbook 设置的变量文件。
-
playbook.yml:此文件包含要在远程服务器上执行的任务的所有内容。
-
readme.md: 包含有关此 playbook 信息的自读文件。
让我们通过修改 playbook 的变量文件来定制 MySQL 和 Apache 配置。导航到 lamp_ubuntu2004 目录并打开 vars/default.yml 文件,使用 nano 编辑器:
|
1 2 |
cd lamp_ubuntu2004 nano vars/default.yml |
打开 vars/default.yml 文件后,将显示需要修改的变量列表:
|
1 2 3 4 5 6 7 |
--- mysql_root_password: "mysql_root_password" app_user: "justin" http_host: "your_domain" http_conf: "your_domain.conf" http_port: "80" disable_default: true |
让我们详细了解每个变量:
-
mysql_root_password: 存储 root MySQL 账户的密码。
-
app_user: 它是 Ansible 主机上的远程非 root 用户,作为应用程序文件的所有者。
-
http_host: 显示您的域名。
-
http_conf: 显示在 Apache 中创建的配置文件名称。
-
http_port: 它是此虚拟主机的 HTTP 端口,并且 80 是默认值。
-
disable_default: 用于撤销 Apache 自带的默认选项。
然后,保存并关闭 vars/default.yml 文件。
一旦完成所有设置,我们就可以在服务器上运行此 playbook 了。默认情况下,playbook 中的大多数服务器都配置为在清单中的每台服务器上执行。让我们使用 -l 标志,以仅影响受 playbook 影响的单个服务器或选定的组子集。或者,我们可以使用 -u 标志,以详细查看正在连接哪个远程服务器并在远程主机上执行。
让我们在一台服务器上执行 playbook server1 并使用一个用户进行连接,如 justin:
|
1 |
ansible-playbook playbook.yml -l server1 -u justin |
您将获得类似于以下内容的输出:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
PLAY [all] ********************************************************************************************************* TASK [Gathering Facts] *********************************************************************************************************ok: [server1] TASK [Install prerequisites] *********************************************************************************************************ok: [server1] => (item=aptitude) ... TASK [UFW - Allow HTTP on port 80] ********************************************************************************************************* changed: [server1] TASK [Sets Up PHP Info Page] ********************************************************************************************************* changed: [server1] RUNNING HANDLER [Reload Apache] ********************************************************************************************************* changed: [server1] RUNNING HANDLER [Restart Apache] ********************************************************************************************************* changed: [server1] PLAY RECAP ********************************************************************************************************* server1 : ok=15 changed=11 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
一旦看到 playbook 运行完成,请导航到您的 Web 浏览器并访问服务器的主机。不要忘记附加 /info.php 在 IP 的末尾:
|
1 |
http://server_host_or_IP/info.php |
点击此 URL 后,您将看到如下页面:
|
警告: 显示的页面包含有关您的 PHP 环境的敏感信息。因此,建议使用以下命令从服务器中删除您的个人信息: rm -f /var/www/info.php |
Playbook 中包含什么?
接下来,让我们了解一下在 中使用的文件的含义和重要性ansible-playbook 内容:
-
vars/default.yml
该 default.yml 变量文件包含 MySQL 的域名和密码 root 账户。这些是用于 中的默认值ansible-playbook 任务:
|
1 2 3 4 5 6 7 |
--- mysql_root_password: "mysql_root_password" app_user: "justin" http_host: "your_domain" http_conf: "your_domain.conf" http_port: "80" disable_default: true |
- files/apache.conf.j2
该 apache.conf.j2 文件是一个 Jinja 2 模板文件,用于配置新的 Apache VirtualHost。此模板中使用的变量必须在 vars/default.yml 变量文件:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<VirtualHost *:{{ http_port }}> ServerAdmin webmaster@localhost ServerName {{ http_host }} ServerAlias www.{{ http_host }} DocumentRoot /var/www/{{ http_host }} ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory /var/www/{{ http_host }}> Options -Indexes </Directory> <IfModule mod_dir.c> DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm </IfModule> </VirtualHost> |
- files/info.php.j2
类似于 files/apache.conf.j2, info.php.j2 文件也是一个 Jinja 模板。我们使用此文件在新建配置的 LAMP 服务器的文档根目录中设置一个测试 PHP 脚本:
|
1 2 |
<?php phpinfo(); |
-
playbook.yml
该 playbook.yml 文件是定义此设置中所有任务的地方。在此文件中,配置了所有的 LAMP 栈。它首先定义目标服务器组,并将其设置为 all。此外,它将 become 值设为 true ( become: true),并定义了所有需要执行的任务。接下来, yaml 文件包含默认文件,即 vars/default.yml 变量文件,以加载配置选项:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
--- - hosts: all become: true vars_files: - vars/default.yml tasks: - name: 安装 先决条件 apt: name={{ item }} update_cache=yes state=latest force_apt_get=yes loop: [ 'aptitude' ] #Apache 配置 - name: 安装 LAMP 软件包 apt: name={{ item }} update_cache=yes state=latest loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ] - name: 创建 文档 根目录 file: path: "/var/www/{{ http_host }}" state: directory owner: "{{ app_user }}" mode: '0755' - name: 设置 up Apache 虚拟主机 template: src: "files/apache.conf.j2" dest: "/etc/apache2/sites-available/{{ http_conf }}" notify: 重新加载 Apache - name: 启用 新 站点 shell: /usr/sbin/a2ensite {{ http_conf }} notify: 重新加载 Apache - name: 禁用 默认 Apache 站点 shell: /usr/sbin/a2dissite 000-default.conf when: disable_default notify: 重新加载 Apache # MySQL 配置 - name: 设置 the root 密码 mysql_user: name: root password: "{{ mysql_root_password }}" login_unix_socket: /var/run/mysqld/mysqld.sock - name: 删除 所有 匿名 用户 帐户 mysql_user: name: '' host_all: yes state: absent login_user: root login_password: "{{ mysql_root_password }}" - name: 删除 the MySQL 测试 数据库 mysql_db: name: test state: absent login_user: root login_password: "{{ mysql_root_password }}" # UFW 配置 - name: "UFW - 允许端口 {{ http_port }} 上的 HTTP" ufw: rule: allow port: "{{ http_port }}" proto: tcp # PHP 信息页面 - name: 设置 Up PHP 信息 页面 template: src: "files/info.php.j2" dest: "/var/www/{{ http_host }}/info.php" handlers: - name: 重新加载 Apache service: name: apache2 state: reloaded - name: 重启 Apache service: name: apache2 state: restarted |
您可以根据项目的需求和要求修改这些文件。
结论
在本教程中,我们介绍了使用 Ansible 在远程服务器上安装和配置 LAMP 的步骤。您还可以尝试许多其他自定义选项。例如,使用 Ansible 官方文档 并使用 mysql_user(来自 Ansible 模块)的案例是提升技能的绝佳方式。此外,请按照本指南中讨论的步骤,使用其他配置管理工具和操作系统练习自动化,以增加难度。
您是 LAMP 栈的新手并想深入探讨这个话题吗?请在我们的博客上探索以下教程:
- 如何在 Ubuntu 20.04 上使用 LAMP 安装 WordPress
- 如何在 Centos-7 上安装 Linux, Apache, MySQL, PHP (LAMP) 堆栈
- 如何在 Ubuntu 20.04 上安装 LEMP 堆栈 Linux Nginx MySQL PHP
祝您使用愉快!

评论
暂无评论。发表第一条评论吧。