Ansible

  • http://www.ansible.com.cn

  • http://galaxy.ansible.com

企业应用场景

Dev开发环境

  • 使用者:程序员

  • 功能:程序员开发软件,测试BUG的环境

  • 管理者:程序员

测试环境

  • 使用者:QA测试工程师

  • 功能:测试经过Dev环境测试通过的软件的功能

  • 管理者:运维

测试环境往往有多套,测试环境满足测试功能即可,不宜过多

  1. 测试人员希望测试环境有多套,公司的产品多产品线并发,即多个版本,意味着多个版本同步测试

  2. 通常测试环境有多少套和产品线数量保持一样

预发布环境

  • 使用者:运维

  • 功能:使用和生产环境一样的数据库,缓存服务等配置,测试是否正常

发布环境

通常是代码发布机或者堡垒机 使用者:运维 功能:发布代码至生产环境 管理者:运维(有经验) 发布机:往往需要有2台(主备)

生产环境

使用者:运维,少数情况开放权限给核心开发人员,极少数公司将权限完全 开放给开发人员并其维护 功能:对用户提供公司产品的服务

灰度环境

是生产环境的一部分 使用者:运维 功能:在全量发布代码前将代码的功能面向少量精准用户发布的环境,可基于主机或用户执行灰度发布 案例:共100台生产服务器,先发布其中的10台服务器,这10台服务器就是灰度服务器 管理者:运维

往往该版本功能变更较大,为保险起见特意先让一部分用户优化体验该功能,待这部分用户使用没有重大问题的时候,再全量发布至所有服务器

自动化运维的场景

  1. 文件传输

  2. 应用部署

  3. 配置管理

  4. 任务流编排

Ansible 特性

  1. 模块化:调用特定的模块,完成特定任务

  2. Paramiko(python对ssh的实现),PyYAML,Jinja2(模板语言)三个关键模块

  3. 支持自定义模块

  4. 基于Python语言实现

  5. 部署简单,基于python和SSH(默认已安装),agentless

  6. 安全,基于OpenSSH

  7. 支持playbook编排任务

  8. 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况

  9. 无需代理不依赖PKI(无需ssl)

  10. 可使用任何编程语言写模块

  11. YAML格式,编排任务,支持丰富的数据结构

  12. 较强大的多层解决方案

Ansible 架构以及原理

Ansible主控端作为ssh客户端连接其他机器的ssh server,然后控制其他服务器完成一些操作。

安装Ansible

rpm

apt

mac brew

编译安装

Git clone 编译安装

Pip安装

确认安装成功

相关的主要配置

安装完毕,涉及的相关文件:

ansible.cfg 配置文件

主机清单 inventory.ini

  1. ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名

  2. 默认的inventory file为 /etc/ansible/hosts

  3. inventory 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模式:

  1. 每台被控端需要安装Ansible 和git(svn)

  2. 所有的配置及playbooks 都存放在git 仓库

  3. 被控端的ansible-pull 计划任务会定期检查给定的git 的tag 或者分支

  4. ansible-pull 执行特定的playbooks 即local.yml 或者hostname.yml

  5. 每次更改playbooks 只需要提交到git 即可

pull模式适合:

  1. 被控节点在配置时不可用,比如自动伸缩的服务池

  2. 被控节点较多,控制机资源有限无法满足高线程和低时间的运行效率

pull模式的缺点:

  1. 要求在节点上安装ansible软件

pull模式的优点:

  1. 不需要中央管理服务器(取决于repository的类型)

  2. 分散存储库是可能的。(再次:取决于repository的类型)

  3. 连接可以由节点启动(如果不允许您更改防火墙策略,则可能很重要)

  4. 增加并行度节点可用时可以pull(在基于push的模型中,如果节点不可用,则无法对其进行配置)

  5. 非常快,因为避免了每个任务的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执行过程

  1. 加载自己的配置文件,默认为/etc/ansible/ansible.cfg

  2. 加载自己的对应的模块文件,如 command

  3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输到远程服务器的对应执行用户的$HOME/.ansible/tmp/ansible-tmp-数字/xxx.py文件

  4. 给文件+x并执行

  5. 执行并返回结果

  6. 删除临时py文件,sleep 0 退出

执行状态:

  1. 绿色:执行成功并且不需要做改变的操作

  2. 黄色:执行成功并且对目标主机做变更

  3. 红色:执行失败

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用于标记一个动作。被标记的动作可以在命令行单独执行:

使用变量

变量名,只能有数字、字母、下划线组成,且必须以字母开头

变量来源有:

  1. Ansible的内置变量。(参考:https://docs.ansible.com/ansible/latest/reference_appendices/special_variables.html ),比较常用的有:

    1. inventory_dir 清单文件夹位置

    2. playbook_dir 当前playbook的文件夹位置

  2. 远程主机信息,ansible setup facts,可以使用filter参数过滤变量名称查看

  3. /etc/ansible/hosts中定义

    1. 普通变量:主机组中主机单独定义,优先级高于公共变量

    2. 公共(组)变量:针对主机组中所有主机定义统一变量

  4. 通过命令行制定变量,优先级最高

  5. 在playbook中定义

  6. 在独立的变量yaml文件中定义

  7. 在role中定义

使用变变量:

Template

配置文件通常不能直接copy,因为不同主机中,某些配置可能不同,这个时候可以使用模板来解决。Ansible的模板基于python的Jinja2模版语言。

定义模板文件,需要以 .j2 作为后缀,定义nginx.conf.j2

最后更新于

这有帮助吗?