Ansible
随着运维自动化经历了从本地部署到基础设施即服务(IaaS)、平台即服务(PaaS)在到软件即服务(SaaS)的发展阶段,掌握多种自动化运维工具就成了运维人员必备技能之一,ansible就是目前国内使用比较广泛的自动化运维工具之一。
工具介绍
简介
ansible是基于SSH协议的自动化运维工具,使用Python开发的,使用起来灵活、简单。
可以非常方便的实现批量系统配置、批量程序部署、批量运行命令等操作。
特性
模块化:
调用特定的模块,完成特定任务
有Paramiko,PyYAML,Jinja2(模板语言)三个关机模块
支持自定义模块
基于Python语言实现
部署简单,基于python和SSH(默认已安装),agentless
安全,基于OpenSSH
支持playbook编排任务
幂等性
一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
无需代理不依赖PKI(无需ssl)
可使用任何编程语言写模块
YAML格式,编排任务,支持丰富的数据结构
较强大的多层解决方案
主要组成部分
- API:供第三方程序调用的应用程序编程接口
- Inventory:Ansible管理主机清单,存放在/etc/ansible/hosts
- Modules:模块,Ansible执行命令的功能的模块,多个命令的组合
- Playbook:剧本,多个模块的组合,编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
- Plugins:模块功能的补充,如连接类型的插件、循环插件、变量插件、过滤插件等,该功能不常用
- Ansible:组合Inventory、API、Modules、Plugins的绿框,可以理解为是ansible命令工具,其为核心执行工具
相关文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主机清单文件
/etc/ansible/rules 角色目录
程序:
/usr/bin/ansible 主程序,临时命令执行工具
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具/usr/bin/ansible-pull
远程执行命令的工具:
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于Console界面与用户交互的执行工具
/etc/ansible/ansible.cfg ansible
配置文件(一般保持默认)
[defaults]
#forks = 5 并发执行数量,默认5
#poll_interval = 15 拉取数据间隔时间,默认15秒
#sudo_user = root sudo命令默认用户
#remote_port = 22 连接远程端口号
#host_key_checking = False 检查对应服务器的host_key,##建议取消注释
#log_path=/var/log/ansible.log 日志文件,##建议取消注释
ansible 命令介绍
功能:通过ssh实现配置管理、应用部署、任务执行等功能
建议:配置ansible端能基于密钥认证的方式联系各被管理节点
格式:ansible
常用选项:
–version 显示版本
-m module 指定模块,默认为command
-v 详细过程 –vv -vvv更详细
–list-hosts 显示主机列表,可简写—list
-k, –ask-pass 提示连接密码,默认Key验证
-K, –ask-become-pass 提示输入sudo
-C, –check 检查,并不执行
-T, –timeout=TIMEOUT 执行命令的超时时间,默认10s
-u, –user=REMOTE_USER 执行远程执行的用户
-b, –become 代替旧版的sudo 切换
匹配主机的列表
ALL 表示列表中的所有主机
示例:
ansible all -m ping
* 支持通配符
示例:
ansible “*” -m ping
ansible 192.168.1.* -m ping
ansible “*srvs” -m ping
或关系
示例:
ansible “websrvs:appsrvs” -m ping
ansible “192.168.1.10:192.168.1.20” -m ping
逻辑与
ansible “websrvs:&dbsrvs” -m ping
在websrvs组,但不在dbsrvs组中的主机
逻辑非
ansible ‘websrvs:!dbsrvs’ -m ping
综合逻辑
ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ -m -ping
正则表达式
ansible “websrvs:&dbsrvs” -m ping
ansible “~(web|db).*\.magedu\.com” -m ping
常用模块
简单介绍常用模块如何使用,模块的参数仅是常用的参数,完整具体的参数,请参考ansible文档,或者使用ansible-doc
命令查看模块的帮助文档。
command 执行命令
ansible的默认模块,因此可以省略-m
参数。
ansible lanyulei -m command -a "hostname"
ansible lanyulei -a "hostname"
shell 执行shell命令
与上面的command基本相同,但shell模块兼容性更好。
例如:当命令中需要管道操作的时候,则不能使用command模块,需要使用shell模块来执行命令。
ansible lanyulei -m shell -a "ps -ef |grep ansible" -f 1
-f 参数表示每次返回多少条结果
yum 安装软件
推送脚本文件到远程主机,并远程执行脚本文件
ansible lanyulei -m yum -a "name=httpd state=installed"
参数介绍
name 指定要安装的软件包的名称
state 指定使用yum的方式
installed, present 安装软件包
removed, adsent 移除软件包
latest 安装目前最新的软件包
copy 推送文件
将本地文件推送到客户端
ansible lanyulei -m copy -a "src=/etc/hosts dest=/tmp/test.txt"
在推送覆盖远程主机文件时,对远程主机已有的文件进行备份,按照时间备份
ansible lanyulei -m copy -a "src=/etc/hosts desc=/tmp/test.txt backup=yes"
直接想远程机器文件内写入数据,并且直接覆盖远程文件内原有的数据
ansible lanyulei -m copy -a "content='bgx' dest=/tmp/test.txt"
参数介绍
src 要推送数据的源文件信息
dest 要推送到目标机器的啥路径
backup 对推送过去的文件,进行备份
content 直接在远程主机上对文件进行原地修改
group 推送文件的时候,指定文件属组
owner 推送文件的时候,指定文件属主
mode 推送文件的时候,指定文件权限
fetch 拉取文件
文件拉取模块主要是将远程主机中的文件拷贝到本机中,和copy模块的作用刚刚相反,并且在保存的时候使用hostname来进行保存,当文件不存在的时候,会出现错误,除非设置了选项fail_on_missing为yes
ansible lanyulei -m fetch -a "dest=/opt src=/tmp/cron.txt"
详细参数可参考
ansible-doc -s fetch
service 启停服务
启动或者停止服务
ansible lanyulei -m service -a "name=httpd state=stopped enabled=yes"
参数介绍
name 定义要启停的服务名称
state 指定服务状态,停止或者启动
started 启动
stopped 停止
restarted 重启
reloaded 重载
enabled 是否让服务开机自启动
script 执行脚本文件
在本地运行模块,等同于在远程执行,不需要将脚本文件进行文件推送,就可以执行
ansible lanyule -m script -a "/tmp/test.sh"
user 用户管理
操作系统的用户
创建用户,并配置对应的用户密码(-1 表示使用MD5进行加密)
passwd=`echo "lanyulei" | openssl passwd -1 -stdin`
ansible lanyulei -m user -a "name=lanyulei password='$passwd'"
创建用户,设置uid为888, 并加入gid为888的组
ansible lanyulei -m user -a "name=lanyulei uid=888 group=888 shell=/sbin/nologin create_home=no"
参数介绍
uid 指定用户的uid
group 指定用户组名称
groups 指定附加组名称
password 设置用户密码
shell 指定用户登陆的shell
create_home 是否创建家目录
group 组管理
操作系统的用户组
创建组
ansible lanyulei -m group -a "name=lanyulei gid=888"
参数介绍
name 指定创建的组名
gid 指定组的gid
state
absent 移除远程主机的组
present 创建远程主机的组
file 目录及文件操作
对目录及文件进行操作
创建目录
ansible lanyulei -m file -a "path=/tmp/lanyulei state=diretory"
创建文件
ansible lanyulei -m file -a "path=/tmp/lanyulei state=touch mode=555 owner=root group=root"
创建链接文件
ansible lanyulei -m file -a "src=/tmp/lanyulei path=/tmp/lanyulei_link state=link"
参数介绍
path 指定远程主机目录或者文件信息
recurse 递归授权
state
directory 在远程主机上创建目录
touch 在远程主机上创建文件
link/hard 在远程主机上给文件或者目录创建链接文件
absent 删除远程主机上的目录或者文件
mode 设置远程主机上文件或者目录的权限
owner 设置远程主机上文件或者目录的属主
group 设置远程主机上文件或者目录的属组
cron 定时任务
操作crontab定时任务
创建一个定时任务
ansible lanyulei -m cron -a "minute=* hour=* day=* month=* weekday=* job='/bin/sh /tmp/test.sh'"
默认全都是*,因此可以写成如下:
ansible lanyulei -m cron -a "job='/bin/sh /tmp/test.sh'"
设置定时任务注释信息,防止重复,name设定
ansible lanyulei -m cron -a "name='cron2' job='/bin/sh /tmp/test.sh'"
删除相应的定时任务
ansible lanyulei -m cron -a "name='ansible cron2' minute=0 hour=0 job='/bin/sh /tmp/test.sh' state=absent"
注释相应的定时任务,使定时任务失效
ansible lanyulei -m cron -a "name='ansible cron2' minute=0 hour=0 job='/bin/sh /tmp/test.sh' disabled=no"
mount 挂载
用于挂载的模块
ansible lanyulei -m mount -a "path=/backup src=192.168.1.131:/data fstype=nfs opts=defautls,noatime state=mounted"
参数介绍
state
present 开机挂载,仅将挂载配置写入/etc/fstab,但是不会执行挂载的操作
mounted 挂载设备,并将配置写入/etc/fatab
unmounted 临时卸载设备,不会清除/etc/fstab写入的配置
absent 卸载设备,会清理/etc/fstab写入的配置
参考:
http://www.178linux.com/99715
http://edu.51cto.com/course/15617.html