目录
前言
一、概述
常见的开源自动化运维工具比较
二、ansible环境搭建
三、ansible模块
(一)、hostname模块
(二)、file模块
(三)、copy模块
(四)、fetch模块
(五)、user模块
(六)、group模块
(七)、cron模块
(八)、yum_repository模块
(九)、yum模块
(十)、service模块
(十一)、script模块
总结
公司的服务器越来越多, 维护一些简单的事情都会变得很繁琐。用shell脚本来管理少量服务器效率还行, 服务器多了之后, shell脚本无法实现高效率运维。这种情况下,我们需要引入自动化运维工具, 对多台服务器实现高效运维。
ansible是一种由Python开发的自动化运维工具,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
架构图
特点
部署简单
默认使用ssh进行管理,基于python里的==paramiko==模块开发
管理端和被管理端不需要启动服务
配置简单,功能强大,扩展性强
能过playbook(剧本)进行多个任务的编排
puppet(拓展)
基于ruby语言,成熟稳定。适合于大型架构,相对于ansible和saltstack会复杂些。
saltstack(拓展)
基于python语言。相对简单,大并发能力比ansible要好, 需要维护被管理端的服务。如果服务断开,连接就会出问题。
ansible
基于python语言。简单快捷,被管理端不需要启服务。直接走ssh协议,需要验证所以机器多的话速度会较慢。
一台管理
192.168.238.129(hd1)
两台被管理
192.168.238.130(hd2)
192.168.238.131(hd3)
防火墙设置、宽容模式(selinux )、NAT模式
所有主机都要配置主机名和 hosts文件
192.168.238.129
yum install -y epel-release
yum install -y ansible
设置免密登录
若不免密操作,在后面操作agent时都要加-k参数传密码;或者在主机清单里传密码。
ssh-keygen
ssh-copy-id hd2
ssh-copy-id hd3
vim /etc/ansible/hosts
若不进行免密会失败
免密后进行ping通测试(绿色为成功,红色为失败)
主机清单功能
因为未给自己免密所以129会失败
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
ansible支持的模块非常的多,我们并不需要把每个模块都记住,而只需要熟悉一些常见的模块,其它的模块在需要用到时再查询即可。
官网模块文档地址:Ansible Documentation
hostname模块用于修改主机名(注意: 它不能修改/etc/hosts文件)
基本格式为: ansible 操作的机器名或组名 -m 模块名 -a "参数1=值1 参数2=值2" argment
例:修改hd3的hostname
file模块:用于对文件相关的操作(创建, 删除, 软硬链接等)
stat模块:类似linux的stat命令,用于获取文件的状态信息 。(了解)
创建一个目录
ansible my -m file -a 'path=/test state=directory'
创建一个文件
注意:my组的验证文章中多数只截取了一台机器
ansible my -m file -a 'path=/test/1.txt state=touch'
递归修改owner,group,mode
ansible 192.168.238.130 -m file -a 'path=/root/OK recurse=yes owner=bin group=bin mode=1777'
创建文件并指定owner,group,mode等
ansible my -m file -a 'path=/test/1.txt state=file owner=bin group=daemon mode=1777'
也可以指定其中一项进行创建修改
删除文件
删除目录 absent(缺席的) 会连同目录里的所有文件,删除文件值删除对应文件
ansible my -m file -a 'path=/test/1.txt state=absent '
创建软链接文件
ansible my -m file -a 'src=/etc/fstab path=/opt/fstab state=link'
创建硬链接文件
ansible my -m file -a 'src=/etc/fstab path=/opt/fstab2 state=hard'
copy模块用于对文件的远程拷贝操作(如把本地的文件拷贝到远程的机器上)
echo master > OK
ansible my -m copy -a 'src=/root/OK dest=/opt/word'
content参数
使用content参数直接往远程文件里写内容(会覆盖原内容)
注意:ansible中-a后面的参数里也有引号时,记得要单引双引交叉使用,如果都为双引会出现问题。
ansible my -m copy -a 'content="hello\n" dest=/opt/word'
force参数
使用force参数控制是否强制覆盖
如果目标文件已经存在,则不覆盖 ansible my -m copy -a 'src=/root/OK dest=/opt/word force=no' 如果目标文件已经存在,则会强制覆盖 ansible my -m copy -a 'src=/root/OK dest=/opt/word force=yes'
backup参数
使用backup参数控制是否备份文件
backup=yes表示如果拷贝的文件内容与原内容不一样,则会备份一份 my的机器上会将/opt/word备份一份(备份文件命名加上时间),再远程拷贝新的文件为/opt/word ansible my -m copy -a 'src=/root/OK dest=/opt/word backup=yes owner=daemon group=daemon mode=1777'
"/"符号
copy模块拷贝时要注意拷贝目录后面是否带"/"符号
/etc/yum.repos.d后面不带/符号,则表示把/etc/yum.repos.d整个目录拷贝到/tmp/目录下 ansible my -m copy -a 'src=/etc/yum.repos.d dest=/mnt/' /etc/yum.repos.d/后面带/符号,则表示把/etc/yum.repos.d/目录里的所有文件拷贝到/tmp/目录下 ansible my -m copy -a 'src=/etc/yum.repos.d/ dest=mnt/'
fetch模块与copy模块类似,但作用相反。用于把远程机器的文件拷贝到本地。
注意: fetch模块不能从远程拷贝目录到本地
创建同名文件
user模块用于管理用户账号和用户属性。
创建aaa用户,默认为普通用户,创建家目录
ansible 192.168.238.130 -m user -a 'name=aaa state=present'
创建bbb系统用户,并且登录shell环境为/sbin/nologin
ansible 192.168.238.130 -m user -a 'name=bbb state=present system=yes shell="/sbin/nologin"'
创建ccc用户, 使用uid参数指定uid, 使用password参数传密码 (密码要用双引号引起来,单引号的话验证时会密码不正确)
echo 123123 | openssl passwd -1 -stdin
ansible 192.168.238.130 -m user -a 'name=ccc uid=2000 state=present password="$1$TyI.ymu/$bDnWZc.re9V/37HAZAgrf0"'
删除aaa用户,但家目录默认没有删除
ansible 192.168.238.130 -m user -a 'name=aaa state=absent'
删除bbb用户,使用remove=yes参数让其删除用户的同时也删除家目录
ansible 192.168.238.130 -m user -a 'name=bbb state=absent remove=yes'
创建一个普通用户叫badboy,并产生空密码 密钥对echo
ansible 192.168.238.130 -m user -a 'name=badboy generate_ssh_key=yes'
产生空密码指的是这个,并非空密码
group模块用于管理用户组和用户组属性。
创建组
ansible 192.168.238.130 -m group -a 'name=long gid=3000 state=present'
删除组(如果有用户的gid为此组,则删除不了)
ansible 192.168.238.130 -m group -a 'name=long state=absent'
ansible 192.168.238.130 -m group -a 'name=ss state=absent'
cron模块用于管理周期性时间任务。
创建一个cron任务,不指定user的话,默认就是root。
minute,hour,day,month,week不指定的话,默认都为*
ansible 192.168.238.130 -m cron -a 'name="test cron1" user=root job="touch /mnt/mnt.txt" minute=*/2'
删除cron任务
ansible 192.168.238.130 -m cron -a 'name="test cron1" state=absent'
yum_repository模块用于配置yum仓库。
注意:此模块只帮助配置yum仓库,但如果仓库里没有软件包,安装一样会失败。所以可以手动去挂载光驱。
增加一个/etc/yum.repos.d/local.repo配置文件 。(输入命令注意-a后引号)
ansible 192.168.238.130 -m yum_repository -a "name=local description=localyum baseurl=file:///mnt/ enabled=yes gpgcheck=no"
删除/etc/yum.repos.d/local.repo配置文件
ansible 192.168.238.130 -m yum_repository -a "name=local state=absent"
yum模块用于使用yum命令来实现软件包的安装与卸载。
使用yum安装一个软件(前提:被安装的机器上yum配置都已经OK)
ansible 192.168.238.130 -m yum -a 'name=dhcp state=present'
使用yum安装l软件,state=latest表示安装最新版本
ansible 192.168.238.130 -m yum -a 'name=dhcp state=latest'
使用yum卸载一个软件
ansible 192.168.238.130 -m yum -a 'name=dhcp state=absent'
service模块用于控制服务的启动,关闭,开机自启动等。
启动vsftpd服务,并设为开机自动启动
ansible 192.168.238.130 -m yum -a 'name=vsftpd state=present'
ansible 192.168.238.130 -m service -a 'name=vsftpd state=started enabled=on'
关闭vsftpd服务,并设为开机不自动启动
script模块用于在远程机器上执行本地脚本。
vim /root/test.sh
ansible 192.168.238.130 -m script -a '/root/test.sh'
command与shell模块
两个模块都是用于执行linux命令的,这对于命令熟悉的工程师来说,用起来非常high。
shell模块与command模块差不多(command模块不能执行一些类似$HOME,>,<,|等符号,但shell可以)
注意: shell模块并不是百分之百任何命令都可以,比如vim或ll别名就不可以。不建议大家去记忆哪些命令不可以,大家只要养成任何在生产环境里的命令都要先在测试环境里测试一下的习惯就好。
今天内容相当于可以舒缓下大脑了,没有zabbix那么繁琐的的流程。与基础命令的使用相似,只是在基础稍微扩展,模版较多,要理解含义再操作更有助于背记。