Ansible自动化运维工具及其常用模块(1)
Ansible自动化运维工具及其常用模块(1)
一、Ansible简介
1. Ansible概述
Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Puppet和Saltstack能实现的功能,Ansible基本上都可以实现。
2. Ansible作用
Ansible能批量配置、部署、管理上千台主机。比如以前需要切换到每个主机上执行的一或多个操作,使用Ansible只需在固定的一台Ansible控制节点上去完成所有主机的操作。
3. Ansible的工作模块
Ansible是基于模块工作的,它只是提供了一种运行框架,它本身没有完成任务的能力,真正执行操作的是Ansible的模块, 比如copy模块用于拷贝文件到远程主机上,service模块用于管理服务的启动、停止、重启等。
4. 常用的自动化运维工具及区别
5. Ansible的主要特点
Ansible其中一个比较鲜明的特性是Agentless,即无Agent的存在,它就像普通命令一样,并非C/S软件,也只需在某个作为控制节点的主机上安装一次Ansible即可,通常它基于ssh连接来控制远程主机,远程主机上不需要安装Ansible或其它额外的服务。
Ansible的另一个比较鲜明的特性是它的绝大多数模块都具备幂等性(idempotence)。所谓幂等性,指的是多次操作或多次执行对系统资源的影响是一致的。比如执行 systemctl stop xxx 命令来停止服务,当发现要停止的目标服务已经处于停止状态, 它什么也不会做,所以多次停止的结果仍然是停止,不会改变结果,它是幂等的,而 systemctl restart xxx 是非幂等的。
Ansible的很多模块在执行时都会先判断目标节点是否要执行任务,所以,可以放心大胆地让Ansible去执行任务,重复执行某个任务绝大多数时候不会产生任何副作用。
6. Ansible的工作机制
使用者在使用时,在服务器终端输入命令或者playbooks,会通过预定好的规则将playbook拆解为play,再组织成ansible可以识别的任务,调用模块和插件,根据主机清单通过SSH将临时文件发给远程的客户端执行并返回结果,执行结束后自动删除
安装ansible ,选择的是yum 安装,简单,ansible的管理端必须是Linux系统
YUM是一个shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。
首先得安装EPRL源,然后才能安装ansible。EPEL是一个软件仓库项目,为RHEL和Centos提供它们默认提供的软件包
yum -y install epel-release
yum -y install ansible
yum源用163源的可以安装epel-release,用镜像挂载的没有这个包,自己写的一个简单的163yum源执行脚本
vim update_yum.sh
#!/bin/bash
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
cd /etc/yum.repos.d
user_id=`rpm -q centos-release | awk -F"-" '{print $3}'`
if [ $user_id -eq 7 ] ;then
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo 如果脚本执行有问题就输入这条命令,centos7用的比较多
elif [ $user_id -eq 6 ] ;then
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
elif [ $user_id -eq 5 ] ;then
wget http://mirrors.163.com/.help/CentOS5-Base-163.repo
fi
yum clean all
yum makecache
二、Ansible部署
1. Ansible环境安装部署
服务器 | IP地址 | 主机名 | 主要软件 |
管理端 | 192.168.10.2 | ansible | ansible |
被管理端 | 192.168.10.3 | node1 | - |
被管理端 | 192.168.10.4 | node2 | - |
被管理端 | 192.168.10.5 | node3 | - |
2. 管理端安装ansible
cd /etc/yum.repos.d
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
[root@ansible ~]# yum install -y epel-release.noarch
[root@ansible ~]# yum install -y ansible
[root@ansible ~]# ansible --version
3. ansible目录结构
[root@ansible ~]# yum -y install tree
[root@ansible ~]# tree /etc/ansible
/etc/ansible
├── ansible.cfg
├── hosts
└── roles
ansible.cfg
ansible的配置文件,一般无需修改
hosts
ansible的主机清单,用于存储需要管理的远程主机的相关信息
roles
公共角色目录
4. 配置主机清单
[root@ansible ~]# cd /etc/ansible/
[root@ansible ansible]# vim hosts
##配置组名
[webservers]
#组里面包含的被管理的主机IP地址或主机名
#主机名需要先修改/etc/hosts文件,更新ip映射
192.168.10.3
192.168.10.4
192.168.10.5
[dbservers]
192.168.10.3
192.168.10.4
192.168.10.5
如果配置了/etc/hosts,可以写主机名,例如node1,node2,node3
5. 配置密钥对验证
5.1 生成密钥对
[root@ansible ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):密钥对存放路径
回车,即使用默认路径
Enter passphrase (empty for no passphrase):输入私钥保护密码
回车,即无密码
Enter same passphrase again:再次输入
回车,即无密码
Your identification has been saved in /root/.ssh/id_rsa. 私钥
Your public key has been saved in /root/.ssh/id_rsa.pub. 公钥
The key fingerprint is:
SHA256:Vzp9tTv3No2kGeSNkYJ1AjTmNBa+7C5388H3tvFk+hw root@ansible
The key's randomart image is:
+---[RSA 2048]----+
| .Xo |
| * oo . |
| oo o.. .|
| ....++ ..|
| S ++.+.. |
| . . o+.o .|
| . o=.E=|
| ... o oo.B@|
| o.. o. .=O|
+----[SHA256]-----+
5.2 复制公钥至node,输入yes和password
[root@ansible ~]# ssh-copy-id root@192.168.10.3
[root@ansible ~]# ssh-copy-id root@192.168.10.4
[root@ansible ~]# ssh-copy-id root@192.168.10.5
截图以node1为例
5.3 验证
[root@ansible ~]# ssh root@192.168.10.3
[root@ansible ~]# ssh root@192.168.10.4
[root@ansible ~]# ssh root@192.168.10.5
三、Ansible命令行模块
命令格式:ansible <组名> -m <模块> -a <参数列表>
ansible-doc -l
列出所有已安装的模块,按q退出
1. command模块
在远程主机执行命令,不支持管道,重定向等shell的特性。
1.1 列出指定模块的描述信息和操作动作
ansible-doc -s command
例:指定组执行ping
在ansible中使用选项-i或--inventory-file指定Inventory
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m ping
如果第一次没有一次性输完,可以在第二次把剩下的补上
再次ping,就直接OK
如果使用的是默认配置文件(/etc/ansible/hosts),也可以不指定inventory文件
[root@ansible ~]# ansible webservers -m ping
node3 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
node2 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
node1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
1.2 指定ip(主机)执行操作,如果/etc/ansible/hosts配置文件的组里写的是IP地址,就指定IP地址,如果是主机名,就指定主机名
ansible 192.168.10.3 -m command -a 'date' 查看当前时间
[root@ansible ~]# ansible node1 -m command -a 'date'
node1 | CHANGED | rc=0 >>
2022年 01月 13日 星期四 11:50:28 CST
1.3指定组执行操作
格式
ansible 组名 -m command -a '操作'
只对webservers组中node1操作。通--limit参数限定主机的变更
查看node1当前目录下的所有目录和文件
[root@ansible ~]# ansible webservers -m command -a "ls" --limit "node1"
node1 | CHANGED | rc=0 >>
anaconda-ks.cfg
initalize.sh
查看node1的磁盘使用情况
[root@ansible ~]# ansible webservers -m command -a "df -hT" --limit "node1"
node1 | CHANGED | rc=0 >>
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 17G 1.1G 16G 7% /
devtmpfs devtmpfs 478M 0 478M 0% /dev
tmpfs tmpfs 489M 0 489M 0% /dev/shm
tmpfs tmpfs 489M 6.8M 482M 2% /run
tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sr0 iso9660 4.3G 4.3G 0 100% /media/cdrom
/dev/sda1 xfs 1014M 125M 890M 13% /boot
tmpfs tmpfs 98M 0 98M 0% /run/user/0
查看webservers组内的所有主机的当前目录下的目录和文件
[root@ansible ~]# ansible webservers -m command -a "ls"
打印当前路径
[root@ansible ~]# ansible webservers -m command -a "pwd"
1.4 all代表所有主机
看似没区别,是因为2个组的组成员是一样的
[root@ansible ~]# ansible all -m command -a "pwd"
node3 | CHANGED | rc=0 >>
/root
node2 | CHANGED | rc=0 >>
/root
node1 | CHANGED | rc=0 >>
/root
1.5 如省略-m模块,则默认运行command模块
[root@ansible ~]# ansible all -a 'pwd'
1.6 常用的参数
chdir:在远程主机上运行命令前提前进入目录
creates:判断指定文件是否存在,如果存在,不执行后面的操作
removes:判断指定文件是否存在,如果存在,执行后面的操作
[root@ansible ~]# ansible all -m command -a "chdir=/root ls ./"
[root@ansible ~]# ansible all -m command -a "creates=/shsfh ls ./"
[root@ansible ~]# ansible all -m command -a "creates=/root ls ./"
[root@ansible ~]# ansible all -m command -a "removes=/root ls ./"
[root@ansible ~]# ansible all -m command -a "removes=/aa ls ./"
2. shell模块
在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开有一个子shell运行命令(支持管段符号等功能)
[root@ansible ~]# ansible-doc -s shell
2.1 创建用户/更改密码
ansible webservers -m shell -a 'useradd test'
ansible webservers -m shell -a 'echo 123456 | passwd --stdin test'
删除用户
ansible webservers -m shell -a 'userdel -r test'
确认用户是否删除
ansible webservers -m shell -a 'tail -3 /etc/passwd'
ansible webservers -m shell -a 'ls /home'
2.2 查看ip
ansible webservers -m shell -a 'ifconfig ens34 | awk "NR==2 {print $2}"'
ansible webservers -m shell -a 'echo $(ifconfig ens34 | awk "NR==2 {print}") |cut -d " " -f 2'
3. cron模块
在远程主机定义任务计划。其中有两种状态(state):present表示添加(默认,可省略),absent表示移除
3.1 列出指定模块的描述信息和操作动作
ansible-doc -s cron
3.1 常用的参数
minute/hour/day/month/weekday:分/时/日/月/周
job:任务计划要执行的命令
name:任务计划的名称
3.2 设置计划任务
ansible webservers -m cron -a 'minute="*/1" job="/bin/echo helloworld" name="test crontab"'
3.3 查看计划任务
ansible webservers -a 'crontab -l'
3.4 移除计划任务
ansible webservers -m cron -a 'name="test crontab" state=absent'
ansible webservers -a 'crontab -l'
移除计划任务,若该计划任务没有取名字,name=None即可。
若有多个计划任务没有取名字,name=None将批量删除所有未取名任务。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构