自动化运维工具ansible初探
-----------------------------------------------------------------------------------------------------------------------------------------------
ansible作为自动化运维工具篇幅会有很多,此篇只是初探,后面还会有内容
蓝绿环境:准备两套发布环境,一套依旧是老版本,一套是刚上线的新版本,升级后先将平台转换到新版本的环境,如果新版本不稳定,此时可以用调度器指到旧版本,平滑切换
灰度环境:抽取少数占比的服务器,发布新版本更新,这小部分服务器更新可以先让某个地区或者某些特定用户来提取使用,如果发现不稳定的地方可以及时修改,等到新版本稳定时再大批量更新
远程系统维护平常用ansible和saltstack
ansible:控制端,服务器是被控制端,配置简单,适合于中小型应用环境
saltstack:一般部署agent,配置复制,执行效率高
由于ansible也是基于openssh,所以管理起来最好还是需要基于key验证
ansible具有幂等性,也就是说某个任务执行一遍和执行n遍的效果一样,举例如果复制某个文件到100个服务器上,有些设备有该文件,有些设备没有该文件,此时执行结果是有该文件的设备将被跳过,没有的文件将会复制
ansible基于ssh服务无需代理,puppet或者saltstack需要安装代理
使用ansible管理服务器,需要满足两个条件:
(1)ansible控制机可以通过ssh连接到被控制机,基于key或者基于账户密码验证都可以
(2)被控制机的ip地址信息处于ansible的管理清单中
ansible,epel源安装,yum install ansible
1、控制机对被控制机建立基于key连接
配置文件
/etc/ansible/ansible.cfg 主配置文件
/etc/ansible/hosts 主机清单
/etc/ansible/roles 存放角色的目录
主配置文件
/etc/ansible/ansible.conf该文件一般不用更改,不过为了使用方便,建议
(1)搜索host_key_checking,将该项取消注释,其意为使用ssh连接时避免首次连接时让输入yes/no部分的提示,避免了批量操作的交互性
(2)搜索log_path,将该项取消注释,工作中还是需要查看ansible的日志文件
(3)搜索module_name,取消注视后将command改为shell
主机清单
[组1]
IP1
IP2
IP...
[组2]
IPm
IPn
192.168.1.[1:3]7 ===>>代表192.168.1.17,192.168.1.27和192.168.1.37
ansible用法
ansible IP -m MODULE -a 'CMD'
组名
ALL
MODULE:模块
ansible-doc -l,列出模块列表,截止到现在共1852个
ansible-doc CMD,列出该模块的详细说明用法
默认情况下模块是用command模块,因此如果我们输入command模块支持的命令,此时-m COMMAND可以省略不写,例如
但是该模块不支持逻辑关系重定向等符号,所以我们可以用-m shell 模块,或者修改/etc/ansible/ansible.conf将默认模块更改为shell,但此时如果再执行command模块就必须-m command了
举例说明
ansible centos7 -a 'echo hello > /app/hi'
没有key验证,通过密码口令执行时候,有一命令ansilbe CLASS -m ping -b -k -K -u USER --->解释-b:相当于sudo,-k:提示输入ssh的口令,-K:提示输入sudo口令,否则口令会被提示信息覆盖造成操作失败,-u 以远程主机某个用户的身份,使用sudo类需要在目标ip主机上添加sudo权限。命令举例:
ansible中的逻辑关系
通配符
(1)ansible "*" -m ping,代表全部
(2)ansible 192.168.1.* -m ping,代表192.168.1.0-192.168.1.254
(3)ansible "*srvs" -m ping,代表srvs结尾的组别
或关系
(1)ansible "centos6:centos7" -m ping,代表在centos6或centos7的主机
(2)ansible "192.168.1.10:192.168.1.20" -m ping,代表192.168.1.10或192.168.1.1.20
与关系
ansible "centos6:¢os7" –m ping,代表在centos6和centos7的主机
非关系
ansible 'centos6:!centos7' –m ping,代表在centos6但不在centps7的主机
注意:此处为单引号
综合逻辑
ansible 'centos6:centos7:&redhat:!ubantu' –m ping,代表在centos6或者centos7的主机,这主机同时也在redhat,但不在ubantu
正则表达式
ansible "~(web|db).*\.chen\.com" –m ping,代表主机的网址符合web.chen.com或者db.chen.com
ansible常用模块
copy模块
(1)ansible CLASS -m copy -a 'src=/位置/文件 dest=/目标位置 mode=666 owner=chen'
src:源文件,dest:目标文件位置,mode:复制后赋予的权限,owner:复制后属于哪个拥有者
(2)ansible CLASS -m copy -a 'content="文本内容" dest=/位置/' --->文本内容复制到目标位置文件
fetch模块:抓取文件
ansible CLASS -m fetch -a 'src=/位置/文件 dest=/位置/' --->抓取目标源文件到本机位置
图片中可以看到ansible很智能的将ip作为文件夹包含了我们抓取的文件,避免了文件重名覆盖的问题
file模块:设置文件属性
(1)ansible CLASS -m file -a 'path=/位置/文件 owner=CLASS mode=640' --->设置路径文件拥有者为,权限是640
(2)ansible CLASS -m file -a 'src=/位置/文件 state=touch mode=777'
(3)ansible CLASS -m file -a 'src=/app/ancopy dest=/app/test state=link' --->建立软连接,目标文件是源文件的软链接,如果state=hard,则为创建硬链接
(4)ansible CLASS -m file -a 'path=/路径/目标文件 state=absent' --->删除文件,少了一幅图,指令如下ansible centos6 -m file 'path=/app/test state=absent'
注如果path=/app,将删除/app整个目录,如果该/app是个挂载点将不被删除,只是删除其中的所有文件
hostname模块:管理主机名
ansible CLASS -m hostname -a 'name=NAME'
cron模块:计划任务
(1)ansible CLASS -m cron -a 'name=NAME minute=* job="CMD"' --->创建计划任务,格式和cron计划任务一样,注意job后面指令属于描述,需要引号
(2)ansible CLASS -m cron -a 'name=NAME state=absent' --->删除计划任务,如果删除上图的计划任务,指令为ansible centos6 -m cron -a 'name=ntptime state=absent'
(3)ansible CLASS -m cron -a 'name=NAME disabled=true job="CMD"' --->禁用计划任务,再次启用时输入指令ansible CLASS -m cron -a 'name=NAME job="CMD"'即可
yum模块:安装
ansible CLASS -m yum -a 'name=PACKAGE state=installed' --->安装,state的选项有present、install和latest,present、installed 是指安装套件,而 latest是安装最新版,也就是启用epel源
ansible CLASS -m yum -a 'name=PACKAGE state=absent',卸载
service模块:服务管理模块
ansible CLASS -m service -a 'name=SERVICE state=started' --->开启服务
state的状态有:started开始、stopped停止、reloaded重载、restarted重启
user模块:用户管理
(1)ansible CLASS -m user -a 'name=NAME comment="描述" uid=1000 home=/home/NAME group=GROUP' --->建立普通用户
(2)ansible CLASS -m user -a 'name=NAME uid=200 home=/usr/bin/ system=yes group=root groups=bin,daemon shell=/sbin/nologin' --->建立系统用户,group:主组,groups:附加组,shell:用户shell类型
(3)ansible CLASS -m user -a 'name=NAME state=absent' --->删除用户,不删除家目录
ansible CLASS -m user -a 'name=NAME state=absent remove=yes' --->删除用户,同时删除家目录
group模块:组管理
(1)ansible CLASS -m group -a 'name=NAME system=yes' --->创建系统组
(2)ansible CLASS -m group -a 'name=NAME state=absent' --->删除组
script模块:运行脚本
ansible CLASS -m script -a "/路径/脚本"
总结
我们可以发现,在大部分模块中,如果指令基本都是按照公式ansible CLASS -m MODULE -a 'name=NAME 其它扩展项',需要注意的是,当-a后的单引号(双引号)中出现需要描述的文字或者cron模块中的job时,描述性文字需要加上双引号(单引号),举例说明ansible CLASS -m cron -a 'name=NAME minute=* job="CMD"',也可以写作ansible CLASS -m cron -a "name=NAME minute=* job='CMD'",但两个引号不能是同一种引号
删除时候是ansible CLASS -m MODULE -a 'name=NAME state=absent'