当前位置: 首页 > news >正文

Ansible实现自动化运维

使用Ansible实现自动化运维:集中化管理服务器的完整指南

  • 前言
  • 一、 Ansible概述和运行机制
      • 1.1 Ansible概述
      • 1.2 Ansible工作机制
      • 1.3 Ansible角色(Role)
  • 二、 Ansible环境安装部署
      • 环境示例
      • 管理端安装Ansible
      • 目录结构
      • 配置主机清单
      • 配置免密SSH登录
  • 三、 Ansible基础命令及模块操作
      • 命令格式
      • 常用模块示例
        • 3.1 command模块
        • 3.2 shell模块
        • 3.3 cron模块
        • 3.4 user模块
        • 3.5 group模块
        • 3.6 copy模块
        • 3.7 file模块
        • 3.8 hostname模块
        • 3.9 ping模块
        • 3.10 yum模块
        • 3.11 service/systemd模块
        • 3.12 script模块
        • 3.13 setup模块
  • 四、 Inventory主机清单与变量配置
      • 4.1 Inventory支持对主机进行分组
      • 4.2 常用Inventory变
      • 基本示例
        • (1) 主机变量
        • (2) 组变量
        • (3) 组嵌套
  • 结语

前言

  在当今快速发展的IT环境中,自动化运维已经成为提高效率、减少人为错误和确保系统一致性的关键手段。随着服务器数量的增加和配置的复杂化,手动管理变得越来越不可行。Ansible作为一款强大的自动化运维工具,因其简单易用、无需客户端代理、基于SSH通信等特点,成为了众多运维工程师的首选。
  本文将详细介绍Ansible的基本概念、运行机制、安装部署以及基础命令和模块操作,帮助您快速上手并掌握如何使用Ansible进行集中化的服务器管理。无论您是初学者还是有经验的运维人员,本文都将为您提供有价值的指导和参考。

一、 Ansible概述和运行机制

1.1 Ansible概述

Ansible是一款面向类Unix系统的自由开源配置和自动化工具,由Python编写。与SaltStack、Puppet、Chef等工具相似,Ansible在自动化运维领域中具有独特的优势:

  • 无需在被管理节点安装客户端:Ansible是轻量级的,管理端安装即可,被控端无需任何操作。
  • 通过SSH协议与节点通信:默认使用SSH协议管理设备,确保通信的安全性。
  • 使用YAML和Jinja2模板语言:通过YAML和Jinja2模板语言进行配置和自动化任务编排,易于理解和维护。
    官方网站:https://www.ansible.com/
    行业事件
  • 2015年10月,红帽(Red Hat)以约1-1.5亿美元收购了Ansible,进一步推动了其在企业级自动化运维中的应用。
    Ansible特点
  1. 部署简单:管理端安装即可,被控端无需操作。
  2. 默认使用SSH协议管理设备:确保通信安全。
  3. 集中化管理,支持主从模式:便于统一管理和控制。
  4. 配置简洁、功能强大、扩展性高:易于上手且功能丰富。
  5. 支持API和自定义模块:可通过Python扩展,满足个性化需求。
  6. Playbook可实现复杂任务配置和状态管理:通过编写Playbook实现自动化流程。
  7. 对云计算和大数据平台支持良好:适应现代IT环境的需求。

1.2 Ansible工作机制

Ansible通过SSH将模块推送到被管理节点执行,执行完后自动删除。这种机制不仅简化了管理流程,还确保了系统的安全性。Ansible可以结合SVN等工具管理自定义模块及任务编排,进一步提升管理效率和灵活性。
Ansible核心组成

  1. Ansible:核心引擎,负责整体的自动化流程控制。
  2. Modules:内置核心模块和自定义模块,用于执行具体的任务。
  3. Plugins:补充模块功能,如连接插件、邮件插件等,增强Ansible的功能。
  4. Playbooks:剧本,定义多任务操作,通过YAML语法编写,实现复杂的自动化流程。
  5. Inventory:主机清单,定义被管理的主机和组,便于分类和管理。

1.3 Ansible角色(Role)

随着数据中心环境的复杂化,Playbook会变得庞大且难以维护。为了解决这一问题,Ansible引入了角色的概念。角色提供了对复杂任务的模块化管理,具有以下优点:

  • 模块化管理:将任务组织为独立、可复用的剧本和文件。
  • 外部加载机制:提供从外部加载任务、处理程序、变量的机制。
  • 关联静态文件和模板:可关联静态文件和模板,便于管理和复用。
  • 满足通用需求,可重复使用:适用于多种场景,提高效率。
  • 严格的目录结构要求:确保角色的一致性和可维护性。

二、 Ansible环境安装部署

环境示例

类型IP
管理端192.168.10.10
被管理端192.168.10.30
被管理端192.168.10.40

管理端安装Ansible

  1. 安装EPEL源
yum install -y epel-release

EPEL(Extra Packages for Enterprise Linux)源提供了许多额外的软件包,包括Ansible。

  1. 安装Ansible
yum install -y ansible

通过YUM包管理器安装Ansible,简单快捷。

目录结构

  • 配置文件/etc/ansible/ansible.cfg
    • 一般无需修改,包含Ansible的默认配置。
  • 主机清单/etc/ansible/hosts
    • 定义被管理的主机和组,便于分类和管理。
  • 公共角色目录/etc/ansible/roles
    • 用于存放Ansible角色,支持模块化管理。

配置主机清单

编辑/etc/ansible/hosts文件,配置主机组和主机信息:

[webservers]
192.168.10.30
[dbservers]
192.168.10.40

在这里插入图片描述

  • 组名和主机IP:通过组名(如webserversdbservers)管理不同类型的主机,便于分类和批量操作。

配置免密SSH登录

为了实现无需手动输入密码的自动化管理,配置管理端到被管理端的免密SSH登录:

  1. 生成密钥
ssh-keygen -t rsa

按提示生成RSA密钥对,默认保存在~/.ssh/目录下。
2. 复制密钥到被管理节点

sshpass -p '登陆密码' ssh-copy-id root@192.168.10.30
sshpass -p '登录密码' ssh-copy-id root@192.168.10.40

在这里插入图片描述
使用sshpass工具自动输入密码,将公钥复制到被管理节点。注意:在生产环境中,建议使用更安全的方式来管理密码和密钥。

三、 Ansible基础命令及模块操作

Ansible通过简单的命令格式和丰富的模块,实现对被管理节点的自动化操作。以下是常用的命令格式和模块示例。

命令格式

ansible <组名> -m <模块> -a <参数>
  • <组名>:定义在主机清单中的组,如webserversdbservers
  • -m <模块>:指定要使用的模块,如commandshellyum等。
  • -a <参数>:传递给模块的参数,具体取决于所使用的模块。

常用模块示例

3.1 command模块

功能:远程执行命令,不支持管道/重定向。
示例

ansible-doc -s command  # 列出command模块的描述信息和操作动作
ansible webservers -m command -a 'date'  # 在webservers组的所有主机上执行date命令
ansible all -m command -a 'ls /'  # 在所有主机上执行ls /命令

在这里插入图片描述
在这里插入图片描述
常用参数

  • chdir:在远程主机上运行命令前进入指定目录。
  • creates:判断指定文件是否存在,如果存在,不执行后面的操作。
  • removes:判断指定文件是否存在,如果存在,执行后面的操作。
    示例
ansible all -m command -a "chdir=/home ls ./"

在这里插入图片描述

3.2 shell模块

功能:支持管道和shell特性,相当于调用远程主机的shell进程。
示例

ansible-doc -s shell  # 查看shell模块的描述信息
ansible dbservers -m shell -a 'echo 123456 | passwd --stdin test'  # 设置用户test的密码
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2{print $2}") | cut -d" " -f2'

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
说明:Shell模块功能强大,但需谨慎使用,避免安全风险。

3.3 cron模块

功能:管理计划任务,支持添加和移除任务。
示例

ansible-doc -s cron  # 查看cron模块的描述信息
ansible webservers -m cron -a 'minute="*/1" job="/bin/echo helloworld" name="test crontab"'  # 添加每分钟执行一次的cron任务
ansible webservers -a 'crontab -l'  # 查看当前用户的cron任务
ansible webservers -m cron -a 'name="test crontab" state=absent'  # 移除名为test crontab的cron任务

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
常用参数

  • minute/hour/day/month/weekday:定义计划任务的时间。
  • job:任务计划要执行的命令。
  • name:任务计划的名称。
  • state:任务状态,present表示添加(可省略),absent表示移除。
3.4 user模块

功能:管理用户账户。
示例

ansible-doc -s user  # 查看user模块的描述信息
ansible dbservers -m user -a 'name="test01"'  # 创建用户test01
ansible dbservers -m command -a 'tail /etc/passwd'  # 查看用户列表
ansible dbservers -m user -a 'name="test01" state=absent'  # 删除用户test01

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

常用参数

  • name:用户名,必选参数。
  • statepresent表示创建,absent表示删除。
  • system:是否为系统账号。
  • uid:用户UID。
  • group:用户基本组。
  • shell:默认使用的shell。
  • move_home:如果设置的家目录已经存在,是否将已经存在的家目录进行移动。
  • password:用户的密码,建议使用加密后的字符串。
  • comment:用户的注释信息。
  • remove:当state=absent时,是否删除用户的家目录。
3.5 group模块

功能:管理用户组。
示例

ansible-doc -s group  # 查看group模块的描述信息
ansible dbservers -m group -a 'name=mysql gid=306 system=yes'  # 创建mysql组
ansible dbservers -a 'tail /etc/group'  # 查看组列表
ansible dbservers -m user -a 'name=test01 uid=306 system=yes group=mysql'  # 将test01用户添加到mysql组中
ansible dbservers -a 'tail /etc/passwd'
ansible dbservers -a 'id test01'

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
常用参数

  • name:组名,必选参数。
  • gid:组GID。
  • system:是否为系统组。
3.6 copy模块

功能:复制文件或内容到远程主机。
示例

ansible-doc -s copy  # 查看copy模块的描述信息
ansible dbservers -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=640'  # 复制/etc/fstab到远程主机的/opt/fstab.bak
ansible dbservers -a 'ls -l /opt/'  # 查看/opt目录下的文件
ansible dbservers -a 'cat /opt/fstab.bak'  # 查看复制的文件内容
ansible dbservers -m copy -a 'content="helloworld" dest=/opt/hello.txt'  # 将helloworld写入/opt/hello.txt文件中
ansible dbservers -a 'cat /opt/hello.txt'

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
常用参数

  • dest:目标路径,使用绝对路径。
  • src:源文件路径。
  • mode:目标文件的权限。
  • owner:目标文件的属主。
  • group:目标文件的属组。
  • content:直接指定复制到目标主机上的内容,不能与src一起使用。
3.7 file模块

功能:管理文件属性和链接。
示例

ansible-doc -s file  # 查看file模块的描述信息
ansible dbservers -m file -a 'owner=test01 group=mysql mode=644 path=/opt/fstab.bak'  # 修改文件的属主、属组和权限
ansible dbservers -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link'  # 创建符号链接
ansible dbservers -m file -a 'path=/opt/abc.txt state=touch'  # 创建一个空文件
ansible dbservers -m file -a 'path=/opt/abc.txt state=absent'  # 删除一个文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
常用参数

  • path:文件或目录的路径。
  • owner:属主。
  • group:属组。
  • mode:权限。
  • state:状态,如linktouchabsent等。
3.8 hostname模块

功能:修改远程主机的主机名。
示例

ansible dbservers -m hostname -a 'name=mysq101'  # 将dbservers组的主机名修改为mysq101

在这里插入图片描述
说明:修改主机名后,可能需要重启系统或相关服务以使更改生效。

3.9 ping模块

功能:检测主机的连通性。
示例

ansible all -m ping  # 检测所有主机的连通性

在这里插入图片描述
说明:Ping模块用于快速检查Ansible管理的主机是否在线和可访问。

3.10 yum模块

功能:管理软件包的安装与卸载。
示例

ansible-doc -s yum  # 查看yum模块的描述信息
ansible webservers -m yum -a 'name=httpd'  # 在webservers组的主机上安装httpd服务
ansible webservers -m yum -a 'name=httpd state=absent'  # 卸载httpd服务

在这里插入图片描述
在这里插入图片描述
常用参数

  • name:软件包名称。
  • state:状态,present表示安装,absent表示卸载。
3.11 service/systemd模块

功能:管理服务的运行状态。
示例

ansible-doc -s service  # 查看service模块的描述信息
ansible webservers -a 'systemctl status httpd'  # 查看httpd服务的运行状态
ansible webservers -m service -a 'enabled=true name=httpd state=started'  # 启动httpd服务并设置开机自启

在这里插入图片描述在这里插入图片描述
常用参数

  • name:服务名称。
  • state:动作,如startedstoppedrestarted
  • enabled:是否设置开机自启。
  • runlevel:定义在哪些运行级别下自启动。
3.12 script模块

功能:在远程主机上执行本地脚本。
示例

ansible-doc -s script  # 查看script模块的描述信息
vim test.sh  # 创建一个简单的脚本
#!/bin/bash
echo "hello ansible from script" > /opt/script.txt
chmod +x test.sh  # 赋予执行权限
ansible webservers -m script -a 'test.sh'  # 在webservers组的主机上执行test.sh脚本
ansible webservers -a 'cat /opt/script.txt'  # 查看脚本执行结果

在这里插入图片描述
说明:Script模块用于批量执行本地的Shell脚本,简化了脚本的分发和执行过程。

3.13 setup模块

功能:收集被管理节点的系统信息(Facts)。
示例

ansible-doc -s setup  # 查看setup模块的描述信息
ansible webservers -m setup  # 获取webservers组主机的所有Facts信息
ansible dbservers -m setup -a 'filter=*ipv4'  # 使用filter筛选特定的Facts信息,如IPv4地址

在这里插入图片描述
说明:Setup模块用于获取被管理节点的详细系统信息,便于后续的配置和管理。

四、 Inventory主机清单与变量配置

4.1 Inventory支持对主机进行分组

Inventory文件(通常为/etc/ansible/hosts)用于定义被管理的主机和组,支持灵活的分组和变量配置。
示例

[webservers]
192.168.10.14:2222  # 冒号后定义远程连接端口,默认是SSH的22端口
192.168.10.1[2:5]   # 支持主机范围,如192.168.10.12到192.168.10.15[dbservers]
db-[a:f].example.org  # 支持主机名匹配,如db-a.example.org到db-f.example.org

4.2 常用Inventory变

变量名含义
ansible_host节点IP
ansible_portSSH端口,默认22
ansible_userSSH用户
ansible_passwordSSH密码(未使用密钥时)
ansible_ssh_private_key_file私钥文件
ansible_become提升权限(如sudo)
ansible_become_method提升方式(sudo/su/runas)
ansible_become_user提升为指定用户
ansible_become_password提升密码

基本示例

(1) 主机变量

为特定主机定义变量,覆盖全局或组变量。

[webservers]
192.168.10.14 ansible_port=2222 ansible_user=root ansible_password=abc1234
(2) 组变量

为整个组定义变量,适用于组内的所有主机。

[webservers:vars]
ansible_user=root
ansible_password=abc1234
[all:vars]
ansible_port=22
(3) 组嵌套

通过组嵌套,将多个组组合成一个更大的组,便于统一管理。

[nginx]
192.168.10.20
192.168.10.21
192.168.10.22
[apache]
192.168.10.30
192.168.10.31
192.168.10.32
192.168.10.33
[webs:children]
nginx
apache

说明:通过组嵌套,可以将nginxapache组组合成webs组,便于统一管理所有Web服务器。

结语

  通过本文的介绍,您应该对Ansible有了一个全面的了解,包括其基本概念、运行机制、安装部署以及基础命令和模块操作。Ansible以其简单易用、功能强大和高度可扩展性,成为自动化运维领域的重要工具。无论是管理少量服务器还是大规模的基础设施,Ansible都能帮助您提高效率、降低复杂性,并确保系统的一致性和可靠性。
  在实际应用中,建议结合具体的业务需求,深入学习和使用Ansible的高级功能,如Playbook、角色(Roles)、模板(Templates)和变量(Variables)等,以实现更复杂和自动化的运维流程。同时,持续关注Ansible社区和官方文档,获取最新的功能更新和最佳实践,不断提升您的自动化运维能力。
  希望本文能为您的Ansible之旅提供有价值的指导和帮助,祝您在自动化运维的道路上取得更大的成功!

http://www.dtcms.com/a/403298.html

相关文章:

  • Zabbix7.4.8(三):通过Zabbix agent 2监控Docker相关指标
  • 小型个人网站制作网页打不开的原因及解决方法
  • Ansible 入门到实战:自动化运维的瑞士军刀
  • 嵌入式学习---(linux驱动)
  • k8s集群与gitlab registry连接
  • MySQL笔记---对表的操作
  • 【实战避坑】MySQL修改表字段长度完整指南:从语法、锁表机制到在线DDL详解
  • 乐峰网网站是谁做的海门住房和城乡建设局网站
  • 做公司简介的开源网站做网站推广前途
  • 了解学习Nginx反向代理与缓存功能
  • 【黑马程序员】后端Web基础--Maven基础和基础知识
  • Linux系统Nginx服务(三)
  • 新手向 算法 基数排序-yang
  • 怎么搭建php网站网页设计个人网站设计
  • 小淇云库-Python 虚拟环境选择:venv、conda、poetry 的适用场景对比
  • 芋道源码 - RabbitMQ + WebSocket 实现分布式消息推送
  • Spring Data JPA 语法详解与使用案例
  • 网站开发面试题天津公司建设网站
  • 个人怎么做音乐网站网页设计与制作教程刘瑞新课后答案
  • noi-9月23日作业
  • 购物网站每个模块主要功能怎么免费搭建网站
  • 如何高效使用Xshell和finalshell连接服务器,简单高效
  • Nestjs框架: 策略的权限控制(ACL)与数据权限实战
  • mmap 虚拟地址映射
  • 网站做好第二年要多少钱wordpress添加文件2m
  • Linux编程笔记2-控制数组指针函数动态内存构造类型Makefile
  • 【数据结构】冒泡、选择、插入、希尔排序的实现
  • npm镜像源配置指南
  • 【QT常用技术讲解】QTreeWidget实现树形筛选框(包含源码)
  • 站长工具ip查询外贸平台实训总结