如何在Ubuntu18.04上使用Ansible安装和设置LAMP

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

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

本指南介绍了如何使用 Ansible 自动执行我们关于 如何在 Ubuntu 18.04 上安装 Linux、Apache、MySQL 和 PHP (LAMP) 的指南中包含的步骤。 “LAMP”堆栈是一组开源软件,通常安装在一起以使服务器能够托管动态网站和 Web 应用程序。 这个术语实际上是一个首字母缩略词,代表 Linux 操作系统,带有 Apache 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、Apache、MySQL 和 PHP (LAMP) 的指南中概述的过程。

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

  1. 安装 aptitude,这是 Ansible 首选的 apt 包管理器的替代方案。
  2. 安装所需的 LAMP 包。
  3. 创建一个新的 Apache VirtualHost 并为此设置一个专用的文档根目录。
  4. 启用新的 VirtualHost
  5. disable_default 变量设置为 true 时,禁用默认的 Apache 网站。
  6. 设置 MySQL root 用户的密码。
  7. 删除匿名 MySQL 帐户和测试数据库。
  8. 设置 UFW 以允许配置端口上的 HTTP 流量(默认为 80)。
  9. 使用提供的模板设置 PHP 测试脚本。

一旦 playbook 完成运行,您将拥有一个基于您在配置变量中定义的选项在 Apache 之上运行的 Web PHP 环境。

如何使用本手册

我们需要做的第一件事是从 do-community/ansible-playbooks 存储库中获取 LAMP 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

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

lamp_ubuntu1804
├── 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.yml:剧本文件,包含要在远程服务器上执行的任务。
  • readme.md:包含有关此剧本的信息的文本文件。

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

cd lamp_ubuntu1804
nano vars/default.yml

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

变量/default.yml

---
mysql_root_password: "mysql_root_password"
app_user: "sammy"
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"
disable_default: true

以下列表包含每个变量的简要说明以及您可能希望如何更改它们:

  • mysql_root_passwordroot MySQL 帐户所需的密码。
  • app_user:Ansible 主机上的远程非 root 用户,将被设置为应用程序文件的所有者。
  • http_host:您的域名。
  • http_conf:将在 Apache 中创建的配置文件的名称。
  • http_port:此虚拟主机的 HTTP 端口,其中 80 是默认值。
  • disable_default:是否禁用Apache自带的默认网站。

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

您现在已准备好在一台或多台服务器上运行此 playbook。 默认情况下,大多数剧本都配置为在库存中的每台服务器上执行。 我们可以使用 -l 标志来确保只有一部分服务器或单个服务器受到剧本的影响。 我们还可以使用 -u 标志来指定我们使用远程服务器上的哪个用户来连接和执行远程主机上的 playbook 命令。

要仅在 server1 上执行 playbook,连接为 sammy,可以使用以下命令:

ansible-playbook playbook.yml -l server1 -u sammy

你会得到类似这样的输出:

Output
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   

注意:有关如何运行 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 存储库中的 lamp_ubuntu1804 文件夹中找到本教程中介绍的 LAMP 服务器设置。 要直接复制或下载脚本内容,请单击每个脚本顶部的 Raw 按钮。

为方便起见,此处还包含了剧本的全部内容及其相关文件。

变量/default.yml

default.yml 变量文件包含将在 playbook 任务中使用的值,例如 MySQL root 帐户的密码和要在 Apache 中配置的域名。

变量/default.yml

---
mysql_root_password: "mysql_root_password"
app_user: "sammy"
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"
disable_default: true

文件/apache.conf.j2

apache.conf.j2 文件是一个 Jinja 2 模板文件,用于配置新的 Apache VirtualHost。 此模板中使用的变量在 vars/default.yml 变量文件中定义。

文件/apache.conf.j2

<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>

文件/info.php.j2

info.php.j2 文件是另一个 Jinja 模板,用于在新配置的 LAMP 服务器的文档根目录中设置测试 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' ]

  #Apache Configuration
    - name: Install LAMP Packages
      apt: name={{ item }} update_cache=yes state=latest
      loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ]

    - name: Create document root
      file:
        path: "/var/www/{{ http_host }}"
        state: directory
        owner: "{{ app_user }}"
        mode: '0755'

    - name: Set up Apache virtualhost
      template:
        src: "files/apache.conf.j2"
        dest: "/etc/apache2/sites-available/{{ http_conf }}"
      notify: Reload Apache

    - name: Enable new site
      shell: /usr/sbin/a2ensite {{ http_conf }}
      notify: Reload Apache

    - name: Disable default Apache site
      shell: /usr/sbin/a2dissite 000-default.conf
      when: disable_default
      notify: Reload Apache

  # 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

  # PHP Info Page
    - name: Sets Up PHP Info Page
      template:
        src: "files/info.php.j2"
        dest: "/var/www/{{ http_host }}/info.php"

  handlers:
    - name: Reload Apache
      service:
        name: apache2
        state: reloaded

    - name: Restart Apache
      service:
        name: apache2
        state: restarted

随意修改这些文件以最适合您自己工作流程中的个人需求。

结论

在本指南中,我们使用 Ansible 自动执行在远程服务器上安装和设置 LAMP 环境的过程。 因为每个人在使用 MySQL 数据库和用户时通常有不同的需求,我们鼓励您查看 官方 Ansible 文档 以获取 mysql_user Ansible 模块的更多信息和用例。

如果您想在此 playbook 中包含其他任务以进一步自定义您的服务器设置,请参阅我们的 Ansible 入门指南 配置管理 101:编写 Ansible Playbooks