Ansible基础
ansible基础
一、ansible介绍
一、ansible简介
Ansible 是一个配置管理和应用部署工具,功能类似于目前业界的配置管理工具 Chef,Puppet,Saltstack。Ansible 是通过 Python 语言开发。Ansible 平台由 Michael DeHaan 创建,他同时也是知名软件 Cobbler 与 Func 的作者。Ansible 的第一个版本发布于 2012 年 2 月。Ansible 默认通过 SSH 协议管理机器,所以 Ansible 不需要安装客户端程序在服务器上。您只需要将 Ansible 安装在一台服务器,在 Ansible 安装完后,您就可以去管理控制其它服务器。不需要为它配置数据库,Ansible 不会以 daemons 方式来启动或保持运行状态。
二、官方链接
Ansible中文权威指南:http://www.ansible.com.cn/
安装:http://docs.ansible.com/ansible/intro_installation.html
模块:http://docs.ansible.com/modules_by_category.html
三、ansible的特性
- 基于python语言实现,由paramiko,PyYAML和Jinjia2三个关键模块。
- 部署简单,agentless
- 默认使用SSH协议:实现方式有两种
- 基于密钥认证
- 在inventory文件中指定账号和密码
- 主从模式
- master:安装ansible,ssh client
- slave:安装ssh server
- 支持自定义模块:支持各种编程语言
- 支持playbook
- 基于模块完成各种任务
四、Ansible优缺点
1、优点
- 轻量级,他不需要去客户端安装agent,更新时,只需要在操作机上进行一次更新即可
- 批量任务执行可以写成脚本,而且不用分发到远程就可以执行
- 使用python编写的,维护更简单
- 支持sudo
2、缺点
- 对于几千台、上万台机器的操作,还不清楚性能、效率情况如何,需要进一步了解。
五、配置管理工具对比
我们自己的项目后端开发语言为Python,目前主流的开源自动化配置工具有puppet、ansible、saltstack等,ansible和saltstack是基于Python开发,能够很好的支持Python程序发布。在服务器数量不多,不需要考虑大规模并发性能的情况下,我们对比了ansible和saltstack,最终选用了ansible作为部署发布工具。
1、通讯方式
ansible无需安装服务端和客户端,管理机通过ssh协议将命令推送到服务器端执行,只需要管理机上安装ansible,即可实现统一管理,同时ansible也支持使用ZeroMQ、Kerberos、LDAP等方式推送命令。
而saltstack需要分别安装master和minion,master和minion之间可以通过ZeroMQ、RAET消息队列进行通信,salt在升级时,master版本需向后兼容,minion版本不能高于master。
2、响应速度
saltstack的master和minion是通过ZeroMQ推送命令,而ansible通过标准ssh推送命令,ZeroMQ的传输速度比标准SSH连接会快很多,在大规模服务器并发的情况下,saltstack执行效率会比ansible好,而在一般的运维场景下,ansible可以满足需求。
3、二次开发
ansible和saltstack是基于Python开发,支持使用Python进行二次开发。ansible附带很多可以直接在远端主机或者通过Playbooks执行的模块,用户可以开发自己的模块或者插件,而saltstack也有一些预装的formulas,同样可以执行自定义的formula,而他们都覆盖了常用的软件模块,如文件传输、web服务器、MySQL命令等。
4、安全性
ansible使用标准ssh协议通讯,标准ssh是加密传输,并且远程服务器不需要运行守护进程,使得远程服务器不容易受到攻击。而saltstack虽然可以通过数据加密方法配置数据传输加密方式,但是远程服务器必须运行守护进程,暴露了可攻击的点。
六、Ansible 可以实现以下目标:
- 自动化部署应用
- 自动化管理配置
- 自动化的持续交付
- 自动化的(AWS)云服务管理。
七、ansible架构及工作原理
1、ansible基础架构
ansible core : ansible 自身核心模块
host inventory: 主机库,定义可管控的主机列表
connection plugins: 连接插件,一般默认基于 ssh 协议连接
modules:core modules ( 自带模块 ) 、 custom modules ( 自定义模块 )
playbooks :剧本,按照所设定编排的顺序执行完成安排任务
2、ansible工作原理
1、管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接---这部分对应基本架构图中的连接模块;
2、可以按应用类型等方式进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作---单个模块,单条命令的批量执行,我们可以称之为 ad-hoc;
3、管理节点可以通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系 统通过组合多条ad-hoc操作的配置文件 。
Ansible默认是通过SSH通道来管理的,也就是它所说的免客户端方式管理, 它底层是通过 paramiko 来实现的。
3、ansible执行过程大体过程如下图,其中暖色调的代表已经模块化。
八、ansible插件
1、connection插件
连接插件,根据指定的ssh参数连接指定的服务器,并切提供实际执行命令的接口
SSH 连接的类型: local (本地连接), ssh , paramiko,在 ansible 1.2 之前默认是 paramiko ,后来智能选择,优先使用基于 ControlPersist 的 ssh (支持的前提)
2、shell插件
命令插件,根据sh类型,来生成用于connection时要执行的命令
3、strategy插件
执行策略插件,默认情况下是线性插件,就是一个任务接着一个任务的向下执行,此插件将任务丢到执行器去执行。
4、action插件
动作插件,实质就是任务模块的所有动作,如果ansible的模块没有特别编写的action插件,默认情况下是normal或者async(这两个根据模块是否async来选择),normal和async中定义的就是模块的执行步骤。例如,本地创建临时文件,上传临时文件,执行脚本,删除脚本等等,如果想在所有的模块中增加一些特殊步骤,可以通过增加action插件的方式来扩展。
九、Ansible执行模块流程
1、ansible命令的实质是通过ansible/cli/adhoc.py来运行,同时会收集参数信息
- 设置play信息,然后通过TaskQueueManager进行run
- TaskQueueManager需要inventory(节点仓库)、variable_manager(收集变量)、option(命令行指定的参数),stdout_callback(回调函数)
2、在task_queue_manager.py中找到run中
- 初始化时会设置队列
- 会根据options,,variable_manager,passwords等信息设置成一个PlayContext信息(playbooks/playcontext.py)
- 设置插件(plugins)信息callback_loader(回调), strategy_loader(执行策略), module_loader(任务模块)
- 通过strategy_loader(strategy插件)的run(默认的strategy类型是linear,线性执行),去按照顺序执行所有的任务(执行一个模块,可能会执行多个任务)
- 在strategy_loader插件run之后,会判断action类型。如果是meta类型的话会单独执行(不是具体的ansible模块时),而其他模块时,会加载到队列_queue_task
- 在队列中会调用WorkerProcess去处理,在workerproces实际的run之后,会使用TaskExecutor进行执行
- 在TaskExecutor中会设置connection插件,并且根据task的类型(模块。或是include等)获取action插件,就是对应的模块,如果模块有自定义的执行,则会执行自定义的action,如果没有的会使用normal或者async,这个是根据是否是任务的async属性来决定
- 在Action插件中定义着执行的顺序,及具体操作,例如生成临时目录,生成临时脚本,所以要在统一的模式下,集成一些额外的处理时,可以重写Action的方法
- 通过Connection插件来执行Action的各个操作步骤
十、Ansible应用场景
1、从运维的角度划分为两类:
1、文件传输:
文件的本地传输和异地传输,所有的文件的空间形态、时间形态变化均构成文件传输类操作。
2、命令执行:
终端所有操作对系统来讲都是指令的组成,最终转换为基础硬件可接受的电信号完成任务集。对运维操作的用户行为来讲,除文件传输以外的其他操作均可称为命令执行。
2、从自动化工作类型角度分类
1、应用部署
如今的应用功能越来越强大,同步应用部署过程的依赖和规则也日趋复杂,但对应用运维的要求没有随之降低,有效快速正确平滑的应用部署需求日趋强烈。
ansible内置网络、应用、系统、第三方云平台扩展等完善的功能模块,协助运维快速完成应用的安装,卸载、升级、启停、配置等部署类工作,即使对跨平台或知名的商业硬件也同样支持。
2、配置管理(configuration management,CM)
配置管理是托管技术或者行政手段对软件产品及其开发过程和声明周期进行控制、规范的一系类措施。
配置管理的目标是记录软件产品的演化过程,确保软件开发在软件声明周期中各个阶段都能得到精确的产品配置。
在日益复杂的IT环境和用户需求下,ansible内置File、Template,结合Jinja、Lineinfile等内置模块,同时无缝结合GitHub、GitHub、Gitlab、Git、SVN、Jenkins等主流版本控制和CI持续集成工具,助力配置管理自动化。
3、任务流编排
有效保证Tasks任务流按既定规则和顺序完成事先制订的目标和计划,同时Role编排方式又能在一定程度上从书写习惯和代码层编排上保证整体项目额度可架构性和规范性,协助控制项目维护成本不致过高。
3、按照使用环境分类
1、Dev开发环境
使用者:程序员
功能:程序员开发软件测试BUG的环境
管理者:程序员
2、测试环境
使用者:测试工程师
功能:测试通过Dev环境测试通过的软件功能
管理者:程序员
3、发布环境(代码发布机,有些公司使用的时堡垒机(安全屏障))
使用者:运维
功能:发布代码到生产环境
管理者:有经验的运维
发布机:往往需要两台(主备)
4、生产环境
使用者:运维
功能:对用户提供公司产品的服务
管理者:运维
5、灰度环境
使用者:运维
功能:在全量发布代码前将代码的功能面向少量精准用户的发布环境
管理者:运维
为什么需要灰度环境:往往是版本的功能更新比较大,为了保险起见特意先让一部分用户优先体验该功能,待这部分用户使用没什么重大问题的时候,再全量发布到所有的服务器。
如上场景适用于网络管理员、系统运维、应用运维、桌面运维、DevOps、基础架构运维等多领域运维行业,以及无运维岗但服务规模又需有一定精力投入维护的小型公司,开发人员经过简单的了解即可初步上手。同样也适用于中大型公司,可以投入人力、精力、财力对ansible进行二次开发,使其更加试用。
二、ansible安装部署
一、安装ansible
依赖epel源,提前安装上
yum install epel-release -y
1、查看安装包信息
# yum list all "*ansible*"
Loaded plugins: fastestmirror
Determining fastest mirrors
* base: mirrors.aliyun.com
* epel: mirrors.tongji.edu.cn
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Available Packages
ansible.noarch 2.5.3-1.el7 epel
ansible-doc.noarch 2.5.3-1.el7 epel
ansible-inventory-grapher.noarch 2.4.4-1.el7 epel
ansible-lint.noarch 3.4.21-1.el7 epel
ansible-openstack-modules.noarch 0-20140902git79d751a.el7 epel
ansible-review.noarch 0.13.4-1.el7 epel
kubernetes-ansible.noarch 0.6.0-0.1.gitd65ebd5.el7 epel
python2-ansible-runner.noarch 1.0.1-1.el7 epel
python2-ansible-tower-cli.noarch 3.3.0-2.el7 epel
2、显示指定的rpm软件包的描述信息和概要信息;
#yum info ansible Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * epel: mirror.pregi.net * extras: centos.ustc.edu.cn * updates: mirrors.163.com Installed Packages Name : ansible Arch : noarch Version : 2.6.1 Release : 1.el7 Size : 52 M Repo : installed From repo : epel Summary : SSH-based configuration management, deployment, and task execution system URL : http://ansible.com License : GPLv3+ Description : Ansible is a radically simple model-driven configuration management, : multi-node deployment, and remote task execution system. Ansible works : over SSH and does not require any software or daemons to be installed : on remote nodes. Extension modules can be written in any language and : are transferred to managed machines automatically. Available Packages Name : ansible Arch : noarch Version : 2.6.5 Release : 1.el7 Size : 10 M Repo : epel/x86_64 Summary : SSH-based configuration management, deployment, and task execution system URL : http://ansible.com License : GPLv3+ Description : Ansible is a radically simple model-driven configuration management, : multi-node deployment, and remote task execution system. Ansible works : over SSH and does not require any software or daemons to be installed : on remote nodes. Extension modules can be written in any language and : are transferred to managed machines automatically.
3、yum安装ansible
yum install ansible -y
二、配置
1、配置文件和主机管理文件
配置文件:/etc/ansible/ansible.cfg
Inventory:/etc/ansible/hosts
1、编辑主机
/etc/ansible/hosts
2、使用主机变量
Hosts部分中常用的变量
1 ansible_ssh_host #用于指定被管理的主机的真实IP 2 ansible_ssh_port #用于指定连接到被管理主机的ssh端口号,默认是22 3 ansible_ssh_user #ssh连接时默认使用的用户名 4 ansible_ssh_pass #ssh连接时的密码 5 ansible_sudo_pass #使用sudo连接用户时的密码 6 ansible_sudo_exec #如果sudo命令不在默认路径,需要指定sudo命令路径 7 ansible_ssh_private_key_file #秘钥文件路径,秘钥文件如果不想使用ssh-agent管理时可以使用此选项 8 ansible_shell_type #目标系统的shell的类型,默认sh 9 ansible_connection #SSH 连接的类型: local , ssh , paramiko,在 ansible 1.2 之前默认是 paramiko ,后来智能选择,优先使用基于 ControlPersist 的 ssh (支持的前提) 10 ansible_python_interpreter #用来指定python解释器的路径,默认为/usr/bin/python 同样可以指定ruby 、perl 的路径 11 ansible_*_interpreter #其他解释器路径,用法与ansible_python_interpreter类似,这里"*"可以是ruby或才perl等其他语言
2、免密钥登录(所有主机)
1、生成密钥对
ssh-keygen -t rsa(一路回车即可)
2、发送密钥
for i in 10.0.0.10 10.0.0.11 10.0.0.12 10.0.0.13 10.0.0.14;do ssh-copy-id $i;done
三、ansible使用指南
1、ansible简单使用
1、查看安装软件文件列表
rpm -ql ansible
2、查看帮助信息
- man ansible ansible的用法
- ansible-doc -l 查看ansible支持所有模块
- ansible-doc -s yum 查看某个模块的用法
3、ansible命令应用基础
语法:ansible <host-pattern> [options] -m 指定模块 -f 指定线程数 -a 具体操作
2、ansible变量的优先级
1、由高到低的优先级顺序
- 在命令行中定义的变量(即用-e定义的变量)
- 在Inventory中定义的连接变量(比如ansible_ssh_user)
- 大多数的其他变量(命令行转换、paly中的变量、included的变量、role中的变量等)
- 在Inventory定义的其他变量
- 由系统通过gather_facts方法发现的Facts
- “Role默认变量”,这个是默认的值,很容易丧失优先权
2、初学者参考
- Role中的默认变量应设置得尽可能的合理。因为优先级最低,防止这些变量在其他地方没被定义,而且Role的默认值定义的不合理。
- playbook中应尽量少地定义变量,playbook中用的变量应尽量定义在专门的变量文件中,通过vars_files引用,或者定义Inventory文件中
- 应尽量少地在动态或静态的Inventory源文件中定义定量,尤其是不要定义那些很少在playbook中被用到的变量
- 应尽量避免在命令行中使用-e选项来定义变量。只有在我们不用去关心项目的可维护性和任务幂等性的时候,才建议使用这种变量定义方式。比如:只是做本地测试,或者运行一个一次性的playbook任务。