本文档风哥主要介绍Ansible,包括Ansible的概念、特性、优势、架构设计、组件选择、部署、配置、集成等内容,参考Red Hat Enterprise Linux 10官方文档中的System administration章节,适合系统管理员和IT人员在生产环境中使用。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 Ansible的概念
Ansible是一个开源的自动化配置管理和应用部署工具,用于自动化IT基础设施的配置、部署和管理。它使用SSH协议进行通信,无需在目标主机上安装客户端,能够通过Playbook定义自动化任务。学习交流加群风哥微信: itpux-com
- 控制节点:运行Ansible命令的主机
- 被控节点:被Ansible管理的主机
- Playbook:定义自动化任务的YAML文件
- 模块:Ansible执行的最小任务单元
- 角色:可复用的Playbook集合
- 清单:定义被控节点的文件
1.2 Ansible的特性
Ansible的特性:
- 无代理:无需在被控节点上安装客户端
- 简单易用:使用YAML编写Playbook,语法简洁
- 强大的模块:提供丰富的模块,支持各种任务
- 可扩展性:支持自定义模块和插件
- 幂等性:重复执行相同的任务不会产生副作用
- 并行执行:支持并行执行任务,提高效率
- 集成性:与多种云服务和配置管理工具集成
1.3 Ansible的优势
Ansible的优势:
- 简单易用:学习曲线平缓,容易上手
- 无代理:减少了部署和维护的工作量
- 幂等性:确保配置的一致性
- 可扩展性:支持自定义模块和插件
- 并行执行:提高自动化任务的执行效率
- 集成性:与多种云服务和配置管理工具集成
- 开源:免费使用,社区活跃
Part02-生产环境规划与建议
2.1 Ansible架构设计
Ansible架构设计要点:
– 控制节点:运行Ansible命令的主机
– 被控节点:被Ansible管理的主机
– Playbook:定义自动化任务的YAML文件
– 模块:Ansible执行的最小任务单元
– 角色:可复用的Playbook集合
– 清单:定义被控节点的文件
# 部署模式
– 单控制节点:使用单个控制节点管理所有被控节点
– 多控制节点:使用多个控制节点管理被控节点,提高可用性
– 容器化部署:在Docker容器中运行Ansible
# 高可用性设计
– 控制节点冗余:部署多个控制节点,实现高可用性
– 负载均衡:使用负载均衡分发任务
– 备份:定期备份Ansible配置和Playbook
– 灾难恢复:制定灾难恢复计划
2.2 Ansible组件选择
Ansible组件选择要点:
– Ansible Core:Ansible的核心功能
– Ansible Playbook:定义自动化任务的YAML文件
– Ansible Module:执行具体任务的模块
– Ansible Role:可复用的Playbook集合
– Ansible Inventory:定义被控节点的文件
# 常用模块
– copy:复制文件到被控节点
– file:管理文件和目录
– service:管理系统服务
– package:管理软件包
– user:管理用户
– group:管理用户组
– command:执行命令
– shell:执行shell命令
– script:执行本地脚本
– template:使用模板生成文件
# 常用插件
– 连接插件:负责与被控节点通信
– 缓存插件:缓存被控节点的信息
– 回调插件:处理Ansible的输出
– 过滤插件:处理变量
– 查找插件:查找数据
# 集成工具
– Ansible Tower:Ansible的企业级管理平台
– AWX:Ansible Tower的开源版本
– Ansible Galaxy:共享Ansible角色的平台
2.3 Ansible最佳实践
Ansible最佳实践:
- 使用角色:将Playbook组织成可复用的角色
- 使用清单:合理组织被控节点的清单
- 使用变量:使用变量管理配置,提高可维护性
- 使用模板:使用模板生成配置文件
- 使用事实:利用Ansible的事实收集功能
- 使用标签:使用标签管理任务的执行
- 使用检查模式:在执行前检查任务的效果
- 使用版本控制:将Playbook和配置文件纳入版本控制
Part03-生产环境项目实施方案
3.1 Ansible部署
3.1.1 安装Ansible
dnf install -y ansible
# 2. 验证Ansible安装
ansible –version
# 3. 配置SSH免密登录
# 在控制节点上生成SSH密钥
ssh-keygen -t rsa
# 将SSH公钥复制到被控节点
ssh-copy-id user@host
# 4. 测试SSH连接
ssh user@host
3.2 Ansible配置
3.2.1 基本配置
cat > inventory.ini << 'EOF' [web] web1 ansible_host=192.168.1.100 ansible_user=root web2 ansible_host=192.168.1.101 ansible_user=root [db] db1 ansible_host=192.168.1.200 ansible_user=root EOF # 2. 创建Playbook文件 cat > playbook.yml << 'EOF' --- - name: Configure web servers hosts: web tasks: - name: Install httpd package: name: httpd state: present - name: Start httpd service service: name: httpd state: started enabled: yes - name: Copy index.html copy: content: "
Hello from Ansible!
”
dest: /var/www/html/index.html
EOF
# 3. 执行Playbook
ansible-playbook -i inventory.ini playbook.yml
# 4. 检查执行结果
ansible web -i inventory.ini -m command -a “curl http://localhost”
3.2.2 角色配置
mkdir -p roles/webserver/tasks
mkdir -p roles/webserver/templates
mkdir -p roles/webserver/vars
# 2. 创建角色任务文件
cat > roles/webserver/tasks/main.yml << 'EOF'
---
- name: Install httpd
package:
name: httpd
state: present
- name: Start httpd service
service:
name: httpd
state: started
enabled: yes
- name: Copy index.html template
template:
src: index.html.j2
dest: /var/www/html/index.html
EOF
# 3. 创建角色模板文件
cat > roles/webserver/templates/index.html.j2 << 'EOF'
Hello from {{ ansible_hostname }}!
IP address: {{ ansible_default_ipv4.address }}
EOF
# 4. 创建角色变量文件
cat > roles/webserver/vars/main.yml << 'EOF'
---
httpd_port: 80
EOF
# 5. 创建使用角色的Playbook
cat > site.yml << 'EOF'
---
- name: Configure web servers
hosts: web
roles:
- webserver
EOF
# 6. 执行Playbook
ansible-playbook -i inventory.ini site.yml
# 7. 检查执行结果
ansible web -i inventory.ini -m command -a "curl http://localhost"
3.3 Ansible集成
3.3.1 与CI/CD集成
cat > .gitlab-ci.yml << 'EOF' stages: - deploy deploy: stage: deploy script: - ansible-playbook -i inventory.ini site.yml only: - master EOF # 2. 提交配置文件 git add .gitlab-ci.yml git commit -m "Add GitLab CI configuration" git push
3.3.2 与云服务集成
cat > aws.yml << 'EOF' --- - name: Provision AWS resources hosts: localhost gather_facts: no tasks: - name: Create EC2 instance amazon.aws.ec2_instance: name: fgedu-instance instance_type: t2.micro image_id: ami-0c55b159cbfafe1f0 region: us-east-1 security_groups: - default tags: Name: fgedu-instance register: ec2 - name: Print EC2 instance details debug: var: ec2 EOF # 2. 执行Playbook ansible-playbook aws.yml # 3. Azure集成 cat > azure.yml << 'EOF' --- - name: Provision Azure resources hosts: localhost gather_facts: no tasks: - name: Create resource group azure.azcollection.azure_rm_resourcegroup: name: fgedu-rg location: eastus - name: Create virtual network azure.azcollection.azure_rm_virtualnetwork: resource_group: fgedu-rg name: fgedu-vnet address_prefixes: "10.0.0.0/16" - name: Create subnet azure.azcollection.azure_rm_subnet: resource_group: fgedu-rg name: fgedu-subnet address_prefix: "10.0.1.0/24" virtual_network: fgedu-vnet EOF # 4. 执行Playbook ansible-playbook azure.yml
Part04-生产案例与实战讲解
4.1 Ansible基础配置
某企业通过使用Ansible,实现了对Web服务器的自动化配置。
# 控制节点:Ansible控制节点
# 被控节点:Web服务器
# 任务:安装和配置httpd服务
# 2. 实施步骤
# 步骤1:安装Ansible
# 步骤2:配置SSH免密登录
# 步骤3:创建清单文件
# 步骤4:创建Playbook文件
# 步骤5:执行Playbook
# 步骤6:验证配置
# 步骤7:测试与验证
# 3. 应用效果
# 实现了对Web服务器的自动化配置
# 提高了配置管理的效率
# 确保了配置的一致性
# 清单文件
cat > inventory.ini << 'EOF'
[web]
web1 ansible_host=192.168.1.100 ansible_user=root
web2 ansible_host=192.168.1.101 ansible_user=root
EOF
# Playbook文件
cat > playbook.yml << 'EOF'
---
- name: Configure web servers
hosts: web
tasks:
- name: Install httpd
package:
name: httpd
state: present
- name: Start httpd service
service:
name: httpd
state: started
enabled: yes
- name: Copy index.html
copy:
content: "
Hello from Ansible!
”
dest: /var/www/html/index.html
– name: Allow http through firewall
firewalld:
service: http
state: enabled
permanent: yes
immediate: yes
EOF
# 执行Playbook
ansible-playbook -i inventory.ini playbook.yml
# 验证配置
ansible web -i inventory.ini -m command -a “curl http://localhost”
4.2 Ansible Playbook配置
某企业通过使用Ansible Playbook,实现了对多环境服务器的自动化配置。
# 控制节点:Ansible控制节点
# 被控节点:开发环境、测试环境、生产环境服务器
# 任务:安装和配置Web服务、数据库服务
# 2. 实施步骤
# 步骤1:创建角色目录结构
# 步骤2:创建角色任务文件
# 步骤3:创建角色模板文件
# 步骤4:创建角色变量文件
# 步骤5:创建环境配置文件
# 步骤6:创建使用角色的Playbook
# 步骤7:执行Playbook
# 步骤8:验证配置
# 步骤9:测试与验证
# 3. 应用效果
# 实现了对多环境服务器的自动化配置
# 提高了配置管理的效率
# 确保了配置的一致性
# 创建角色目录结构
mkdir -p roles/webserver/tasks
mkdir -p roles/webserver/templates
mkdir -p roles/webserver/vars
mkdir -p roles/dbserver/tasks
mkdir -p roles/dbserver/templates
mkdir -p roles/dbserver/vars
# Web服务器角色任务文件
cat > roles/webserver/tasks/main.yml << 'EOF'
---
- name: Install httpd
package:
name: httpd
state: present
- name: Start httpd service
service:
name: httpd
state: started
enabled: yes
- name: Copy index.html template
template:
src: index.html.j2
dest: /var/www/html/index.html
- name: Allow http through firewall
firewalld:
service: http
state: enabled
permanent: yes
immediate: yes
EOF
# Web服务器角色模板文件
cat > roles/webserver/templates/index.html.j2 << 'EOF'
Hello from {{ ansible_hostname }}!
Environment: {{ environment }}
IP address: {{ ansible_default_ipv4.address }}
EOF
# Web服务器角色变量文件
cat > roles/webserver/vars/main.yml << 'EOF'
---
httpd_port: 80
EOF
# 数据库服务器角色任务文件
cat > roles/dbserver/tasks/main.yml << 'EOF'
---
- name: Install mariadb-server
package:
name: mariadb-server
state: present
- name: Start mariadb service
service:
name: mariadb
state: started
enabled: yes
- name: Create database
mysql_db:
name: fgedudb
state: present
- name: Create database user
mysql_user:
name: fgedu
password: password123
priv: 'fgedudb.*:ALL'
host: '%'
state: present
- name: Allow mysql through firewall
firewalld:
service: mysql
state: enabled
permanent: yes
immediate: yes
EOF
# 环境配置文件
cat > group_vars/dev.yml << 'EOF'
---
environment: development
EOF
cat > group_vars/test.yml << 'EOF'
---
environment: testing
EOF
cat > group_vars/prod.yml << 'EOF'
---
environment: production
EOF
# 清单文件
cat > inventory.ini << 'EOF'
[dev:children]
dev_web
dev_db
[test:children]
test_web
test_db
[prod:children]
prod_web
prod_db
[dev_web]
dev-web1 ansible_host=192.168.1.100 ansible_user=root
[dev_db]
dev-db1 ansible_host=192.168.1.200 ansible_user=root
[test_web]
test-web1 ansible_host=192.168.1.101 ansible_user=root
[test_db]
test-db1 ansible_host=192.168.1.201 ansible_user=root
[prod_web]
prod-web1 ansible_host=192.168.1.102 ansible_user=root
prod-web2 ansible_host=192.168.1.103 ansible_user=root
[prod_db]
prod-db1 ansible_host=192.168.1.202 ansible_user=root
prod-db2 ansible_host=192.168.1.203 ansible_user=root
EOF
# 主Playbook文件
cat > site.yml << 'EOF'
---
- name: Configure web servers
hosts: *web
roles:
- webserver
- name: Configure database servers
hosts: *db
roles:
- dbserver
EOF
# 执行Playbook
ansible-playbook -i inventory.ini site.yml
# 验证配置
ansible dev_web -i inventory.ini -m command -a "curl http://localhost"
ansible dev_db -i inventory.ini -m command -a "mysql -u fgedu -ppassword123 -e 'SHOW DATABASES;'"
4.3 Ansible与云服务集成
某企业通过集成Ansible与AWS云服务,实现了对云资源的自动化管理。
# 控制节点:Ansible控制节点
# 云服务:AWS
# 任务:创建和管理EC2实例、S3存储桶
# 2. 实施步骤
# 步骤1:安装AWS SDK
# 步骤2:配置AWS凭证
# 步骤3:创建Playbook文件
# 步骤4:执行Playbook
# 步骤5:验证配置
# 步骤6:测试与验证
# 3. 应用效果
# 实现了对云资源的自动化管理
# 提高了云资源管理的效率
# 确保了云资源配置的一致性
# 安装AWS SDK
pip3 install boto3 botocore
# 配置AWS凭证
cat > ~/.aws/credentials << 'EOF'
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
EOF
cat > ~/.aws/config << 'EOF'
[default]
region = us-east-1
EOF
# Playbook文件
cat > aws.yml << 'EOF'
---
- name: Provision AWS resources
hosts: localhost
gather_facts: no
tasks:
- name: Create security group
amazon.aws.ec2_security_group:
name: fgedu-sg
description: Allow SSH and HTTP
region: us-east-1
rules:
- proto: tcp
ports:
- 22
cidr_ip: 0.0.0.0/0
- proto: tcp
ports:
- 80
cidr_ip: 0.0.0.0/0
register: sg
- name: Create EC2 instance
amazon.aws.ec2_instance:
name: fgedu-instance
instance_type: t2.micro
image_id: ami-0c55b159cbfafe1f0
region: us-east-1
security_group: fgedu-sg
tags:
Name: fgedu-instance
register: ec2
- name: Create S3 bucket
amazon.aws.s3_bucket:
name: fgedu-bucket-{{ 99999999 | random }}
region: us-east-1
state: present
register: s3
- name: Print resources
debug:
msg:
- "Security Group: {{ sg.group_id }}"
- "EC2 Instance: {{ ec2.instances[0].instance_id }}"
- "Public IP: {{ ec2.instances[0].public_ip_address }}"
- "S3 Bucket: {{ s3.bucket.name }}"
EOF
# 执行Playbook
ansible-playbook aws.yml
# 验证配置
# 登录AWS控制台查看创建的资源
Part05-风哥经验总结与分享
5.1 Ansible使用经验
Ansible使用经验:
- 使用角色:将Playbook组织成可复用的角色
- 使用清单:合理组织被控节点的清单
- 使用变量:使用变量管理配置,提高可维护性
- 使用模板:使用模板生成配置文件
- 使用事实:利用Ansible的事实收集功能
- 使用标签:使用标签管理任务的执行
- 使用检查模式:在执行前检查任务的效果
- 使用版本控制:将Playbook和配置文件纳入版本控制
5.2 Ansible故障排查
Ansible故障排查:
- 检查SSH连接:确保控制节点能够SSH连接到被控节点
- 检查Playbook语法:确保Playbook语法正确
- 检查模块参数:确保模块参数正确
- 检查权限:确保Ansible有足够的权限执行任务
- 检查网络连接:确保被控节点能够访问必要的网络资源
- 使用详细模式:使用-v参数查看详细的执行过程
5.3 Ansible的未来发展
Ansible的未来发展趋势:
- 云原生:适应云原生环境的需求
- Kubernetes集成:与Kubernetes深度集成
- AI集成:利用AI技术提高自动化的智能化水平
- 安全性:加强自动化的安全性
- 可观测性:提高自动化的可观测性
- 自动化:增强自动化的能力和范围
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
