第一个 IaC:使用 Ansible 构建 LAMP 环境

您好,我是竹轮大名神,去年刚毕业就加入了这家公司。

时光飞逝。

我记得去年八月左右,我曾对写博客这件事充满热情。

因此,我使用 Ansible 设置了一个 LAMP 环境,在本文中我将对其进行简要介绍。

我目前还没有深入的了解,所以我想粗略地概述一下如果你这样做,Ansible 将如何工作。

让我们运行 Ansible

前提

环境

Virtualbox:版本 7.0.20

Vagrant:版本 2.4.1

Vagrant box:AlmaLinux 9

Ansible:版本 2.14.17

 

Ansible 是一种配置管理工具,可用于构建虚拟环境以及 AWS 等云环境。

这次,我们将准备三个虚拟环境,一个作为 Ansible 执行服务器,另外两个作为服务器来搭建 LAMP 环境。

有关安装方法和 Ansible 的更多信息,请参阅一位资深人士撰写的文章。

使用 Ansible 开始使用基础设施即代码(简介和安装)

配置 Ansible

Ansible 的基本结构如下:

/etc/ansible └── roles ├── hosts ├── playbook.yml └── ansible.cfg
主持人
  • 名称:库存文件
  • 角色:定义 Ansible 将管理的目标主机。
  • 内容:您可以对主机名和 IP 地址进行分组和描述。您还可以按类别对主机进行分类,例如 Web 服务器和数据库服务器。在本例中,我们将描述上面提到的 Ansible 兼容服务器的 IP 地址。
playbook.yml
  • 名称:剧本文件
  • 角色:定义具体操作或任务。
  • 内容:定义如何在特定主机上执行一组任务。它通常包含具体指令,例如要安装的软件包和要启动的服务。您可以在此处编写部署 LAMP 环境的指令。
ansible.cfg
  • 角色:控制 Ansible 整体行为的 Ansible 配置文件。
  • 内容:您可以指定各种选项,例如库存路径、远程用户、SSH 密钥路径、是否检查主机密钥等。这次我们不涉及这些内容。

基本上,只要上述三个文件存在,Ansible 就能正常工作。

角色目录稍后会进行解释。

如何编写库存文件

在本节中,我们将回顾如何编写库存文件。

这次很简单,所以我们很快就能完成。

[all:vars] ansible_user=vagrant ansible_password=vagrant [test_ansibleclient] ansibleclients_host=192.168.33.10 [ansibleclients] ansibleclients_host1 ansible_host=192.168.33.30 ansibleclients_host2 ansible_host=192.168.33.40

库存文件按上述格式编写。

  • 组定义:主机[XXX]。我们这次要定位的两台服务器 ansibleclients 分组
  • 组变量`:vars`部分定义适用于该组中所有主机的变量。在本例中,我们输入了用户名和密码。此外,我们`[all:vars]` ,以便为所有主机设置相同的设置。

如何编写剧本

基本战术手册结构如下:

  • 主机:在清单文件中指定组定义并应用后续处理。
  • vars:你可以定义变量。如果没有也没关系。
  • 任务:描述要应用于目标服务器的流程。此处描述的流程将按从上到下的顺序执行。这是剧本的核心部分。
  • 处理程序:您可以将处理程序编写在与任务不同的独立帧中。当您想要设置处理程序执行的条件时,例如当○○的结果为▼▼时,可以使用处理程序。但这并非必需。

以上四组被视为1 场比赛

多个剧本的集合构成一个剧本文件

 

现在我们来看一下具体的处理过程。

--- #hosts - hosts: ansibleclients become: yes #tasks tasks: - name: install Apache yum: name: httpd state: latest

它是用 YAML 格式编写的,所以非常容易理解。即使你没有任何先验知识,也能通过阅读它明白你想做什么。

▼#hosts 部分

  • hosts 指定上一节中描述的清单文件的目标主机或组。
  • 成为指定任务是否应以管理员权限运行。

▼#任务部分

  • 任务描述要执行的任务。
  • 名称请输入任务名称。
  • yum 指定要使用的模块
  • name 指定要安装的软件包的名称。
  • state 指定软件包的状态。

换句话说,这个过程涉及使用管理员权限安装最新版本的 Apache。

 

您还可以通过更改所使用的模块来获取密钥并更改权限。

▼获取钥匙

- name: 安装 MySQL GPG 密钥 rpm_key: state: present key: https://repo.mysql.com/RPM-GPG-KEY-mysql-2023

▼更改权限和所有权

- name: chmod 和 chown HTML 和 PHP 文件: path: "/var/www/html/{{ item }}" owner: apache group: apache mode: '0644' loop: - test.html - test.php

 

Ansible 官方列出了可配合使用的模块列表。

https://docs.ansible.com/ansible/2.9_ja/modules/modules_by_category.html#modules-by-category

您可以参考此流程编写流程图。

……我很想这么说,但是这类模块太多了,我觉得最好还是搜索“Ansible 模块”或类似内容,然后参考介绍各种模块的博客。

我们来试一试。

实际机器检查

现在让我们实际运行 Ansible。

我使用的剧本文件如下:

- hosts: ansibleclients become: true tasks: - name: install httpd yum: name=httpd state=latest - name: start / enable Apache service: name=httpd state=started enabled=yes - name: Add MySQL repository get_url: url: https://repo.mysql.com/mysql80-community-release-el9-5.noarch.rpm dest: /tmp/mysql80-community-release-el9-5.noarch.rpm - name: Install MySQL GPG key rpm_key: state: present key: https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 yum: name: /tmp/mysql80-community-release-el9-5.noarch.rpm state: present - name: Install MySQL server yum: name: mysql-community-server state: latest - name: Start MySQL service service: name: mysqld state: started enabled: yes - name: Import Remi GPG 密钥 rpm_key: 状态: 存在 密钥: https://rpms.remirepo.net/RPM-GPG-KEY-remi2021 - 名称: 安装 Remi 仓库 yum: 名称: https://rpms.remirepo.net/enterprise/remi-release-9.rpm 状态: 存在 - 名称: 安装 PHP 及相关软件包 yum: 名称: - php - php-devel - php-mbstring - php-mysqli - php-gd 状态: 存在 通知: - httpd restart # 复制 HTML 和 PHP 脚本用于测试 - 名称: html 复制 复制: 源: /etc/ansible/test.html 目标: /var/www/html - 名称: PHP 复制 复制: 源: /etc/ansible/test.php 目标: /var/www/html - 名称: 更改 HTML 和 PHP 文件的权限和所有者 文件: 路径: "/var/www/html/{{ item }}" 所有者: apache 组: apache 模式: '0644' 循环: - test.html - test.php 处理程序: - 名称:httpd 重启服务:名称=httpd 状态=已重启

运行 Ansible 时,如果无法建立 ssh 连接,将会发生错误,因此请务必提前使用 keyscan 注册它。

ssh-keyscan XXX.XXX.XXX.XXX /root/.ssh/known_hosts

以下是运行该剧本的命令:

ansible-playbook /您的剧本路径

如果成功完成,将输出以下结果:

回放结果 ************************************************************************************************************************************************************************************************* ansibleclients_host1 : ok=15 changed=14 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ansibleclients_host2 : ok=16 changed=14 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

如果失败和不可达的数量均为 0,则没有问题。

剩下的就是检查测试用的 HTML 和 PHP 脚本是否有效,以及是否可以登录 MySQL。

将流程划分为多个目录

现在,回顾上一节中的操作手册,你们中的一些人可能认为,将所有内容合并到一个文件中会降低灵活性。

有些情况下,你可能想要安装 Apache,但不需要 MySQL。

但是创建多个战术手册很麻烦……

当然,对于像您这样的人,有办法将处理过程分成更小的部分。

按角色划分处理流程

我们将使用角色,这将在 Ansible 配置章节的后面部分进行介绍。

通过使用角色,您可以按如下所示划分剧本的处理过程。

角色 └──httpd_install └──任务 └──main.yml └──mysqld_install └──任务 └──main.yml └──php_install └──任务 └──main.yml └──处理程序 └──main.yml └──remi_repo └──任务 └──main.yml

在角色下为每个进程创建一个目录,然后在这些目录下创建任务和处理程序等目录。

最后,在 main.yml 中编写实际的处理代码。

以下是 /roles/httpd_install/tasks/main.yml 的处理内容。

--- - name: 安装 httpd yum: name=httpd state=latest - name: 启动/启用 Apache service: name=httpd state=started enabled=yes

然后,通过编写如下所示的剧本,您可以调整要应用的处理过程。

--- - name: select roles hosts: ansibleclient3 remote_user: vagrant become: yes roles: - httpd_install - mysqld_install #- remi_repo #- php_install

这样一来,httpd 和 MySQL 进程将会生效,但其他被注释掉的进程将不会生效。

使用角色可以让你比创建单一的行动手册更灵活、更易于管理。

您可以一次性创建所有剧本,但建议您有意识地将它们按角色划分,以便以后可以重复使用。

概括

它怎么样?

我最近才开始使用 Ansible,所以还有很多东西我不明白,但是 Ansible 非常简单,即使像我这样的人也能使用它。

为什么不尝试一下,就像出门散步一样轻松随意呢?

感谢您观看至结尾。

如果您觉得这篇文章有用,请点击【点赞】!
4
加载中...
4票,平均分:1.00/14
455
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

大名神竹轮

它会融化
并冷却。
保持合适的温度。