Ansible运维自动化
目录
一、简介
二、特性优点
1、特性
2、优点
三、ansible工作过程
四、Ansible应用场景
1、使用场景
2、命令执行
3、Ansible企业应用场景分析
(1)Dev开发环境
(2)测试环境
(3)发布环境
(4)生产环境
(5)灰度环境
五、ansible安装部署
1、ansible安装
2、目录结构
3、添加认证
4、ansible工作原理
5、ansible主要组成部分
(1)Ansible playbooks
(2)INVENTORY
(3)Modeules
(4)Plugins
(5)API
ANSIBLE.
6、Ansible组件调用关系
7、Ansible命令集
(1)命令格式:
(2)命令参数
示例1、测试
示例2、测试以wang用户执行命令
一、简介
Ansible 是一个自动化运维工具,12年Mchael DeHanan开发。基于python开发,集合目前主流运维工具优点,实现批量系统配置、程序部署、命令执行等功能。15年ansible被red hat 收购.想知道为什么被收购可以去看看这篇文章http://www.infoq.com/cn/news/2015/10/Red-Hat-DevOps。关于ansblie更多的介绍各位可以去官网看看http://docs.ansible.com/ansible/index.html
二、特性优点
1、特性
no agents :不需要在被管控主机上安装任何客户端
no server :无服务器端,使用时直接运行命令即可
modules in any languages :基于模块工具,可使用任意语言开发模块
yaml,not code :使用yaml语言定制剧本playbook
ssh by default:基于ssh工作
strong multi-tier solution:可实现多级指挥。
2、优点
轻量级,不需要安装客户端,更新时,只需要在操作机上进行一次更新即可
批量任务执行可以写成脚本,而且不用分发到远程就可以执行
使用python编写的,维护更简单
幂等性 幂等性不会重复执行相同的指令。例如不会重复安装软件
三、ansible工作过程
ansible默认是通过SSH通道来管理的,也就是它所说的免客户端方式管理
四、Ansible应用场景
1、使用场景
文件传输
2、命令执行
应用部署
配置管理
任务流编排
3、Ansible企业应用场景分析
通常情况下在企业中运维功能的整体流程。
(1)Dev开发环境
使用者:程序员
功能:程序员开发软件测试BUG的环境
管理者:千万不能是运维,一定是要程序员自已
(2)测试环境
使用者:qa测试工程师
功能:测试经过Dev环境测试通过的软件的功能
管理者:运维
备注:测试环境往往有多套(测试环境满足测试功能即可,不宜过多)
(1)测试同学希望测试环境有多套
公司的产品多产品线并发,即多个版本,意味着多个版本同步测试
(2)通常情况下,测试环境有多少套和产品线数量保持一样
(3)发布环境(代码发布机,有些公司堡垒机(安全屏障))
使用者:运维
功能:发布代码至生产环境
管理者:运维(有经验的)
发布机:往往需要有2台(主备)
(4)生产环境
使用者:运维,只能是运维(极少数情况下会开放权限给核心开发人员,极少数公司将该环境权限完全开放给开发人员并让开发人员维护)
功能:对用户提供公司产品的服务
管理者:只能是运维
生产环境服务器数量:一般比较多,且应用非常重要。往往需要自动工具协助部署配置应用。机器数量具体和公司业务规模相关。
(5)灰度环境(生产环境的一部分)
使用者:运维
功能:在全量发布代码前将代码的功能面向少量精准用户发布的环境
案例:
大家手头100台服务器,先发布其中的10台服务器,这10台服务器就是灰度服务器。
管理者:只能是运维
为什么灰度环境:往往该版本功能变更较大,为保险起见特意先让一部分用户优化体验该功能,待这部分用户使用没有重大问题的时候,再全量发布至所有服务器。
五、ansible安装部署
1、ansible安装
Yum install ansible –y
Pip install ansible
2、目录结构
配置文件目录:
/etc/ansible/
配置文件
ansible.cfg:主要设置一些ansible初始化信息,比如日志存放路径、模块、插件等配置信息。
Hosts:机器清单,进行分组管理
执行文件目录:
/usr/bin/
Lib库依赖目录:
/usr/lib/pythonX.X/site-packages/ansible/
Help文档目录:
/usr/share/doc/ansible-X.X.X/
Man文档目录:
/usr/share/man/man1/
3、添加认证
ssh-keygen -t rsa
ssh-copy-id -i .ssh/id_rsa.pub root@172.16.250.90
[root@centos7_1 ~]# ansible 172.16.250.90 -m ping
16.252.18 | SUCCESS => {
"changed":false,
"ping": "pong"
4、ansible工作原理
5、ansible主要组成部分
(1)Ansibleplaybooks
任务剧本(任务集),编排定义ansible任务集的配置文件,有ansible顺序依次执行,通常是JSON
格式的YML文件
(2)INVENTORY
ansible管理主机的清单,可以定义单独主机,也可以定义主机组。
(3)Modeules
ansible执行命令的功能模块,多数为内置的核心模块,也可自定义。Ansible2.2版本提供模块有500多
个,下面应用到核心模块有synchronize(备份)、copy(恢复)、shell(nas获取)、cron(定时任务)、
user(密码修改)、zypper(软件包管理rpm)、setup(获取facts);扩展模块有UPStartItem(启动项管
理)、UPInstall(软件包管理)、UPUPload(文件上传)
(4)Plugins
模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用。
(5)API
供第三方程序调用的应用程序编程接口
ANSIBLE
该部分图中表示不明显,组合INVENTORY、API、MODULES、PLUGINS的绿框大家可以理解
为是ansible命令工具,其为核心执行工具;
6、Ansible组件调用关系
使用者使用Ansible或Ansible-playbook(会额外读取Playbook文件)时,在服务器终端输入Ansible的Ad-
Hoc命令集或Playbook后,Ansible会遵循预先编排的规则将Playbooks逐条拆解为Play,再将Play组织成
Ansible可识别的任务(Task),随后调用任务涉及的所有模块(Module)和插件(Plugin),根据
Inventory中定义的主机列表通过SSH(Linux默认)将任务集以临时文件或命令的形式传输到远程客户
端执行并返回执行结果,如果是临时文件则执行完毕后自动删除。
7、Ansible命令集
/usr/bin/ansible # Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
/usr/bin/ansible-doc # Ansible 模块功能查看工具
/usr/bin/ansible-galaxy # 下载/上传优秀代码或Roles模块的官网平台,基于网络的
/usr/bin/ansible-playbook # Ansible 定制自动化的任务集编排工具
/usr/bin/ansible-pull # Ansible远程执行命令的工具(使用较少,海量机器时使用,对运维的架构能力要求较高)
/usr/bin/ansible-vault # Ansible 文件加密工具
/usr/bin/ansible-console # Ansible基于Linux Consoble界面可与用户交互的命令执行工具
(1)命令格式:
ansible<host-pattern> [options]
(2)命令参数
-a MODULE_ARGS, --args=MODULE_ARGS
module arguments # 指定Ansible调用的模块
--ask-become-pass ask forprivilege escalation password # Ansible su切换用户的时候使用该参数输入密码
-k,--ask-pass ask for SSHpassword # 以密码认证
--ask-su-pass ask for supassword (deprecated, use become) # su的时候使用该参数
-K,--ask-sudo-pass ask for sudo password(deprecated, use become) # sudo的时候
--ask-vault-pass ask forvault password # ansible-valut 加密文件
-BSECONDS, --background=SECONDS # 后台等待X秒
--become-user=BECOME_USER
run operations as thisuser (default=None) # su到哪个用户
-C,--check don't make any changes;instead, try to predict some
of the changes that mayoccur # 不执行命令只做命令执行检查
-c CONNECTION, --connection=CONNECTION
connection type to use(default=smart)
-eEXTRA_VARS, --extra-vars=EXTRA_VARS # 调用外部变量
set additionalvariables as key=value or YAML/JSON
-fFORKS, --forks=FORKS # Ansible一次命令执行并发的线程数
-h,--help show this help messageand exit
-iINVENTORY, --inventory-file=INVENTORY #Ansible调用的Hosts文件,默认/etc/ansible/hosts
specify inventory hostfile
(default=/etc/ansible/hosts)
-lSUBSET, --limit=SUBSET # 限定主机列表中的某台机器执行
further limit selectedhosts to an additional pattern
--list-hosts outputs alist of matching hosts; does not execute
anything else ## 列出主机列表中的主机
-mMODULE_NAME, --module-name=MODULE_NAME #Ansible 调用的执行模块
-M MODULE_PATH, --module-path=MODULE_PATH #调用的模块路径
-S,--su run operations with su(deprecated, use become) #使用su和become结合使用
-RSU_USER, --su-user=SU_USER # su的话切换至哪个用户
-s,--sudo run operations withsudo (nopasswd) (deprecated, use
become) # 执行sudo命令
-USUDO_USER, --sudo-user=SUDO_USER # sudo
-TTIMEOUT, --timeout=TIMEOUT # 执行命令的超时时间
--vault-password-file=VAULT_PASSWORD_FILE ## ansible-vault加密的密码文件
-v,--verbose verbose mode (-vvv formore, -vvvv to enable
connectiondebugging) # 显示详细信息 -vvvv
--version showprogram's version number and exit ## 显示版本号
修改配置文件 指定目标主机
[root@centos7_1 ~]# vim/etc/ansible/hosts
[web]
172.16.252.18
示例1、测试
[root@centos7_1 ~]#ansible web -m ping
172.16.252.18 | SUCCESS => {
"changed":false,
"ping":"pong"
}
[root@centos7_1 ~]#
示例2、测试以wang用户执行命令
[root@localhost~]# ansible web -m ping -u wang #很明显下面报错了。
172.16.250.90 | UNREACHABLE! => {
"changed":false,
"msg":"Failed to connect to the host via ssh: Permission denied
(publickey,gssapi-keyex,gssapi-with-mic,password).\r\n",
"unreachable":true
}
[root@localhost ~]# ssh-copy-id -i .ssh/id_rsa wang@172.16.250.90
#将密钥传输到对方wang用户
wang@172.16.250.90's password:
Now try logging into the machine, with "ssh 'wang@172.16.250.90'",and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
[root@localhost ~]# ansible web -m ping -u wang #再次执行命令成功
172.16.253.252 | SUCCESS => {
"changed":false,
"ping":"pong"
}
[root@localhost ~]#