自动化运维工具 Ansible 集中化管理服务器

目录

前言

一、Ansible

1.Ansible简介

[2.Ansible 特点](#2.Ansible 特点)

[3.Ansible 作用](#3.Ansible 作用)

4.典型使用场景

[5.Ansible 环境安装部署](#5.Ansible 环境安装部署)

[6.Ansible 基础命令及模块操作](#6.Ansible 基础命令及模块操作)

命令格式

[command 模块](#command 模块)

[shell 模块](#shell 模块)

[cron 模块](#cron 模块)

[user 模块](#user 模块)

[group 模块](#group 模块)

[copy 模块](#copy 模块)

[file 模块](#file 模块)

[hostname 模块](#hostname 模块)

[ping 模块](#ping 模块)

[yum 模块](#yum 模块)

[service/systemd 模块](#service/systemd 模块)

[script 模块](#script 模块)

[setup 模块](#setup 模块)

调试方法

[二、Inventory 主机清单与变量配置](#二、Inventory 主机清单与变量配置)

1.主机清单配置

[2.常用 Inventory 变量](#2.常用 Inventory 变量)

主机变量与组变量

组嵌套的实现

变量优先级规则

[三、Ansible-Playbook 剧本编写](#三、Ansible-Playbook 剧本编写)

[1.Playbook 的结构](#1.Playbook 的结构)

[2.Ansible Playbook 示例](#2.Ansible Playbook 示例)

高级功能示例

最佳实践

总结


前言

自动化运维在现代IT基础设施管理中扮演着关键角色,能够显著提升效率并减少人为错误。Ansible作为一款轻量级、无代理的配置管理工具,通过简洁的YAML语法实现任务编排,降低了学习和使用门槛。Inventory定义了目标主机和组,而Playbook则描述了具体的执行任务和流程。结合这两者,Ansible能够高效完成部署、配置管理、应用发布等复杂任务。

本指南旨在帮助用户理解Ansible的核心概念,并通过实例展示如何编写高效的Inventory和Playbook,从而快速实现自动化运维目标。

一、Ansible

1.Ansible简介

Ansible 是一款开源的自动化运维工具,用于配置管理、应用部署、任务自动化和持续交付。其核心设计理念是简单易用、无需代理、基于 SSH 协议实现远程管理,采用 YAML 语言编写剧本(Playbook),降低了学习成本。

具有以下优势:

①无需在被管理节点安装客户端,轻量级。

②通过 SSH 协议与节点通信。

③使用 YAML 和 Jinja2 模板语言进行配置和自动化任务编排。

2.Ansible****特点

无代理架构

Ansible 采用 SSH 或 WinRM 协议直接管理节点,无需在目标主机上安装额外代理程序。通过推送模式执行任务,降低系统资源占用和运维复杂度。

幂等性设计

任务脚本(Playbook)可重复执行且结果一致。若目标状态已满足,Ansible 不会重复执行操作,避免意外变更。例如文件权限修改仅在当前配置不符时触发。

声明式语言

使用 YAML 编写 Playbook,通过描述系统终态而非具体步骤实现配置管理。用户无需关注底层命令,例如定义软件包安装状态而非调用 apt-get install

模块化扩展

内置超过 750 个核心模块(如 copyyumtemplate),支持自定义模块开发。模块抽象底层操作,实现跨平台兼容性(如 Linux/Windows 统一文件管理)。

Ansible 的协作与集成能力

清单动态管理

支持静态 Inventory 文件和动态脚本生成主机列表,可与云平台(AWS EC2、Azure)或 CMDB 系统集成,实时获取基础设施状态。

分层变量系统

变量可定义于 Playbook、主机清单、角色或外部文件中,支持优先级覆盖。通过 host_varsgroup_vars 实现环境差异化配置。

插件体系

提供回调插件(日志定制)、连接插件(Docker/Kubernetes 支持)、查找插件(从数据库读取变量)等扩展点,增强流程控制与数据交互能力。

3.Ansible作用

Ansible 是一款开源的自动化运维工具,用于配置管理、应用部署、任务自动化和持续交付。其核心作用包括:

配置管理

通过 YAML 格式的剧本(Playbook)定义服务器配置,确保环境一致性。例如批量安装软件、修改配置文件或管理用户权限。

应用部署

自动化应用从开发到生产的发布流程,支持滚动更新、回滚操作,与 CI/CD 工具(如 Jenkins)集成。

任务自动化

执行重复性任务,如日志轮转、备份、定时任务,通过 Ad-Hoc 命令快速完成临时操作。

编排复杂流程

协调多台服务器的操作顺序,例如先更新数据库再重启应用服务,依赖 roleshandlers 实现步骤控制。

无代理架构

基于 SSH 或 WinRM 协议直接管理节点,无需在目标机器安装客户端,降低维护成本。

4.典型使用场景

  • 批量初始化云服务器(AWS、Azure)。
  • 动态管理 Docker 或 Kubernetes 集群配置。
  • 自动化测试环境搭建与销毁。

通过声明式语法和简单的学习曲线,Ansible 显著提升了运维效率与系统可靠性。

5.Ansible****环境安装部署

管理端安装 Ansible

bash 复制代码
sudo yum install epel-release -y  
sudo yum install ansible -y  
 

配置主机清单

stylus 复制代码
[web_servers]
web1.example.com ansible_host=192.168.1.10
web2.example.com ansible_host=192.168.1.11

[db_servers]
db1.example.com ansible_host=192.168.1.20
db2.example.com ansible_host=192.168.1.21

[production:children]
web_servers
db_servers
 

配置免密 SSH 登录

分发公钥到目标主机

使用 ssh-copy-id 将公钥复制到目标主机的 authorized_keys 文件中:

bash 复制代码
ssh-copy-id user@target_host
 

替换 user 为目标主机的用户名,target_host 为目标主机 IP 或域名。需输入目标主机的密码一次。

6.Ansible****基础命令及模块操作

命令格式

ansible < 组名 > -m < 模块 > -a < 参数 >

command 模块

用于在远程节点执行简单命令。不通过 shell 处理变量或特殊符号。

yaml 复制代码
- name: Execute a command
  command: /usr/bin/command arg1 arg2
 

shell 模块

类似 command 模块,但通过远程节点的 shell 执行(如 /bin/sh),支持管道和变量。

yaml 复制代码
- name: Execute a shell command
  shell: echo $HOME > /tmp/home_var
 

cron 模块

管理 crontab 计划任务。

yaml 复制代码
- name: Add a cron job
  cron:
    name: "Backup"
    minute: "0"
    hour: "2"
    job: "/opt/scripts/backup.sh"
 

user 模块

管理用户账户。

yaml 复制代码
- name: Add a user
  user:
    name: "testuser"
    group: "admin"
    shell: "/bin/bash"
 

group 模块

管理用户组。

yaml 复制代码
- name: Ensure group exists
  group:
    name: "developers"
    state: present
 

copy 模块

复制文件到远程节点。

yaml 复制代码
- name: Copy a file
  copy:
    src: /local/path/file.conf
    dest: /remote/path/file.conf
    owner: root
    group: root
    mode: '0644'
 

file 模块

设置文件/目录属性或创建符号链接。

yaml 复制代码
- name: Create a directory
  file:
    path: /path/to/directory
    state: directory
    mode: '0755'
 

hostname 模块

修改主机名。

yaml 复制代码
- name: Set hostname
  hostname:
    name: "webserver01"
 

ping 模块

测试远程主机的连接性。

yaml 复制代码
- name: Test connection
  ping:
 

yum 模块

使用 yum 包管理器管理软件包(RHEL/CentOS)。

yaml 复制代码
- name: Install a package
  yum:
    name: nginx
    state: latest
 

service/systemd 模块

管理系统服务。

yaml 复制代码
- name: Start a service
  service:
    name: nginx
    state: started
    enabled: yes
 

script 模块

将本地脚本传输到远程节点并执行。

yaml 复制代码
- name: Run a script
  script: /local/scripts/deploy.sh
 

setup 模块

收集远程主机的 facts 信息(自动运行,无需显式调用)。

yaml 复制代码
- name: Display all facts
  debug:
    var: ansible_facts
 

每个模块支持更多参数,可通过 ansible-doc <module_name> 查看完整文档。模块设计遵循幂等性,重复执行不会产生意外结果。

调试方法

详细输出

增加输出详细程度:
ansible-playbook playbook.yml -vvv

模块测试

直接测试模块功能:
ansible localhost -m debug -a "msg='Test message'"

检查语法

验证Playbook语法:
ansible-playbook playbook.yml --syntax-check

插入复制重新生成

二、Inventory****主机清单与变量配置

1.主机清单配置

主机清单(Inventory)是Ansible中定义管理目标的核心文件,通常以INI或YAML格式编写。默认路径为/etc/ansible/hosts,也可通过-i参数指定自定义文件。

INI格式示例:

ini 复制代码
[web_servers]
web1.example.com ansible_port=2222
web2.example.com

[db_servers]
db1.example.com
db2.example.com ansible_user=admin

[cluster:children]
web_servers
db_servers
 

2.常用Inventory变量

主机变量与组变量

主机变量(Host Variables)通常指在Ansible中直接关联到特定主机的变量,定义在host_vars目录或清单文件中。这些变量仅对单个主机生效,优先级高于组变量。

组变量(Group Variables)是分配给Ansible主机组的变量,定义在group_vars目录或清单文件中。组变量对所有属于该组的主机生效,适用于共享配置的场景。

组嵌套的实现

组嵌套(Group Nesting)允许在Ansible中将一个组作为另一个组的成员,形成层级关系。通过children关键字实现,子组继承父组的变量,但子组的变量优先级更高。

ini 复制代码
[web_servers]
host1.example.com

[db_servers]
host2.example.com

[production:children]
web_servers
db_servers
 

变量优先级规则

  1. 直接主机变量 :定义在host_vars中的变量优先级最高。
  2. 子组变量:嵌套组中子组的变量覆盖父组的同名变量。
  3. 父组变量:父组变量优先级低于子组但高于全局变量。
  4. 全局变量 :定义在group_vars/all中的变量优先级最低。

三、Ansible-Playbook****剧本编写

1.Playbook****的结构

Ansible 的 Playbook 是一个包含多个 Play 的 YAML 文件,每个 Play 负责对指定的 主机组 执行一系
列的任务。 Playbook 通常由以下几部分组成:
Tasks :每个任务会调用一个模块来在目标主机上执行操作。
Variables :通过定义和使用变量,使 Playbook 更具灵活性和可重用性。
Templates :通过 Jinja2 模板动态生成配置文件。
Handlers :用于响应任务执行后的变更( notify 触发)。
Roles :把多个任务、变量、模板、文件、处理程序组织成模块化结构,便于复用。

2.Ansible Playbook 示例

以下是一个完整的 Ansible Playbook 示例,用于部署 Nginx 并配置一个简单的静态网站。该示例展示了 Playbook 的基本结构和常用模块。

playbook.yml

yaml 复制代码
---
- name: Deploy Nginx and static website
  hosts: webservers
  become: yes
  vars:
    website_dir: /var/www/example.com
    index_content: "Hello, World!"

  tasks:
    - name: Install Nginx
      apt:
        name: nginx
        state: present
        update_cache: yes

    - name: Create website directory
      file:
        path: "{{ website_dir }}"
        state: directory
        mode: '0755'

    - name: Create index.html
      copy:
        content: "{{ index_content }}"
        dest: "{{ website_dir }}/index.html"
        mode: '0644'

    - name: Configure Nginx site
      template:
        src: templates/example.com.conf.j2
        dest: /etc/nginx/sites-available/example.com.conf
      notify: restart nginx

    - name: Enable site
      file:
        src: /etc/nginx/sites-available/example.com.conf
        dest: /etc/nginx/sites-enabled/example.com.conf
        state: link
      notify: restart nginx

  handlers:
    - name: restart nginx
      service:
        name: nginx
        state: restarted
 

关键组件说明

Inventory 文件 (inventory.ini)

ini 复制代码
[webservers]
server1.example.com
server2.example.com
 

Nginx 配置模板 (templates/example.com.conf.j2)

nginx 复制代码
server {
    listen 80;
    server_name example.com;
    root {{ website_dir }};
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}
 

运行 Playbook

执行以下命令运行 Playbook:

bash 复制代码
ansible-playbook -i inventory.ini playbook.yml
 

高级功能示例

变量文件 (vars.yml)

yaml 复制代码
website_dir: /var/www/production.com
index_content: "Welcome to Production"
 

包含角色的 Playbook

yaml 复制代码
---
- name: Deploy web stack
  hosts: webservers
  become: yes
  roles:
    - nginx
    - firewall
 

条件任务

yaml 复制代码
- name: Install debug tools on dev servers
  apt:
    name: htop
    state: present
  when: "'dev' in group_names"
 

最佳实践

  • 使用 ansible-lint 检查 Playbook 语法
  • 将敏感数据存储在 ansible-vault 加密文件中
  • 使用 tags 标记任务以便选择性运行
  • 遵循 Ansible Galaxy 的目录结构标准

总结

Ansible通过Inventory和Playbook的组合,提供了一种灵活且强大的自动化解决方案。Inventory文件清晰地组织目标主机,而Playbook以声明式的方式定义任务流程,使运维工作变得可重复、可维护。

通过合理设计Playbook,可以实现模块化、可复用的自动化脚本,显著提升运维效率。无论是简单的服务器配置,还是复杂的多阶段部署,Ansible都能以一致且可靠的方式完成任务。掌握这些工具的使用,将为团队带来更高的生产力和更稳定的系统环境。

相关推荐
牛奔28 分钟前
Docker Compose 两种安装与使用方式详解(适用于 Docker 19.03 版本)
运维·docker·云原生·容器·eureka
翼龙云_cloud1 小时前
阿里云渠道商:如何手动一键扩缩容ECS实例?
运维·服务器·阿里云·云计算
DX_水位流量监测2 小时前
大坝安全监测之渗流渗压位移监测设备技术解析
大数据·运维·服务器·网络·人工智能·安全
电商API&Tina2 小时前
京东 API 数据采集接口接入与行业分析
运维·服务器·网络·数据库·django·php
Mr_Xuhhh3 小时前
博客标题:深入理解Shell:从进程控制到自主实现一个微型Shell
linux·运维·服务器
f***24116 小时前
高效自动化管理临时文件的技术方案
运维·自动化
m0_738120726 小时前
应急响应——知攻善防靶场Linux-1详细应急过程
linux·运维·服务器·网络·web安全·ssh
obboda6 小时前
磁盘管理(MBR、LVM)
运维·5g
kylezhao20196 小时前
S7-1200 CPU 与 S7-200 SMART S7通信(S7-1200 作为服务器)
运维·服务器
摸鱼仙人~7 小时前
大模型文章生成的风格个性化与多文体写作:一套可落地的方法论
linux·运维·服务器