Ansible---自动化运维工具

1 Ansible—自动化运维工具

Ansible 是一个基于 Python 开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet 和 Saltstack 能实现的功能,Ansible 基本上都可以实现。
Ansible 能批量配置、部署、管理上千台主机。比如以前需要切换到每个主机上执行的一或多个操作,使用 Ansible 只需在固定的一台 Ansible 控制节点上去完成所有主机的操作。
Ansible 是基于模块工作的,它只是提供了一种运行框架,它本身没有完成任务的能力,真正执行操作的是 Ansible 的模块,比如 copy 模块用于拷贝文件到远程主机上,service 模块用于管理服务的启动、停止、重启等。
Ansible 其中一个比较鲜明的特性是Agentless,即无 Agent(代理端)的存在,它就像普通命令一样,并非 C/S 软件,也只需在某个作为控制节点的主机上安装一次 Ansible 即可,通常它基于 ssh 连接来控制远程主机,远程主机上不需要安装 Ansible 或其它额外的服务。
使用者在使用时,在服务器终端输入命令或者 playbooks,会通过预定好的规则将 playbook 拆解为 play,再组织成 ansible 可以识别的任务,调用模块和插件,根据主机清单通过 SSH 将临时文件发给远程的客户端执行并返回结果,执行结束后自动删除 Ansible 的另一个比较鲜明的特性是它的绝大多数模块都具备幂等性(idempotence)。所谓幂等性,指的是多次操作或多次执行对系统资源的影响是一致的。比如执行 systemctl stop xxx 命令来停止服务,当发现要停止的目标服务已经处于停止状态,它什么也不会做,所以多次停止的结果仍然是停止,不会改变结果,它是幂等的,而 systemctl restart xxx 是非幂等的。
Ansible 的很多模块在执行时都会先判断目标节点是否要执行任务,所以,可以放心大胆地让 Ansible 去执行任务,重复执行某个任务绝大多数时候不会产生任何副作用。
在这里插入图片描述

1.1 Ansible 自动运维工具特点

Ansible 与 Saltstack 均是基于 Python 语言开发,Ansible 只需要在一台普通的服务器上运行即可,不需要在客户端服务器上安装客户端。因为 Ansible 是基于 SSH 远程管理,而 Linux 服务器大都离不开 SSH,所以 Ansible 不需要为配置工作添加额外的支持。
Ansible 安装使用非常简单,而且基于上千个插件和模块实现各种软件、平台、版本的管理,支持虚拟容器多层级的部署。很多读者在使用 Ansible 工具时,认为 Ansible 比 Saltstatck 执行效率慢,其实不是软件本身慢,是由于 SSH 服务慢,可以优化 SSH 连接速度及使用 Ansible 加速模块,满足企业上万台服务器的维护和管理。

1.2 Ansible 运维工具原理

Ansible 分为控制端和被控端,主要是基于 SSH 协议去管理客户端,被控端是无需安装 Agent 插件的,Ansible 会读取控制端hosts文件,根据文件中定义 IP 列表信息,调取本地的各个模块对被控端机器实现批量、并发的配置管理和维护,如果任务比较复杂可以写成 PlayBook 剧本进行分发管理。

1.3 Ansible 自动运维管理工具优点

  • 轻量级,更新时,只需要在操作机上进行一次更新即可
  • 采用 SSH 协议
  • 不需要去客户端安装 agent
  • 批量任务执行可以写成脚本,而且不用分发到远程就可以执行
  • 使用 python 编写的,维护更简单
  • 支持 sudo 普通用户命令
  • 去中心化管理

2 安装 Ansible

2.1 Ansible 环境安装部署

管理端:192.168.16.10        ansible
被管理端:192.168.16.20
被管理端:192.168.16.30

2.2 管理端安装 Ansible

在线源安装

#安装epel扩展源
yum -y install epel-release   
yum -y install ansible

#树型查询工具
yum -y install tree
#ansible目录结构
tree /etc/ansible

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

2.3 配置主机清单

vim /etc/ansible/hosts   #编辑主机清单配置文件

[webservers]      #配置组名
192.168.16.16     #组里包含的被管理的主机IP地址或主机名(主机名需要先修改/etc/hosts文件)
192.168.16.18

[dbservers]
192.168.16.20

在这里插入图片描述

2.4 配置密钥对验证

ansible 默认使用 ssh 连接,所以管理前要免密登录

ssh-keygen -t rsa    #使用非对称密钥加密生成密钥对,一路回车,使用免密登录
ssh-copy-id root@192.168.16.16  #上传公钥到被控端主机

vim /etc/ssh/ssh_config
#修改35行 
StrictHostkeyChecking no

systemctl restart sshd
ssh-copy-id root@192.168.16.18

sshpass -p '121212' ssh-copy-id root@192.168.16.20

在这里插入图片描述
若登录不输入yes和密码,要修改 /etc/ssh/ssh_config 的配置
在这里插入图片描述
在这里插入图片描述

3 Ansible命令模块

命令格式:ansible <组名> -m [模块] [-a] <参数列表>

ansible-doc -l    #列出所有已安装的模块,按q退出

在这里插入图片描述

3.1 command 模块(默认模块)

在远程主机执行命令,不支持管道,重定向等shell的特性

#查看command模块信息
ansible-doc -s command      #-s列出指定模块的描述信息和操作动作

ansible 192.168.16.16 -m command -a 'date'      #指定 ip 执行date 
ansible webservers -m command -a 'date'   #指定组名执行date 
ansible dbservers -m command -a 'date'
ansible all -m command -a 'date'  #所有主机执行data命令,all代表所有hosts主机  

#不加-m模块,则默认使用command模块
ansible all -a 'date'

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

常用的参数

chdir在远程主机上运行命令前提前进入目录
creates判断指定文件是否存在,如果存在,不执行后面的操作
removes判断指定文件是否存在,如果存在,执行后面的操作

例1:chdir

ansible dbservers -m command -a 'ls -l /opt'
ansible dbservers -m command -a 'chdir=/opt ls ./'

在这里插入图片描述
查看192.168.16.20是否正确
在这里插入图片描述
例2:creates

#在192.168.16.20上
echo abc123 > abc123.txt  #新建一个文件

ansible dbservers -m command -a 'creates=/opt/abc123.txt ls -l'
ansible dbservers -m command -a 'creates=/opt/abc.txt ls -l'
ansible dbservers -m command -a 'creates=/opt/abc.txt touch /opt/abc.txt'

在这里插入图片描述
在这里插入图片描述
例3:removes

ansible dbservers -m command -a 'removes=/opt/abc.txt rm -f /opt/abc.txt'
ansible dbservers -m command -a 'removes=/opt/abc.txt touch /opt/abc.txt'

在这里插入图片描述

3.2 shell 模式

在远程主机执行命令,相当于调用远程主机的 shell 进程,然后在该 shell 下打开一个子shell运行命令(支持管道符号等功能)

#查看shell模块信息
ansible-doc -s shell

ansible dbservers -m shell -a 'echo helloworld > /opt/abc.txt'

ansible dbservers -m shell -a 'ifconfig'
ansible dbservers -m shell -a 'ifconfig ens33 | awk "NR==2 {print \$2}"'   #注意:在awk中$是普通字符,要加上\是位置变量

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

3.3 cron 模块

在远程主机定义任务计划,两种状态(state):present表示添加(可以省略),absent表示移除

#查看cron模块信息
ansible-doc -s cron   #按q退出

在这里插入图片描述

常用的参数

minute/hour/day/month/weekday分/时/日/月/周
job任务计划要执行的命令
name任务计划的名称
#webserver:分类  -m指定模块 -a输出模块内的指令  分钟:每分钟,工作:输出hello,工作名称:test crontab
ansible dbservers -m cron -a 'minute="*/1" job="/usr/bin/echo helloworld" name="test crontab"'

#查看计划性任务命令
ansible dbservers -a 'crontab -l'

#移除计划性任务,假如该计划任务没有取名字,name=None即可
ansible dbservers -m cron -a 'name="test crontab" state=absent'

在这里插入图片描述

例1:每两个月的10号的早上和晚上十点的第十分钟执行一次复制系统内核日志到/opt/

分时日月周
10 10,22 10 */2 * /usr/bin/cp /var/log/messages /opt/
ansible dbservers -m cron -a 'minute="10" hour="10,22" day="10" month="*/2" job="/usr/bin/cp /var/log/messages /opt/" name="test crontab"'

在这里插入图片描述

3.4 user 模块☆

user 模块是请求三条指令,useradd,userdel,usermod

#查看user模块信息
ansible-doc -s user

在这里插入图片描述

常用的参数

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时,是否删除用户的家目录
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

在这里插入图片描述

3.5 group 模块

group 模块请求的是 groupadd、groupdel、groupmod 模块

#查看模块信息用户组管理的模块
ansible-doc -s group

#system=yes 创建系统组
ansible dbservers -m group -a 'name=mysql gid=306 system=yes'

#查看组账户信息
ansible dbservers -a 'tail -1 /etc/group'

#创建用户并加入组
ansible dbservers -m user -a 'name=test01 uid=306 group=mysql system=yes'   #查看用户test01的用户id和组id信息
ansible dbservers -a 'tail -1 /etc/group'
ansible dbservers -a 'id test01'

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

3.6 copy 模块☆

对文件进行有效的复制,用于复制指定主机文件到远程主机的

#查看copy模块信息
ansible-doc -s copy

在这里插入图片描述

常用的参数

dest指出复制文件的目标及位置,使用绝对路径,如果源是目录,指目标也要是目录,如果目标文件已经存在会覆盖原有的内容
src指出源文件的路径,可以使用相对路径或绝对路径,支持直接指定目录,如果源是目录则目标也要是目录
mode指出复制时,目标文件的权限
owner指出复制时,目标文件的属主
group指出复制时,目标文件的属组
content指出复制到目标主机上的内容,不能与src一起使用
#mysql组中主机使用copy模块将控制端源文件/etc/fstab,复制到本地并更名,指出目标文件的权限和属主
ansible dbservers -m copy -a 'src=/etc/fstab dest=/opt/fstab.back owner=root mode=640' 

#查看mysql组中主机的/opt/fstab.back文件
ansible dbservers -a 'ls -l /opt'
ansible dbservers -a 'cat /opt/fstab.back'

#copy模块不仅可以复制文件、目录,也可以复制内容
ansible dbservers -m copy -a 'content="helloworld" dest=/opt/hello.txt'   #将helloworld写入/opt/hello.txt文件中
ansible dbservers -a 'cat /opt/hello.txt'   #查看目标文件内容

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

3.7 file 模块—设置文件属性☆

#查看file模块信息
ansible-doc -s file

ansible dbservers -m user -a 'name="test01"'   #创建用户test01
ansible dbservers -m group -a 'name=mysql gid=306 system=yes'

ansible dbservers -m file -a 'owner=test01 group=mysql mode=644 path=/opt/fstab.back'   #修改文件的属主属组权限等
ansible dbservers -a 'ls -l /opt/fstab.back'

#创建一个文件
ansible dbservers -m file -a 'path=/opt/abc.txt state=touch'

ansible dbservers -m file -a 'src=/opt/abc.txt path=/opt/abc.txt.link state=link'
ansible dbservers -a 'ls -l /opt'

#删除一个文件
ansible dbservers -m file -a 'path=/opt/abc.txt state=absent'

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

3.8 hostname 模块

#查看hostname模块信息
ansible-doc -s hostname

#用于管理远程主机上的主机名
ansible dbservers -m hostname -a 'name=myhost03'

在这里插入图片描述

3.9 ping 模块

#查看ping模块信息
ansible-doc -s ping

#检测远程主机的连通性
ansible all -m ping

在这里插入图片描述

3.10 yum 模块

#在远程主机上安装与卸载软件包
ansible-doc -s yum

ansible webservers -m yum -a 'name=httpd'      #安装服务
ansible webservers -m yum -a 'name=httpd state=absent'      #卸载服务

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

3.11 service/systemd 模块

用于管理远程主机上的管理服务的运行状态

#查看service模块信息
ansible-doc -s service

在这里插入图片描述

常用的参数

name被管理的服务名称
state=started | stopped | restarted动作包含启动关闭或者重启
enabled=yes | no表示是否设置该服务开机自启
rnlevel如果设定了enabled开机自启去,则要定义在哪些运行目标下自启动
ansible webservers -m yum -a 'name=httpd'      #安装服务

ansible webservers -a 'systemctl status httpd'  #查看web服务器httpd运行状态

ansible webservers -m service -a 'enabled=yes  name=httpd state=started'    #启动httpd服务

在这里插入图片描述

3.12 script 模块

实现远程批量运行本地的shell脚本

#查看script模块信息
ansible-doc -s script 

vim ansible.sh   #编写一个脚本
#!/bin/bash 
echo "hello ansible from script" > /opt/script.txt

chmod +x ansible.sh    #为该脚本进行赋权可执行 
ansible webservers -m script -a 'ansible.sh'     #使用script模块在所有主机上执行
ansible webservers -a 'cat /opt/script.txt'

在这里插入图片描述

3.13 setup 模块

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

#查看setup模块信息
ansible-doc -s setup 

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

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

4 inventory 主机清单

Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内。

如果是名称类似的主机,可以使用列表的方式标识各个主机。

vim /etc/ansible/hosts
[webservers]
192.168.16.16:2222  #冒号后定义远程连接端口,默认是ssh的22端口
192.168.16.1[6:9]
ansible webservers -a 'date'

[dbservers]
db-[a:f].example.org    #支持匹配a~f

在这里插入图片描述

4.1 inventory 中的变量

Inventory变量名含义
ansible_host ansible连接节点时的IP地址
ansible_port连接对方的端口号,ssh连接时默认为22
ansible_user连接对方主机时使用的主机名。不指定时,将使用执行ansible或ansible-playbook命令的用户
ansible_password连接时的用户的ssh密码,仅在未使用密钥对验证的情况下有效
ansible_ssh_private_key_file指定密钥认证ssh连接时的私钥文件
ansible_ssh_common_args提供给ssh、sftp、scp命令的额外参数
ansible_become允许进行权限提升
ansible_become_method指定提升权限的方式,例如可使用sudo/su/runas等方式
ansible_become_user提升为哪个用户的权限,默认提升为root
ansible_become_password提升为指定用户权限时的密码

4.1.1 主机变量

新开一台虚拟机并设置端口为2345
vim /etc/ssh/sshd_config
systemctl restart sshd

vim /etc/ansible/hosts
[webservers]
192.168.16.22 ansible_port=2345 ansible_user=root ansible_password=121212

ansible webservers -a 'date'

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

4.1.2 组变量

vim /etc/ansible/hosts
[dbservers:vars]    #表示为dbservers组内所有主机定义变量
ansible_user=root
ansible_password=121212

ansible webservers -a 'date'

在这里插入图片描述

4.1.3 组嵌套

vim /etc/ansible/hosts
[webservers]
192.168.16.18

[dbservers]
192.168.16.20

[webs:children]   #表示为webs主机组中包含了webservers组和dbservers组内的所有主机
[webservers]
[dbservers]

ansible webs -a 'date'

5 总结

1.Ansible 自动运维工具特点
agentless:不需要额外安装客户端软件,只要在一台主机上安装 ansible 即可通过 ssh 控制远程主机
ansible 是通过模块来执行操作的
幂等性:ansible 很多模块在执行时会判断远程主机是否已执行过这个任务,如果已执行且操作没有发生任何改变,则不会再去执行改变结果

2. ansible 命令模块
command 模块(默认模块)、shell 模式、cron 模块、user 模块☆、group 模块、copy 模块☆、file 模块—设置文件属性、 hostname 模块、ping 模块、yum 模块、service/systemd 模块、script 模块、setup 模块

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值