ansible初探(二)

ansible的一些编写建议

ansible

ansible的使用场景和优劣势(对比puppet)

优势:

  • 模块编写快速,适用于快速逻辑
  • 支持动态资产,可以接入cmdb
  • 容易安装和维护,无需安装客户端软件和证书匹配等

劣势:

  • ansible完全依赖ssh,需要配置免密或者密码登录,暴露私钥和密码可能会带来风险 (通过vault可以避免部分)
  • 无法定期执行,config分发依赖手动触发

使用场景:

  • 类似快速部署,比如异地外公司部署一个集群,临时搭建一个服务,部署应用,初始化物理机等场景都可以用ansible, 只要ssh通即可通过修改一些变量(入参)进行我们的playbook一系列操作
  • 长期存在的,敏感的线上环境(比如nginx, haproxy,redis配置和启动等等),可以通过puppet,可以实现更强 大稳定的功能

ansible较大工程的组织形式

/etc/ansible/playbooks
  • actionA.yml
  • actionB.yml

此目录放所有的功能,通过不同的playbook实现不同的一组功能

/etc/ansible/inventory

此目录放所有的资产信息和ssh连接信息

/etc/ansible/roles

此目录放具体的role功能实现

  • common(一些基础role,比如安装软件,获取ip等变量等等)
  • roleA
  • roleB
roleA

以roleA为例 目录结构 /etc/ansible/roles/roleA

  • defaults/main.yml

这里放默认变量,注意这里的变量不要放到vars里面 如果默认变量放到vars里面,则意味着传参的时候会报错,失去了默认变量的意义,且有不同的优先级

  • vars/main.yml

这里放一些其他变量,比如常用的配置变量等

  • tasks/main.yml

    • 定义实际执行的yml,也可以通过include包含对应的yml
    • 如果该role是一个类似网关role,那可以通过include_role实现调用其他role
  • handlers/main.yml

handlers的编写适用于某些服务的发布,比如配置文件修改了才会触发服务reload,具体可以看官方的例子, 同样也可以在handlers写一些notify的信息,比如通知邮件等

  • templates/example.j2

templates放需要渲染的配置文件,用我们的variables填充,这里要注意可以写if、for等jinja关键词

  • files/example.sh

这里一般用来放role用到的文件,比如二进制包等等

ansible其他

官方最佳实践

这里列出一些里面的tips

  • Keep it simple(尽可能简单)

尽量一个role只做一个事情,避免使用太多的高级特性

  • Use version control(使用版本控制)

接入版本控制比如git,这样变更可以review,也可以快速部署在其他环境

  • Use comments(使用注释)

这样别人才可以知道你的版本和用途以及相关人员

  • Use dynamic inventory with clouds(云环境优先用动态资产)
  • Group inventory by function(根据功能进行分组)

比如webservers或者db,通过功能进行分组,从而过滤实现必须的功能

  • Separate production and staging inventory(区分线上和测试环境的资产)

混在一起可能会存在危险和惊吓。

  • Keep vaulted variables safely visible(用vault来加密一些敏感变量)

比如db密码等信息

variables(变量)优先级

ansible变量和程序语言一样,有优先级,如果用不好常常会比较迷惑 关于变量,官方文档变量 ansible中的变量优先级

  • 命令行变量
  • task变量
  • block变量
  • role中定义的变量和include变量
  • set_fact
  • registered变量
  • vars_files
  • var_prompt
  • play变量
  • host facts
  • playbook中设置的host_vars
  • playbook中设置的group_vars
  • inventory中设置的host_vars
  • inventory中设置的group_vars
  • inventory变量
  • role中defaults/main.yml中定义的变量

对于我们比较重要的是

  • 命令行变量最高优先级
  • role中vars的定义变量大于playbook中定义的变量
  • 最低优先级变量是defaults里面的变量
异步

https://docs.ansible.com/ansible/latest/user_guide/playbooks_async.html ansible异步个人并不是很喜欢,通过异步可以快速让任务执行起来,如果加check需要等待,本质相当于同步 如果不加check,需要额外准备一些钩子探测服务状态或者任务自己去返回,让本来的逻辑更加复杂 建议尽量少的让ansible做较长时间的job,把时间用在如何优化和减少时间

windows相关

https://docs.ansible.com/ansible/latest/user_guide/windows.html ansible对windows的支持也不错,但是对于运维来讲如果是简单部署还是建议安装cygwin或者wsl更方便,如果熟悉windows 也可以用win_shell, powershell等模块

资产自刷新

当我们希望任务执行是完整过程的时候,我们中间可能会新生成一个列表,并且相对列表操作,其实这里不建议这样,但是如果 有这种需要,需要用到meta模块,meta模块(其实这里也有退出playbook,当我们无法确认什么时候结束循环的时候可以使用)

  • name: refresh the inventory meta: refresh_inventory

当然也可以通过add_host语句实现 但是要注意:在循环下面不支持刷新资产