在公共云部署Linux及Ansible自动化应用指南
1. 在AWS上部署Ubuntu 20.04实例
在AWS上部署Ubuntu 20.04实例,需要使用AWS CLI收集所需的账户资源信息,然后利用这些信息在AWS US - EAST - 1区域配置并启动实例。同时,会在启动过程中加入Bash脚本,让Ubuntu安装Apache Web服务器,并将网页复制到Apache的Web根目录。
1.1 准备工作
在启动实例之前,需要以下信息:
- Ubuntu Amazon Machine Image (AMI) ID
- EC2实例类型
- 账户内用于启动实例的网络子网
此外,还需要创建一个安全组,阻止除HTTP和SSH请求之外的所有传入流量。
1.2 获取AMI ID
虽然可以使用AWS CLI检索AMI信息,但操作并不容易。因此,可前往管理控制台,从EC2仪表板中选择“启动实例”,在官方支持的AMI列表中找到Ubuntu 20.04 AMI,并复制64位x86架构对应的AMI ID。
1.3 选择实例类型
EC2实例旨在模拟各种硬件配置的性能,不同的实例类型在内存、虚拟CPU数量和网络性能等方面有所不同,性能越好,每小时的费用也越高。可以使用以下CLI命令列出当前区域可用的实例类型:
$ aws pricing get-attribute-values \
--service-code AmazonEC2 \
--attribute-name instanceType
这里选择
t2.micro
实例类型,它能以较低的成本(每年可能低至40美元)运行几个使用量相对较低的网站。如果AWS账户处于第一年,还可以免费使用
t2.micro
实例。
1.4 选择网络子网
使用以下命令列出当前区域的子网,只需其中一个子网的
SubnetId
即可:
$ aws ec2 describe-subnets
1.5 创建安全组
创建一个名为
DemoSG
的安全组:
$ aws ec2 create-security-group \
> --group-name DemoSG \
> --description "Security Group for EC2 instances to allow ports 22, 80 and 443"
由于该安全组目前没有规则,默认会阻止所有传入流量。因此,需要开放端口22(SSH)、80(HTTP)和443(HTTPS):
$ aws ec2 authorize-security-group-ingress \
--group-name DemoSG \
--protocol tcp \
--port 22 \
--cidr 172.54.125.8/32
$ aws ec2 authorize-security-group-ingress \
--group-name DemoSG \
--protocol tcp \
--port 80 \
--cidr 0.0.0.0/0
$ aws ec2 authorize-security-group-ingress \
--group-name DemoSG \
--protocol tcp \
--port 443 \
--cidr 0.0.0.0/0
最后,使用以下命令获取安全组的
GroupId
:
aws ec2 describe-security-groups --group-names DemoSG
1.6 创建SSH密钥对
如果需要远程登录实例,需要在本地机器上创建一个在EC2系统中生成的SSH密钥对:
$ aws ec2 create-key-pair –key-name myname
注意并妥善保存输出结果,将
-----BEGIN RSA PRIVATE KEY
和
-----END RSA PRIVATE KEY-----
之间的内容复制到名为
myname.pem
的文件中,并赋予其400权限:
$ chmod 400 myname.pem
1.7 启动实例
将上述获取的值填入
run-instances
命令中,该命令包含
--user-data
参数,可用于在启动时包含并运行Bash脚本。以下是脚本示例:
#!/bin/bash
apt-get update
apt-get -y install apache2
echo "Hello world!" > /var/www/html/index.html
启动实例的命令如下:
$ aws ec2 run-instances \
--image-id ami-068663a3c619dd892 \
--count 1 \
--instance-type t2.micro \
--key-name MyKeyPair \
--security-group-ids sg-0138a14f815d6d033 \
--subnet-id subnet-52d6117c \
--user-data file://my_script.sh \
--tag-specifications \
'ResourceType=instance,Tags=[{Key=server,Value=web}]'
如果操作成功,会看到包含实例ID的输出。等待EC2完全启动实例后,使用以下命令获取实例的公共IP地址:
$ aws ec2 describe-instances
可以使用该IP地址通过SSH连接到实例:
$ ssh -i MyKeyPair.pem ubuntu@52.91.1.233
也可以将IP地址粘贴到浏览器中访问新的网站。
以下是整个部署流程的mermaid流程图:
graph LR
A[准备工作] --> B[获取AMI ID]
B --> C[选择实例类型]
C --> D[选择网络子网]
D --> E[创建安全组]
E --> F[创建SSH密钥对]
F --> G[启动实例]
G --> H[获取公共IP地址]
H --> I[SSH连接实例/访问网站]
2. Ansible自动化应用
手动配置单个Linux系统在大规模管理时扩展性不佳,而Ansible可以将Linux管理的思维从关注单个系统转变为关注系统组,将节点的配置从每台机器转移到控制节点,使用Ansible剧本通过网络在其他机器上运行任务。
2.1 Ansible基础
Ansible由以下部分组成:
- 自动化语言:描述要执行的任务以达到特定状态,这些任务收集在剧本中。
- 自动化引擎:用于运行剧本。
- 接口:用于管理和保护剧本及其他自动化组件,通过命令和RESTful API实现。
Ansible通过以下方式配置主机系统:
- 简单功能配置:将清单和剧本创建为纯文本文件,通过模块操作Linux组件,无需编码经验。
- 设置期望结果:描述定义节点上功能状态的资源,如系统服务运行、网络接口设置特定地址或创建特定大小的磁盘分区。如果功能状态发生变化,可以重新运行剧本来恢复节点的预期状态。
- 安全外壳(SSH)连接:默认情况下,每个主机节点必须运行SSH服务,配置为允许Ansible从控制节点进行通信。基于密钥的普通用户账户认证,在需要提升为root权限时可使用sudo。
2.2 Ansible高级应用
掌握Ansible的基本原理后,可以进行一系列高级复杂的活动:
- 基础设施供应:使用Ansible可以为应用程序提供所需的基础设施,如在裸机或虚拟机管理程序上安装操作系统、设置存储设备或配置网络设备。
- 应用程序部署:通过描述应用程序的期望状态,Ansible不仅可以使用任务在多个节点和设备上部署应用程序集,还可以在功能出现故障或意外更改时重新运行剧本来恢复应用程序的期望状态。
- 网络和存储管理:可以使用Ansible自动化通常手动完成的网络基础设施配置、测试、验证和增强任务。
- 云环境管理:Ansible提供了将基础设施和应用程序部署到云环境的工具,如针对亚马逊网络服务(AWS)有大约200个Ansible模块可用于管理基础设施和应用程序,还有适用于阿里巴巴、Azure、Google等云环境的模块。
2.3 Ansible组件探索
当运行剧本时,它会作用于一个或多个目标主机系统(由清单表示),并执行称为“plays”的项目。每个play包含一个或多个任务,任务调用模块按顺序执行。
以下是Ansible组件的详细介绍:
|组件|说明|
|----|----|
|清单(Inventories)|将需要管理的主机系统(节点)收集到清单中,可以将具有相似特征的机器分组,如位置相似、提供相同服务或处于特定流程阶段。清单可以是静态服务器列表、动态服务器列表,也可以使用变量为一组主机分配属性。清单可以是简单的文本文件,也可以通过清单脚本实现。|
|剧本(Playbooks)|以YAML格式创建的文件,描述事物的最终状态,可用于安装软件、配置应用程序或启动服务。剧本具有可重用性,许多人会将其置于版本控制之下。|
|Play|剧本中的一个或多个play,每个play有目标(如主机标识符)、远程用户、是否需要提升权限等信息,之后是一个或多个任务。|
|任务(Tasks)|每个任务运行一个或多个模块,提供将运行的模块与相关参数和返回值关联的方式。|
|模块(Modules)|目前有数百个Ansible模块,并且不断有新模块创建。模块通过检查提供的参数指示的预期状态,确保达到请求的状态。例如,
apt
模块可管理Debian软件包和存储库,
mysql_db
模块可添加或删除MySQL数据库,
ipmi_power
模块可检查具有IPMI接口的计算机状态。|
以下是Ansible组件关系的mermaid流程图:
graph LR
A[剧本(Playbooks)] --> B[Play]
B --> C[任务(Tasks)]
C --> D[模块(Modules)]
E[清单(Inventories)] --> B
在公共云部署Linux及Ansible自动化应用指南
3. Ansible的实际操作步骤
3.1 创建清单文件
清单文件用于定义要管理的主机系统。可以创建一个简单的文本文件,例如
hosts.ini
,内容如下:
[web_servers]
server1.example.com
server2.example.com
[db_servers]
db1.example.com
db2.example.com
上述示例中,将主机分为
web_servers
和
db_servers
两组。也可以使用动态清单脚本从云提供商获取服务器列表。
3.2 编写剧本文件
剧本文件以YAML格式编写,描述要执行的任务。以下是一个简单的剧本示例
web_setup.yml
,用于在Web服务器上安装Apache:
---
- name: Install Apache on web servers
hosts: web_servers
become: true
tasks:
- name: Update apt cache
apt:
update_cache: yes
- name: Install Apache
apt:
name: apache2
state: present
在这个剧本中:
-
name
:是剧本的名称,用于描述剧本的作用。
-
hosts
:指定要执行任务的主机组。
-
become: true
:表示使用
sudo
提升权限。
-
tasks
:包含一系列要执行的任务,每个任务有一个名称和使用的模块及参数。
3.3 运行剧本
使用以下命令运行剧本:
ansible-playbook -i hosts.ini web_setup.yml
-
-i:指定清单文件的路径。 -
web_setup.yml:是要运行的剧本文件。
运行该命令后,Ansible会根据剧本中的任务在指定的主机组上执行相应操作。
3.4 运行临时命令
除了使用剧本,还可以使用Ansible运行临时命令。例如,查看所有Web服务器的磁盘使用情况:
ansible web_servers -i hosts.ini -m shell -a "df -h"
-
web_servers:指定主机组。 -
-i:指定清单文件。 -
-m:指定要使用的模块,这里使用shell模块。 -
-a:指定模块的参数,即要执行的命令。
以下是Ansible操作流程的mermaid流程图:
graph LR
A[创建清单文件] --> B[编写剧本文件]
B --> C[运行剧本]
C --> D[运行临时命令]
4. 总结与注意事项
4.1 总结
通过在AWS上部署Ubuntu 20.04实例,我们了解了如何使用AWS CLI收集资源信息、配置安全组、创建SSH密钥对并启动实例。同时,Ansible为Linux系统的大规模管理提供了强大的自动化解决方案,从基础的配置管理到高级的基础设施供应、应用程序部署等都能胜任。
4.2 注意事项
- 在AWS部署实例时,要注意安全组的配置,确保只开放必要的端口,避免安全风险。
- 对于Ansible的SSH连接,要确保主机节点的SSH服务配置正确,密钥对管理妥善。
- 在编写剧本时,要仔细检查模块的参数和任务的逻辑,避免因配置错误导致任务失败。
以下是一个简单的对比表格,展示手动配置和使用Ansible自动化配置的区别:
|配置方式|扩展性|配置难度|维护成本|
|----|----|----|----|
|手动配置|差|高|高|
|Ansible自动化配置|好|低|低|
通过以上内容,我们可以看到Ansible在Linux系统管理中的重要性和优势,合理运用这些技术可以提高工作效率,降低管理成本。
超级会员免费看

被折叠的 条评论
为什么被折叠?



