第一个 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 的基本结构如下:
/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