Ansible
http://www.ansible.com.cn
http://galaxy.ansible.com
企业应用场景
Dev开发环境
使用者:程序员
功能:程序员开发软件,测试BUG的环境
管理者:程序员
测试环境
使用者:QA测试工程师
功能:测试经过Dev环境测试通过的软件的功能
管理者:运维
测试环境往往有多套,测试环境满足测试功能即可,不宜过多
测试人员希望测试环境有多套,公司的产品多产品线并发,即多个版本,意味着多个版本同步测试
通常测试环境有多少套和产品线数量保持一样
预发布环境
使用者:运维
功能:使用和生产环境一样的数据库,缓存服务等配置,测试是否正常
发布环境
通常是代码发布机或者堡垒机 使用者:运维 功能:发布代码至生产环境 管理者:运维(有经验) 发布机:往往需要有2台(主备)
生产环境
使用者:运维,少数情况开放权限给核心开发人员,极少数公司将权限完全 开放给开发人员并其维护 功能:对用户提供公司产品的服务
灰度环境
是生产环境的一部分 使用者:运维 功能:在全量发布代码前将代码的功能面向少量精准用户发布的环境,可基于主机或用户执行灰度发布 案例:共100台生产服务器,先发布其中的10台服务器,这10台服务器就是灰度服务器 管理者:运维
往往该版本功能变更较大,为保险起见特意先让一部分用户优化体验该功能,待这部分用户使用没有重大问题的时候,再全量发布至所有服务器
自动化运维的场景
文件传输
应用部署
配置管理
任务流编排
Ansible 特性
模块化:调用特定的模块,完成特定任务
Paramiko(python对ssh的实现),PyYAML,Jinja2(模板语言)三个关键模块
支持自定义模块
基于Python语言实现
部署简单,基于python和SSH(默认已安装),agentless
安全,基于OpenSSH
支持playbook编排任务
幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
无需代理不依赖PKI(无需ssl)
可使用任何编程语言写模块
YAML格式,编排任务,支持丰富的数据结构
较强大的多层解决方案
Ansible 架构以及原理
Ansible主控端作为ssh客户端连接其他机器的ssh server,然后控制其他服务器完成一些操作。
安装Ansible
rpm
apt
mac brew
编译安装
Git clone 编译安装
Pip安装
确认安装成功
相关的主要配置
安装完毕,涉及的相关文件:
ansible.cfg 配置文件
主机清单 inventory.ini
ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名
默认的inventory file为
/etc/ansible/hostsinventory file可以有多个,且也可以通过Dynamic Inventory来动态生成
/etc/ansible/hosts的格式:
如果机器ip连续,可以使用如下方式批量加入:
相关命令
ansible-doc
适用于查看ansible文档的工具。
ansible
其它选项参数:
建议使用基于sshkey的验证
示例:
ansible 的 hostpattern 支持多种复杂的形式:
ansible-galaxy
ansible galaxy 工具类似于operationhub.io或者hub.docker.com,是一个存储了很多playbook的网站,可以从galaxy中查询需要的playbook并下载使用。注意,一般我们不直接使用上面的东西,而是自己检查修改后使用。
ansible-pull
ansible默认的工作模式为push模式,也就是说不要在远程主机做任何操作只需要在控制机编排playbook,push 到远程主机即可完成任务。而另一个工作模式就是 ansible pull模式:
每台被控端需要安装Ansible 和git(svn)
所有的配置及playbooks 都存放在git 仓库
被控端的ansible-pull 计划任务会定期检查给定的git 的tag 或者分支
ansible-pull 执行特定的playbooks 即local.yml 或者hostname.yml
每次更改playbooks 只需要提交到git 即可
pull模式适合:
被控节点在配置时不可用,比如自动伸缩的服务池
被控节点较多,控制机资源有限无法满足高线程和低时间的运行效率
pull模式的缺点:
要求在节点上安装ansible软件
pull模式的优点:
不需要中央管理服务器(取决于repository的类型)
分散存储库是可能的。(再次:取决于repository的类型)
连接可以由节点启动(如果不允许您更改防火墙策略,则可能很重要)
增加并行度节点可用时可以pull(在基于push的模型中,如果节点不可用,则无法对其进行配置)
非常快,因为避免了每个任务的SSH连接开销
使用ansible pull:
使用 ansible-pull 拉取配置并应用:
ansible-playbook
用于执行编写好的playbook任务,playbook实际上就是批量脚本【重点】。
编写hello.yml playbook:
使用ansible-playbook执行脚本:
ansible-vault
因为playbook脚本中可能存在敏感信息,就提供ansible-vault加密解密yml文件(让我想起了k8s的secret)。
范例:
ansible-console
ansible交互执行命令的工具,是2.0新增的功能。
可以通过该命令行进入交互命令行,并提示如下的命令行提示符:
并通过:
list
cd 主机组
forks 10 设置并发数
? 列出所有命令
等一系列命令管理ansible。
Ansible执行过程
加载自己的配置文件,默认为
/etc/ansible/ansible.cfg加载自己的对应的模块文件,如 command
通过ansible将模块或命令生成对应的临时py文件,并将该文件传输到远程服务器的对应执行用户的
$HOME/.ansible/tmp/ansible-tmp-数字/xxx.py文件给文件
+x并执行执行并返回结果
删除临时py文件,sleep 0 退出
执行状态:
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
Ansible常用模块
Command
Shell
Script
用于在其他主机上运行脚本,他会先将脚本推送,再执行:
Copy
向其他主机发送文件:
Fetch
与copy相反,用于拉取远程主机的文件到本机,只能抓取文件,不可以抓取目录:
File
用于操作文件的模块,包含设置文件相关属性,创建目录文件链接,删除等:
Hostname
主机名管理:
Cron
计划任务,支持的时间有: minute, hour, day, month, weekday
Yum
yum包管理:
Service
管理服务。
User
管理用户。
Group
管理组。
PlayBook
剧本,由yaml编写,制定了ansible的任务。
创建playbook yaml文件:
使用ansible-playbook执行剧本:
Playbook是由一个或者多个play组成的列表。一个play主要将事先定义好的一组主机装扮成事先通过ansible的task定义好的角色。从根本上来说,一个task就是调用一个ansible的module,一个paly包含多个task。Playbook将多个Play组织在一起,完成一个复杂的的编排。
如果playbook中某个action返回码不为0,也就是出错状态,如果想要忽略错误继续执行action,共有两种方式:
或者(推荐):
ansible-playbook的其他属性:
--check只检测可能发生的改变,但是不会真正执行--lists列出将会被应用的主机清单--limit只针对某个主机执行,比如--limit 192.168.23.13-v -vvv详细信息
Handler和Notify
Handler用于监控task中的某个action,如果达到一定的条件,将会使用Notify出发指定的Handler。
Tags
上述yaml有一个tags标签,该tags用于标记一个动作。被标记的动作可以在命令行单独执行:
使用变量
变量名,只能有数字、字母、下划线组成,且必须以字母开头
变量来源有:
Ansible的内置变量。(参考:https://docs.ansible.com/ansible/latest/reference_appendices/special_variables.html ),比较常用的有:
inventory_dir清单文件夹位置playbook_dir当前playbook的文件夹位置
远程主机信息,
ansible setup facts,可以使用filter参数过滤变量名称查看在
/etc/ansible/hosts中定义普通变量:主机组中主机单独定义,优先级高于公共变量
公共(组)变量:针对主机组中所有主机定义统一变量
通过命令行制定变量,优先级最高
在playbook中定义
在独立的变量yaml文件中定义
在role中定义
使用变变量:
Template
配置文件通常不能直接copy,因为不同主机中,某些配置可能不同,这个时候可以使用模板来解决。Ansible的模板基于python的Jinja2模版语言。
定义模板文件,需要以 .j2 作为后缀,定义nginx.conf.j2:
最后更新于
这有帮助吗?