0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用Ansible自动化部署Linux服务器

马哥Linux运维 ? 来源:马哥Linux运维 ? 2025-08-06 17:59 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Ansible自动化部署Linux服务器配置管理最佳实践

一键部署数百台服务器?5分钟完成环境配置?这不是梦想,这是Ansible的日常操作!

作为一名在运维一线摸爬滚打多年的工程师,我见过太多因为手工配置导致的生产事故。今天,我将毫无保留地分享我在大规模Linux服务器自动化管理中积累的实战经验,让你也能轻松驾驭数百台服务器的配置管理。

为什么选择Ansible?

在DevOps工具链中,Ansible凭借其无代理架构声明式配置脱颖而出。相比Chef、Puppet等工具,Ansible的学习曲线更平缓,但功能却毫不逊色。

核心优势一览

?零依赖部署:目标服务器只需SSH和Python

?幂等性保证:重复执行结果一致,安全可靠

?YAML语法:人类可读,易于维护和协作

?模块化设计:2000+内置模块,覆盖99%运维场景

企业级目录结构设计

一个清晰的项目结构是成功的一半。经过多个大型项目验证,我推荐这样的目录布局:

ansible-infra/
├── inventories/
│  ├── production/
│  │  ├── hosts.yml
│  │  └── group_vars/
│  └── staging/
│    ├── hosts.yml
│    └── group_vars/
├── roles/
│  ├── common/
│  ├── webserver/
│  ├── database/
│  └── monitoring/
├── playbooks/
│  ├── site.yml
│  ├── webservers.yml
│  └── databases.yml
├── ansible.cfg
└── vault/
  └── secrets.yml

核心配置文件优化

ansible.cfg 性能调优

[defaults]
# 提升并发性能
forks=50
host_key_checking=False
# 开启连接复用
[ssh_connection]
ssh_args= -o ControlMaster=auto -o ControlPersist=60s
pipelining=True
# 加速fact收集
gathering= smart
fact_caching= jsonfile
fact_caching_connection= /tmp/ansible_facts_cache

主机清单智能分组

# inventories/production/hosts.yml
all:
children:
 webservers:
  hosts:
   web[01:10].example.com:
  vars:
   nginx_worker_processes:4
   app_env:production
 databases:
  hosts:
   db[01:03].example.com:
  vars:
   mysql_max_connections:500
 monitoring:
  hosts:
   monitor.example.com:

角色开发黄金法则

1. 通用系统配置角色

# roles/common/tasks/main.yml
---
-name:更新系统包
package:
 name:'*'
 state:latest
when:ansible_os_family=="RedHat"

-name:配置系统时区
timezone:
 name:"{{ system_timezone | default('Asia/Shanghai') }}"

-name:优化系统内核参数
sysctl:
 name:"{{ item.key }}"
 value:"{{ item.value }}"
 state:present
 reload:yes
loop:
 -{key:'net.core.somaxconn',value:'65535'}
 -{key:'net.ipv4.tcp_max_syn_backlog',value:'65535'}
 -{key:'vm.swappiness',value:'10'}

2. Web服务器角色进阶配置

# roles/webserver/tasks/main.yml
---
-name:安装Nginx
package:
 name:nginx
 state:present

-name:生成Nginx配置文件
template:
 src:nginx.conf.j2
 dest:/etc/nginx/nginx.conf
 backup:yes
notify:重启nginx服务

-name:配置虚拟主机
template:
 src:vhost.conf.j2
 dest:"/etc/nginx/conf.d/{{ item.name }}.conf"
loop:"{{ virtual_hosts }}"
notify:重载nginx配置

-name:确保Nginx服务启动
systemd:
 name:nginx
 state:started
 enabled:yes

3. 高可用数据库集群配置

# roles/database/tasks/mysql_cluster.yml
---
-name:安装MySQL8.0
package:
 name:
  -mysql-server
  -mysql-client
  -python3-pymysql
 state:present

-name:配置MySQL主从复制
template:
 src:my.cnf.j2
 dest:/etc/mysql/my.cnf
vars:
 server_id:"{{ ansible_default_ipv4.address.split('.')[-1] }}"
notify:重启mysql服务

-name:创建复制用户
mysql_user:
 name:replication
 password:"{{ mysql_replication_password }}"
 priv:"*.*:REPLICATION SLAVE"
 host:"%"
when:mysql_role=="master"

安全配置最佳实践

Ansible Vault 敏感信息管理

# 创建加密文件
ansible-vault create vault/secrets.yml

# 编辑加密文件
ansible-vault edit vault/secrets.yml

# 在playbook中使用
ansible-playbook -i inventories/production playbooks/site.yml --ask-vault-pass

SSH密钥自动化分发

-name:分发SSH公钥
authorized_key:
 user:"{{ ansible_user }}"
 state:present
 key:"{{ item }}"
loop:"{{ admin_ssh_keys }}"

-name:禁用密码登录
lineinfile:
 path:/etc/ssh/sshd_config
 regexp:'^PasswordAuthentication'
 line:'PasswordAuthentication no'
notify:重启ssh服务

监控与日志集成

自动化部署ELK Stack

# roles/monitoring/tasks/elk.yml
---
-name:安装Elasticsearch
package:
 name:elasticsearch
 state:present

-name:配置Elasticsearch集群
template:
 src:elasticsearch.yml.j2
 dest:/etc/elasticsearch/elasticsearch.yml
vars:
 cluster_name:"{{ elk_cluster_name }}"
 node_name:"{{ inventory_hostname }}"
 network_host:"{{ ansible_default_ipv4.address }}"

-name:部署Logstash配置
template:
 src:logstash.conf.j2
 dest:/etc/logstash/conf.d/main.conf
notify:重启logstash服务

性能优化与故障排查

并行执行策略

# playbooks/高性能部署.yml
---
-hosts:webservers
strategy:free# 异步执行,提升速度
serial:5   # 分批执行,控制风险
max_fail_percentage:20# 容错率设置
tasks:
 -name:更新应用代码
  git:
   repo:"{{ app_repo_url }}"
   dest:/var/www/html
   version:"{{ app_version }}"

调试与日志记录

-name:调试变量输出
debug:
 var:ansible_facts
when:debug_mode|default(false)

-name:记录操作日志
lineinfile:
 path:/var/log/ansible-deploy.log
 line:"{{ ansible_date_time.iso8601 }}-{{ inventory_hostname }}-{{ ansible_play_name }}"
 create:yes

CI/CD集成实战

GitLab CI 自动化流水线

# .gitlab-ci.yml
stages:
-validate
-deploy_staging
-deploy_production

validate_ansible:
stage:validate
script:
 -ansible-lintplaybooks/
 -ansible-playbook--syntax-checkplaybooks/site.yml

deploy_staging:
stage:deploy_staging
script:
 -ansible-playbook-iinventories/stagingplaybooks/site.yml
only:
 -develop

deploy_production:
stage:deploy_production
script:
 -ansible-playbook-iinventories/productionplaybooks/site.yml
only:
 -master
when:manual

高级技巧揭秘

动态Inventory

#!/usr/bin/env python3
# scripts/dynamic_inventory.py
importjson
importrequests

defget_aws_instances():
 # 从AWS API获取实例信息
  instances = requests.get('your-aws-api-endpoint').json()
  inventory = {'webservers': {'hosts': []}}
 
 forinstanceininstances:
   ifinstance['tags'].get('Role') =='web':
      inventory['webservers']['hosts'].append(instance['public_ip'])
 
 returninventory

if__name__ =='__main__':
 print(json.dumps(get_aws_instances()))

自定义模块开发

# library/check_service_health.py
#!/usr/bin/python
fromansible.module_utils.basicimportAnsibleModule
importrequests

defmain():
  module = AnsibleModule(
    argument_spec=dict(
      url=dict(required=True),
      timeout=dict(default=10,type='int')
    )
  )
 
 try:
    response = requests.get(module.params['url'],
               timeout=module.params['timeout'])
   ifresponse.status_code ==200:
      module.exit_json(changed=False, status='healthy')
   else:
      module.fail_json(msg=f"Service unhealthy:{response.status_code}")
 exceptExceptionase:
    module.fail_json(msg=str(e))

if__name__ =='__main__':
  main()

生产环境实战经验

蓝绿部署策略

-name:蓝绿部署实现
block:
 -name:准备绿色环境
  include_tasks:deploy_green.yml
  
 -name:健康检查
  uri:
   url:"http://{{ ansible_host }}:{{ green_port }}/health"
   method:GET
  register:health_check
  
 -name:切换流量到绿色环境
  replace:
   path:/etc/nginx/upstream.conf
   regexp:'server.*:{{ blue_port }}'
   replace:'server {{ ansible_host }}:{{ green_port }}'
  when:health_check.status==200
  notify:重载nginx配置
  
rescue:
 -name:回滚到蓝色环境
  debug:
   msg:"部署失败,保持蓝色环境运行"

大规模服务器管理技巧

# 分批重启策略
-name:滚动重启服务器
shell:reboot
async:1
poll:0
throttle:1# 每次只重启一台

-name:等待服务器恢复
wait_for_connection:
 delay:30
 timeout:300

性能基准测试

在我的实际项目中,使用Ansible实现了以下性能提升:

指标 手工操作 Ansible自动化 提升幅度
100台服务器配置时间 8小时 20分钟 24倍
配置错误率 15% <1% 降低93%
部署一致性 60% 99.9% 提升66%

总结与展望

通过这套完整的Ansible最佳实践,你可以:

10倍提升运维效率
显著降低人为错误
实现真正的Infrastructure as Code
轻松管理数千台服务器

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11535

    浏览量

    214845
  • 服务器
    +关注

    关注

    13

    文章

    9859

    浏览量

    88398

原文标题:Ansible自动化部署Linux服务器配置管理最佳实践

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于spring boot的linux服务器部署方法

    最近一直在研究springboot服务器,之前受到springmvc等框架的困扰,思路不对,一直想把springboot打包成war包然后部署到tomcat容器下,今天突然想到既然springboot我再本地可以使用jar包的形式访问,
    发表于 07-22 06:51

    基于IAR EW编译工具实现Linux系统上自动化构建

    可能频繁的进行,或至少每天进行一次。许多公司通过自动化发布流程和应用随时部署使开发流程更进一步。编译服务器和编译平台需要灵活的高性能环境,通过使用IAR的Linux平台编译工具链,用户
    发表于 11-27 13:41

    ntp校时(网络对时服务器自动化系统技术应用方案分享

    ntp校时(网络对时服务器自动化系统技术应用方案ntp校时(网络对时服务器自动化系统技术
    发表于 07-02 08:12

    Jenkins远程部署Linux服务器的过程

    1、Jenkins远程部署Linux服务器  之前在Jenkins上也有一些使用经验了,但是都是使用团队配置好的Jenkins,自己只需要管自己的项目以及执行构建即可,这一次自己尝试了一下配置
    发表于 11-18 18:12

    智能通信服务器在变电站自动化系统中应用

    介绍了基于嵌入式Linux 系统和Intel Xscale 网络处理的Moxa 智能通信服务器在煤矿井下6 kV 变电站自动化系统接入煤矿自动化
    发表于 04-24 10:00 ?18次下载

    ansible-first-book 自动化运维工具

    ansible-first-book 自动化运维工具
    发表于 09-08 09:31 ?5次下载

    利用Ansible实现OpenStack自动化

    方法行之有效。 简介本文介绍为何Ansible Tower是使用playbook,在OpenStack中创建、部署和配置虚拟机最简单的方法之一。系统性能、IT自动化、复杂系统的部署
    的头像 发表于 12-03 17:29 ?3458次阅读
    <b class='flag-5'>利用</b><b class='flag-5'>Ansible</b>实现OpenStack<b class='flag-5'>自动化</b>

    利用Ansible实现OpenStack自动化

    本文介绍为何Ansible Tower是使用playbook,在OpenStack中创建、部署和配置虚拟机最简单的方法之一。系统性能、IT自动化、复杂系统的部署和快速生产力是软件开发中
    的头像 发表于 12-02 19:02 ?3629次阅读

    使用Ansible的OpenStack自动化

    通过将 Ansible Tower 与 OpenStack 集成到 Cyber Range 软件中,我们能够构建一个应用程序,为全球客户提供按需培训和真实场景。将 Ansible REST API 与行动手册集成,极大地利用了配
    的头像 发表于 12-21 14:12 ?1513次阅读
    使用<b class='flag-5'>Ansible</b>的OpenStack<b class='flag-5'>自动化</b>

    什么是Ansible

    Ansible是一种运维自动化工具软件,用来批量配置服务器或网络设备(目标主机)。
    的头像 发表于 02-15 14:06 ?1993次阅读

    使用Ansible构建虚拟机部署Linux的最佳实践

    编者按:本文节选自节选自《基于Linux的企业自动化》第五章。“第5章,使用Ansible构建用于部署的虚拟机模板,通过构建虚拟机模板来探索部署
    的头像 发表于 05-16 15:13 ?1500次阅读

    利用Ansible批量100台服务器添加Crontab

    今天浩道跟大家分享关于Ansible自动化运维相关硬核干货,利用Ansible批量100台服务器添加Crontab !
    的头像 发表于 08-19 14:24 ?942次阅读

    基于 Docker 与 Jenkins 实现自动化部署

    前言 重塑自动化部署新高度,Docker 携手 Jenkins,在华为云 Flexus X 云服务器的加持下,引领持续集成与部署的新纪元。Flexus X 以其卓越的性能、灵活的资源配
    的头像 发表于 01-07 17:25 ?589次阅读
    基于 Docker 与 Jenkins 实现<b class='flag-5'>自动化</b><b class='flag-5'>部署</b>

    IT自动化工具Ansible基础入门

    Ansible是帮助运维人员实现自动化的最重要的工具之一。
    的头像 发表于 02-07 10:00 ?887次阅读
    IT<b class='flag-5'>自动化</b>工具<b class='flag-5'>Ansible</b>基础入门

    Ansible Playbook自动化部署Nginx集群指南

    面对日益猖獗的DDoS攻击,手动部署防护已经out了!今天教你用Ansible一键部署具备DDoS防御能力的Nginx集群,让攻击者哭着回家!
    的头像 发表于 08-06 17:54 ?212次阅读