自动化运维工具 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都能以一致且可靠的方式完成任务。掌握这些工具的使用,将为团队带来更高的生产力和更稳定的系统环境。

相关推荐
不爱吃糖的程序媛2 小时前
OpenHarmony Linux 环境 SDK 使用说明(进阶--依赖库的解决方法)
linux·运维·harmonyos
Henry Zhu1232 小时前
VPP中ACL源码详解第三篇:ACL是如何以统一的接口来为其他插件服务(上)
运维·服务器·网络
hanyi_qwe2 小时前
自动化运维工具 Ansible 集中化管理服务器
运维·自动化·ansible
wayuncn2 小时前
预算49800,99800,299800能买到什么样的算力服务器
运维·服务器·人工智能·算力一体机·ai算力服务器
LucidX2 小时前
Ansible ——核心模块
ansible
wanhengidc2 小时前
云端虚拟 巨椰 云手机
运维·服务器·安全·智能手机·云计算
wanhengidc2 小时前
云手机 互联网 云端科技
运维·服务器·科技·智能手机·云计算
XXYBMOOO2 小时前
基于 HTML5 Canvas 的终端日志流可视化实现(支持多 Pane / 运维模式)
运维·前端·html5
元气满满-樱2 小时前
负载均衡-动静分离实验
运维·firefox·负载均衡