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

介绍

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

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

本指南解释了如何使用Ansible来自动化我们在Ubuntu 18.04上安装Linux,Apache,MySQL和PHP(LAMP)指南中的步骤(https://andsky.com/tech/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-ubuntu-18-04)。LAMP堆栈是一组开源软件,通常一起安装,使服务器能够托管动态网站和Web应用程序。这个术语实际上是一个简称,代表了 Linux操作系统,与 Apache Web服务器。

前提条件

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

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

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

这个 Playbook 能做什么?

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

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

安裝「aptitude」,以 Ansible 為替代「apt」包管理器的選擇。 2 安裝所需的 LAMP 套件 3 創建新的 Apache 「VirtualHost」並為此設定專門的文件根 4 啟用新的「VirtualHost」 5 禁用預設的 Apache 網站,當變量「disable_default**」設定為「true」 6 設定 MySQL 使用者「root」的密碼 7 刪除匿名的 MySQL 帳戶和測試資料庫( _8)8 設定 UFW 以允許

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

如何使用这个 Playbook

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

如果您之前在遵循不同的指南时克隆了此存储库,请访问现有的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

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

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

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

  • files/info.php.j2: Web 服务器根上设置 PHP 测试页面的模板文件
  • files/apache.conf.j2: Apache VirtualHost 设置模板文件
  • vars/default.yml:用于自定义播放本设置的变量文件
  • playbook.yml:播放本文件,包含在远程服务器(s)上执行的任务。

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

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

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

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

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

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

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

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

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

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

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

 1[secondary_label Output]
 2
 3PLAY [all] *********************************************************************************************************
 4TASK [Gathering Facts] *********************************************************************************************************ok: [server1]
 5
 6TASK [Install prerequisites] *********************************************************************************************************ok: [server1] => (item=aptitude)
 7
 8...
 9
10TASK [UFW - Allow HTTP on port 80] *********************************************************************************************************
11changed: [server1]
12
13TASK [Sets Up PHP Info Page] *********************************************************************************************************
14changed: [server1]
15
16RUNNING HANDLER [Reload Apache] *********************************************************************************************************
17changed: [server1]
18
19RUNNING HANDLER [Restart Apache] *********************************************************************************************************
20changed: [server1]
21
22PLAY RECAP *********************************************************************************************************
23server1             : ok=15 changed=11 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命令将其从服务器中移除。

剧本内容

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

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

首选 / 默认.yml

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

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

檔案/apache.conf.j2

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

 1[environment local]
 2[label files/apache.conf.j2]
 3<VirtualHost *:{{ http_port }}>
 4   ServerAdmin webmaster@localhost
 5   ServerName {{ http_host }}
 6   ServerAlias www.{{ http_host }}
 7   DocumentRoot /var/www/{{ http_host }}
 8   ErrorLog ${APACHE_LOG_DIR}/error.log
 9   CustomLog ${APACHE_LOG_DIR}/access.log combined
10
11   <Directory /var/www/{{ http_host }}>
12         Options -Indexes
13   </Directory>
14
15   <IfModule mod_dir.c>
16       DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
17   </IfModule>
18
19</VirtualHost>

檔案 / 資訊.php.j2

info.php.j2文件是另一个Jinja模板,用于在新配置的LAMP服务器的文档根中设置测试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---
 5- hosts: all
 6  become: true
 7  vars_files:
 8    - vars/default.yml
 9
10  tasks:
11    - name: Install prerequisites
12      apt: name={{ item }} update_cache=yes state=latest force_apt_get=yes
13      loop: [ 'aptitude' ]
14
15  #Apache Configuration
16    - name: Install LAMP Packages
17      apt: name={{ item }} update_cache=yes state=latest
18      loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ]
19
20    - name: Create document root
21      file:
22        path: "/var/www/{{ http_host }}"
23        state: directory
24        owner: "{{ app_user }}"
25        mode: '0755'
26
27    - name: Set up Apache virtualhost
28      template:
29        src: "files/apache.conf.j2"
30        dest: "/etc/apache2/sites-available/{{ http_conf }}"
31      notify: Reload Apache
32
33    - name: Enable new site
34      shell: /usr/sbin/a2ensite {{ http_conf }}
35      notify: Reload Apache
36
37    - name: Disable default Apache site
38      shell: /usr/sbin/a2dissite 000-default.conf
39      when: disable_default
40      notify: Reload Apache
41
42  # MySQL Configuration
43    - name: Sets the root password
44      mysql_user:
45        name: root
46        password: "{{ mysql_root_password }}"
47        login_unix_socket: /var/run/mysqld/mysqld.sock
48
49    - name: Removes all anonymous user accounts
50      mysql_user:
51        name: ''
52        host_all: yes
53        state: absent
54        login_user: root
55        login_password: "{{ mysql_root_password }}"
56
57    - name: Removes the MySQL test database
58      mysql_db:
59        name: test
60        state: absent
61        login_user: root
62        login_password: "{{ mysql_root_password }}"
63
64  # UFW Configuration
65    - name: "UFW - Allow HTTP on port {{ http_port }}"
66      ufw:
67        rule: allow
68        port: "{{ http_port }}"
69        proto: tcp
70
71  # PHP Info Page
72    - name: Sets Up PHP Info Page
73      template:
74        src: "files/info.php.j2"
75        dest: "/var/www/{{ http_host }}/info.php"
76
77  handlers:
78    - name: Reload Apache
79      service:
80        name: apache2
81        state: reloaded
82
83    - name: Restart Apache
84      service:
85        name: apache2
86        state: restarted

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

结论

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

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

Published At
Categories with 技术
comments powered by Disqus