Ansible小工具分享

ansible dmpwebservers -a "free -g"

freeg.png

By DMP Team TZP 20180131

Presenter Notes

介绍

搜自动化部署/自动化运维时搜到的, 被拿来和puppet之类的工具对比, 也可以和jenkins对比:

Ansible更纯粹: 登录远程服务器搞一些事情

  • 没有什么配管, ci, cd之类的说法, 能搞一些你想到的事
  • 不需要在目标机上装agent, 只要ssh就能工作, 完美读取我们的.ssh/config
  • 不需要想jenkins那样是一个server, 就是一个命令行小工具, 拿来就用

当然我也没用过其他的自动部署/配管工具, 所以可能说的有些偏颇

刚才那条命令:

  • 下载安装 pip install ansible
  • 创建inventory文件.(yml语法, 注意格式)
  • 为了不用每次指定inventory, 在当前工作目录搞一个ansible.cfg文件, inventory配置在里面. (复制我的即可)
  • 执行

Presenter Notes

inventory 服务器清单

  • 静态清单文件 inventory.yml Hosts and Groups and Variables

  • 动态inventory: 配合AWS/OpenStack/自己的CMDB

Presenter Notes

Ad-Hoc Command

就是说临时的一个命令, 刚才我们执行的就是一个ad-hoc命令.

用法 ansible targethosts -m module -a arguments

Presenter Notes

module 模块

内建好的各种功能的库.

默认是使用command模块, 即去远程服务器执行命令

一些常见的模块:

  • yum(package)
  • service
  • file
  • copy
  • iptables
  • template
  • lineinfile/blockinfile
  • expect

modules目录

Presenter Notes

Playbook (test0,1)

与刚才临时命令比, Playbook就是把要做的事情写到yaml语法的文件里. 这就强大多了.

  1. 可以上git
  2. 可以复用

playbook结构:

  • playbook可以包含多个play.
  • play就是对一组服务器hosts描述一组操作tasks和roles
  • task就是要执行的任务, 就是我们刚才说的module

Presenter Notes

变量 facts and variables (test2)

  • facts: 关于服务器信息的事实. playbook会默认启用setup模块来收集fact: ansible 3230 -m setup, 常用:
    • ansible_os_family (test0 - debug: var=ansible_os_family)
    • ansible_pkg_mgr
    • ansible_all_ipv4_addresses
  • variables: 变化的量, 有很多地方可以定义
    • hosts处定义 (- debug: var=foo)
    • play处定义
    • register 将task结果注册为变量

Presenter Notes

变量的使用

jinja2语法:

  • play里 {{}} (test02:36)
  • templates里 (见cron dump)

Presenter Notes

条件和循环

简略一看

  • when
  • with_items
  • with_file

Presenter Notes

Reusable 复用

  • 文件复用
    • 静态import (见template_to_block)
    • 动态include 没试过
  • Role 独立自治的可重用playbooks
    • 目录结构 (ansible-galaxy init arole)
    • galaxy

Presenter Notes

WARNING

  • 可以每次执行playbook, 都会告诉你哪些机器 ok了多少, changed了多少, failed了多少
  • 很多module的指令都是present/absent.

因为ansible的设计哲学是: 去描述服务器应该处于的状态, 而不是写你要进行的操作.

所以大多内置模块的功能都已经做到了这种幂等性, 多次执行也没关系, ansible检查达到了想要的状态就不会重复操作.

而一些类型command的模块, ansible无法判断目标机上的状态是否ok, 是否执行过, 就需要我们注意了.

Presenter Notes

参考资料

Presenter Notes