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 [-m module_name] [-a args]

常用选项:
–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