Ansible自动化运维工具及基础用法

文章目录


前言

Ansible作为自动化运维工具,凭借其无代理架构与声明式配置,在IT基础设施管理中扮演关键角色。本文将从概述、特性、机制到实操部署与模块应用,系统梳理Ansible的核心知识体系。


一、ansible概述

Ansible 是一款面向类 Unix 系统的自由开源配置和自动化工具,由 Python 编写。与 SaltStack、 Puppet、Chef 相似,但具有以下优势:

  • 无需在被管理节点安装客户端,轻量级。
  • 通过 SSH 协议与节点通信。
  • 使用 YAML 和 Jinja2 模板语言进行配置和自动化任务编排。

总结:批量管理主机(服务器、网络设备等)的自动化工具

官网下载地址:https://www.ansible.com/

二、ansible特点

  1. 部署简单,管理端安装即可,被控端无需操作。
  2. 默认使用 SSH 协议管理设备。
  3. 集中化管理,支持主从模式。
  4. 配置简洁、功能强大、扩展性高。
  5. 支持 API 和自定义模块,可通过 Python 扩展。
  6. Playbook 可实现复杂任务配置和状态管理。
  7. 对云计算和大数据平台支持良好。

三、ansible工作机制

Ansible 通过 SSH 将模块推送到被管理节点执行,执行完后自动删除。可结合 SVN 等工具管理自定义模块及任务编排。

Ansible 核心组成:

  1. Ansible:核心引擎
  2. Modules:内置核心模块和自定义模块
  3. Plugins:补充模块功能,如连接插件、邮件插件等
  4. Playbooks:剧本,定义多任务操作
  5. Inventory:主机清单

四、ansible角色(roles)

随着数据中心环境复杂化,Playbook 会变得庞大且难以维护。角色提供了对复杂任务的模块化管理:

  • 将任务组织为独立、可复用的剧本和文件
  • 提供从外部加载任务、处理程序、变量的机制
  • 可关联静态文件和模板
  • 满足通用需求,可重复使用
  • 严格的目录结构要求

五、ansible部署安装(管理端操作)

1、环境规划

管理端:192.168.10.105

被管理端:192.168.10.106

被管理端:192.168.10.107

2、下载安装ansible

bash 复制代码
# yum 下载成功即可用
yum install -y epel-release
yum install -y ansible

ansible目录结构:

3、配置主机清单

设置被管理端的组别。

如:vim /etc/ansible/hosts

bash 复制代码
[webservers]
192.168.10.106
[dbservers]
192.168.10.107

4、配置免密登入

方法一:

bash 复制代码
ssh-keygen -t rsa # 生成密钥
# 先登入一次,触发完指纹验证,再进行公钥复制传输
# ssh第一次连接陌生主机会触发校验,不能直接sshpass去复制传输公钥
ssh root@192.168.10.106
ssh root@192.168.10.107
sshpass -p '123456' ssh-copy-id root@192.168.10.106
sshpass -p '123456' ssh-copy-id root@192.168.10.107

方法二:

直接跳过校验,使用密码去登入用户并复制公钥

bash 复制代码
sshpass -p "123456" ssh-copy-id -o StrictHostKeyChecking=no root@192.168.10.106
sshpass -p "123456" ssh-copy-id -o StrictHostKeyChecking=no root@192.168.10.107

六、ansible基础命令和操作

1、命令格式

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

2、常用模块示例

2.1、command模块

远程执行命令,不支持管道和重定向。在/etc/ansible目录下

bash 复制代码
#-s 列出指定模块的描述信息和操作动作
ansible-doc -s command
#指定 ip 执行 date
ansible 192.168.10.106 -m command -a 'date'
#指定组执行 dat
ansible webservers -a 'date'
#指定组执行 date
ansible webservers -m command -a 'date'
#all 代表所有 hosts 主机
ansible all -m command -a 'date'
#如省略 -m 模块,则默认运行 command模块
ansible all -a 'ls /'

结果示例:

chdir:在远程主机上运行命令前提前进入目录

creates:判断指定文件是否存在,如果存在,不执行后面的操作

removes:判断指定文件是否存在,如果存在,执行后面的操作

bash 复制代码
# chdir=/home:执行命令前先切换到 /home 目录
ansible test1 -m command -a 'chdir=/home ls ./'
# 示例:若 /root/ab.txt 不存在,则执行 touch /root/ab.txt 创建文件
ansible test1 -m command -a 'creates=/root/ab.txt touch /root/ab.txt'
# 示例:若 /root/ab.txt 存在,则执行 rm -f /root/ab.txt 删除文件
ansible test1 -m command -a 'removes=/root/ab.txt rm -f /root/ab.txt'

2.2、shell模块

bash 复制代码
# 用于查看 shell 模块的精简帮助片段
ansible-doc -s shell
# 输出数值
ansible dbservers -m shell -a 'echo 123456'
# 输出ip地址 awk识别{print $2}失效,因为是shell脚本所以应该加转义符awk "NR==2 {print \$2}"
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print $2}")'
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print $2}") | cut -d " " -f2'
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print \$2}")'

2.3、cron 模块

present表示添加(可以省略),absent表示移除。

常用的参数:

minute/hour/day/month/weekday:分/时/日/月/周

job:任务计划要执行的命令

name:任务计划的名称

bash 复制代码
ansible-doc -s cron #按 q 退出
ansible test1 -m cron -a 'minute="*/1" job="/bin/echo hello > /root/aaa.txt" name="testhello"'
ansible test1 -a 'crontab -l'
# 移除计划
ansible test1 -m cron -a 'name="testhello" state="absent"'

2.4、user模块

常用参数

bash 复制代码
name:用户名,必选参数
state=present|absent:创建账号或者删除账号,present表示创建,absent表示删除
system=yes|no:是否为系统账号
uid:用户uid
group:用户基本组
shell:默认使用的shell
move_home=yse|no:如果设置的家目录已经存在,是否将已经存在的家目录进行移动
password:用户的密码,建议使用加密后的字符串
comment:用户的注释信息
remove=yes|no:当state=absent时,是否删除用户的家目录
bash 复制代码
ansible-doc -s user
#创建用户
ansible dbservers -m user -a 'name="test02"'
ansible dbservers -a 'tail /etc/passwd'
#删除用户
ansible dbservers -m user -a 'name="test02" state=absent'

2.5、group模块

bash 复制代码
# 用户组管理
ansible-doc -s group
ansible dbservers -m group -a 'name=sjjcxk gid=306 system=yes'
ansible dbservers -a 'tail /etc/passwd'
#system=yes 明确告诉 Ansible / 系统:这个 mysql 组是为「系统服务(如 MySQL 进程)」准备的,而非给普通用户使用;
ansible dbservers -m user -a 'name="test02" uid="1005" system="yes" group=sjjcxk'
#查看用户组
ansible dbservers -a 'id test02'

2.6、copy模块

常用的参数:

bash 复制代码
dest:指出复制文件的目标及位置,使用绝对路径,如果是源目录,指目标也要是目录,如果目标文件已经存在会覆盖原有的内容
src:指出源文件的路径,可以使用相对路径或绝对路径,支持直接指定目录,如果源是目录则目标也要是目录
mode:指出复制时,目标文件的权限
owner:指出复制时,目标文件的属主
group:指出复制时,目标文件的属组
content:指出复制到目标主机上的内容,不能与src一起使用
bash 复制代码
ansible dbservers -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=640'
ansible dbservers -a 'ls /opt'
ansible dbservers -a 'cat /opt/fstab.bak'

ansible dbservers -m copy -a 'content="123456" dest=/opt/a1.bak owner=root mode=640'
ansible dbservers -a 'cat /opt/a1.bak'

2.7、file模块

bash 复制代码
# 设置文件属性
ansible-doc -s file
#修改文件的属主属组权限等
ansible dbservers -m file -a 'owner=root group=mysql mode=755 path="/opt/a1.bak"'
#设置/opt/fstab.link为/opt/fstab.bak的链接文件
ansible dbservers -m file -a 'path=/opt/a1.link src=/opt/a1.bak state=link'
#创建一个文件
ansible dbservers -m file -a 'path=/opt/a1.bak state=touch'
#删除一个文件
ansible dbservers -m file -a 'path=/opt/a1.bak state=absent' 

2.8、hostname

bash 复制代码
#管理主机名
ansible dbservers -m hostname -a "name=test02"

2.9、ping模块

测试主机联通性

bash 复制代码
ansible all -m ping

2.10、yum模块

管理软件包

bash 复制代码
# 在远程主机上安装和卸载软件包
ansible-doc -s yum 

ansible webservers -m yum -a 'name=httpd'
ansible webservers -m yum -a 'name=httpd state=absent' 

2.11、service/systemd模块

常用的参数:

name:被管理的服务名称

state=started|stopped|restarted:动作包含启动关闭或者重启

enabled=yes|no:表示是否设置该服务开机自启

runlevel:如果设定了enabled开机自启去,则要定义在哪些运行目标下自启动

bash 复制代码
absible-doc -s service

ansible webservers -m service -a 'enabled=true name=httpd state=started' 

2.12、script模块

实现远程批量运行本地的 shell 脚本。将控制节点的脚本放到被控制节点去运行

bash 复制代码
ansible-doc -s script
# 在对应节点写入脚本
vim /opt/test.sh
#!/bin/bash
echo "hello ansible from script" > /opt/script.txt
chmod +x /opt/test.sh
ansible webservers -m script -a '/opt/test.sh'
ansible webservers -a 'cat /opt/script.txt'


2.13、setup模块

facts 组件是用来收集被管理节点信息的,使用 setup 模块可以获取这些信息

bash 复制代码
ansible-doc -s setup
ansible webservers -m setup #获取mysql组主机的facts信息
ansible dbservers -m setup -a 'filter=*ipv4' #使用filter可以筛选指定的facts信息

总结

本文系统介绍了Ansible的核心概念、工作机制及部署流程,通过常用模块示例展示了自动化配置管理能力。掌握Ansible可极大提升运维效率,实现基础设施即代码的现代化运维转型。

相关推荐
大猫和小黄4 小时前
Ubuntu环境下GitBlit安装部署与版本库迁移
linux·运维·git·ubuntu·gitblit
sdyeswlw4 小时前
一二三物联网医院后勤综合运维管理系统:让后勤保障更智能、更省心
运维·物联网
管理大亨5 小时前
光伏大棚智慧管理:ELK数据中枢
大数据·运维·elk·elasticsearch
未来之窗软件服务5 小时前
幽冥大陆(五十四)ASR C语言识别到自动化软件——东方仙盟筑基期
运维·自动化·仙盟创梦ide·东方仙盟·东方仙盟自动化·东方仙盟商业开发
凤凰战士芭比Q5 小时前
Jenkins(部署、基础项目)
运维·servlet·jenkins
倔强的石头1065 小时前
Linux 进程深度解析(四):环境变量 —— 进程的“环境 DNA”
linux·运维·服务器
沈健_算法小生5 小时前
Jenkins权限控制实现
运维·jenkins
Wpa.wk5 小时前
自动化测试-自动化测试用例流程设计
运维·经验分享·自动化·测试用例·测试流程·测试流程设计
qq_455760855 小时前
Docker - 镜像
linux·运维·docker