ansible工具概述

ansible工具概述


一、ansible学习指南

  • 运维自动化发展历程及技术应用
  • Ansible命令使用
  • Ansible常用模块详解
  • YAML语法简介
  • Ansible playbook基础
  • Playbook变量、tags、handlers使用
  • Playbook模板templates
  • Playbook条件判断 when
  • Playbook字典 with_items
  • Ansible Roles

二、运维自动化发展历程及技术应用

三、云计算运维工程师核心职能

四、Linux运维工程师职能划分

五、企业实际应用场景分析

  • Dev开发环境
    • 使用者:程序员
    • 功能:程序员开发软件,测试BUG的环境
    • 管理者:程序员
  • 测试环境

    • 使用者:QA测试工程师
    • 功能:测试经过Dev环境测试通过的软件的功能
    • 管理者:运维
    • 说明:测试环境往往有多套,测试环境满足测试功能即可,不宜过多
      • 1、测试人员希望测试环境有多套,公司的产品多产品线并发,即多个版本, 意味着多个版本同步测试
      • 2、通常测试环境有多少套和产品线数量保持一样
  • 发布环境:代码发布机,有些公司为堡垒机(安全屏障)

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

    • 使用者:运维,少数情况开放权限给核心开发人员,极少数公司将权限完全 开放给开发人员并其维护
    • 功能:对用户提供公司产品的服务
    • 管理者:只能是运维
    • 生产环境服务器数量:一般比较多,且应用非常重要。往往需要自动工具协 助部署配置应用
  • 灰度环境(生产环境的一部分)

    • 使用者:运维
    • 功能:在全量发布代码前将代码的功能面向少量精准用户发布的环境,可基 于主机或用户执行灰度发布
    • 案例:共100台生产服务器,先发布其中的10台服务器,这10台服务器就 是灰度服务器
    • 管理者:运维
    • 灰度环境:往往该版本功能变更较大,为保险起见特意先让一部分用户优化 体验该功能,待这部分用户使用没有重大问题的时候,再全量发布至所有服务器

六、程序发布

  • 程序发布要求:
    • 不能导致系统故障或造成系统完全不可用
    • 不能影响用户体验
  • 预发布验证:
    • 新版本的代码先发布到服务器(跟线上环境配置完全相同,只是未接入到调度器)
  • 灰度发布:
    • 基于主机,用户,业务
  • 发布路径:
    • /webapp/tuangou
    • /webapp/tuangou-1.1
    • /webapp/tuangou-1.2
  • 发布过程:在调度器上下线一批主机(标记为maintanance状态) –> 关闭服务 –> 部 署新版本的应用程序 –> 启动服务 –> 在调度器上启用这一批服务器
  • 自动化灰度发布:脚本、发布平台
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
发布更新
100台 v1.0
90 up v1.0
10 down v1.0 --升级->v2.0
/app/pp-1.0 ---软连接-->/app/pp
升级
/app/pp-2.0---新建连接->/app/aa
90 up v1.0
10 up v2.0
.....逐渐上线...灰度发布(金丝雀发布).....

发布方式
用户类型
地区 等

蓝绿发布
主备两套环境
主:活动,绿
备:非活动,蓝
备用升级,互换化境状态

发布过程:在调度器上下线一批主机(标记为maintanance状态) --> 关闭服务 --> 部 署新版本的应用程序 --> 启动服务 --> 在调度器上启用这一批服务器

自动化灰度发布:脚本、发布平台

七、自动化运维应用场景

  • 文件传输
  • 应用部署
  • 配置管理
  • 任务流编排

八、常用自动化运维工具

  • Ansible:python,Agentless,中小型应用环境
  • Saltstack:python,一般需部署agent,执行效率更高
  • Puppet:ruby, 功能强大,配置复杂,重型,适合大型环境
  • Fabric:python,agentless
  • Chef: ruby,国内应用少
  • Cfengine
  • func

九、企业级自动化运维工具应用实战ansible

  • 公司计划在年底做一次大型市场促销活动, 全面冲刺下交易额,为明年的上市做准备。公 司要求各业务组对年底大促做准备,运维部要 求所有业务容量进行三倍的扩容,并搭建出多 套环境可以共开发和测试人员做测试,运维老 大为了在年底有所表现,要求运维部门同学尽 快实现,当你接到这个任务时,有没有更快的 解决方案?

    十、Ansible发展史

  • Ansible
    • 创始人,Michael DeHaan( Cobbler 与 Func 的作者)
    • 2012-03-09,发布0.0.1版,红帽收购
    • 2015-10-17,Red Hat宣布收购
  • 同类自动化工具GitHub关注程度(2016-07-10)

十一、ansible特性

  • 模块化:调用特定的模块,完成特定任务
  • 有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块
  • 支持自定义模块
  • 基于Python语言实现
  • 部署简单,基于python和SSH(默认已安装),agentless
  • 安全,基于OpenSSH
  • 支持playbook编排任务
  • 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
  • 无需代理不依赖PKI(无需ssl)
  • 可使用任何编程语言写模块
  • YAML格式,编排任务,支持丰富的数据结构
  • 较强大的多层解决方案

十二、ansible架构

十三、Ansible工作原理

  • CMDB:配置管理数据库

十四、Ansible主要组成部分

  • ANSIBLE PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置 文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
  • INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
  • MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
  • PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插 件等,该功能不常用
  • API:供第三方程序调用的应用程序编程接口
  • ANSIBLE:组合INVENTORY、API、MODULES、PLUGINS的绿框,可以理解 为是ansible命令工具,其为核心执行工具

  • Ansible命令执行来源:

    • USER,普通用户,即SYSTEM ADMINISTRATOR
    • CMDB(配置管理数据库) API 调用
    • PUBLIC/PRIVATE CLOUD API调用
    • USER-> Ansible Playbook -> Ansibile
  • 利用ansible实现管理的方式:
    • Ad-Hoc 即ansible命令,主要用于临时命令使用场景
    • Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提 的规划
  • Ansible-playbook(剧本)执行过程:
    • 将已有编排好的任务集写入Ansible-Playbook
    • 通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐 条执行
  • Ansible主要操作对象:
    • HOSTS主机
    • NETWORKING网络设备
  • 注意事项
    • 执行ansible的主机一般称为主控端,中控,master或堡垒机
    • 主控端Python版本需要2.6或以上
    • 被控端Python版本小于2.4需要安装python-simplejson
    • 被控端如开启SELinux需要安装libselinux-python
    • windows不能做为主控端

十五、安装ansible及查看配置文件

安装

  • rpm包安装: EPEL源
    • yum install ansible
  • 编译安装:
    • yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
    • tar xf ansible-1.5.4.tar.gz
    • cd ansible-1.5.4
    • python setup.py build
    • python setup.py install
    • mkdir /etc/ansible
    • cp -r examples/* /etc/ansible
  • Git方式:(github)
    • git clone git://github.com/ansible/ansible.git –recursive
    • cd ./ansible
    • source ./hacking/env-setup
  • pip安装: pip是安装Python包的管理器,类似python中的yum
    • yum install python-pip python-devel
    • yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel
    • pip install –upgrade pip
    • pip install ansible –upgrade
    • 确认安装: ansible –version

ansible相关文件

  • 配置文件
    • /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
    • /etc/ansible/hosts 主机清单
    • /etc/ansible/roles/ 存放角色的目录
  • 程序
    • /usr/bin/ansible 主程序,临时命令执行工具
    • /usr/bin/ansible-doc 查看配置文档,模块功能查看工具,可以理解为ansible的man帮助
    • /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
    • /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具/usr/bin/ansiblepull 远程执行命令的工具
    • /usr/bin/ansible-vault 文件加密工具
    • /usr/bin/ansible-console 基于Console界面与用户交互的执行工具

主机清单的编写

  • 主机清单inventory
    • Inventory 主机清单
    • ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以 在inventory file中将其分组命名
    • 默认的inventory file为/etc/ansible/hosts
    • inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成
  • /etc/ansible/hosts文件格式

    • inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机 同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的SSH端口, 还可以在主机名称之后使用冒号加端口号来标明
      • ntp.a.com
      • [webservers]
      • www1.a.com:2222 #也支持填写端口号,因为ansiable运行是基于ssh,如果此主机的ssh服务使用的为非标准端口,需要填写端口号信息
      • www2.a.com
      • [dbservers]
      • db1.a.com
      • db2.a.com
      • db3.a.com
  • 如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机

  • 示例:
    • [websrvs]
    • www[01:100].example.com
    • [dbsrvs]
    • db-[a:f].example.com

十六、ansible 配置文件

解析ansible的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@ansible ~]# vim /etc/ansible/ansible.cfg
[defaults] 以下默认值

# some basic default values...

#inventory = /etc/ansible/hosts 定义主机清单路径
#library = /usr/share/my_modules/ 库文件
#module_utils = /usr/share/my_module_utils/工具存放路径
#remote_tmp = ~/.ansible/tmp 远程主机临时文件
#local_tmp = ~/.ansible/tmp 本地主机临时文件
#forks = 5 并发执行数
#poll_interval = 15 拉取间隔
#sudo_user = root 以谁的身份在远程执行
#ask_sudo_pass = True 是否询问sudo口令(默认询问)
#ask_pass = True 是否询问执行身份的口令(默认询问)
#transport = smart 传输协议
#remote_port = 22 远程默认端口
#module_lang = C
#module_set_locale = False 使用的默认语言
log_path = /var/log/ansible.log 日志信息,默认未启用,设置为启用

因为ansible不是一个服务,所以改完配置文件无需重启服务。

十七、ansible系列命令

  • Ansible系列命令

    • ansible ansible-doc    ansible-playbook
    • ansible-vault    ansible-console   ansible-galaxy   ansible-pull
    • ansible-doc: 显示模块帮助
  • ansible通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible 端能基于密钥认证的方式联系各被管理节点

  • ansible [-m module_name] [-a args]
    • –version 显示版本
    • -m module 指定模块,默认为command
    • -v 详细过程 –vv
    • -vvv更详细
    • –list-hosts 显示主机列表,可简写 –list
    • -k, –ask-pass 提示输入ssh连接密码,默认Key验证
    • -K, –ask-become-pass 提示输入sudo时的口令
    • -C, –check 检查,并不执行
    • -T, –timeout=TIMEOUT 执行命令的超时时间,默认10s
    • -u, –user=REMOTE_USER 执行远程执行的用户
    • -b, –become 代替旧版的sudo 切换

  • ansible-doc [options] [module…]
    • -a 显示所有模块的文档
    • -l, –list 列出可用模块
    • -s, –snippet显示指定模块的playbook片段
    • 示例:
      • ansible-doc –l 列出所有模块
      • ansible-doc ping 查看指定模块帮助用法
      • ansible-doc –s ping 查看指定模块帮助用法

查看ansible 模块所有的模块

1
2
3
4
5
6
7
8
9
查看所有的模块
[root@ansible ~]# ansible-doc -l

列出某个模块的说明
查看ping模块的说明
[root@ansible ~]# ansible-doc ping

模块简要说明
[root@ansible ~]# ansible-doc -s ping

十八、ansible的Host-pattern(匹配主机的列表)

  • ansible的Host-pattern
    • 匹配主机的列表
    • All:表示所有的Inventory中的所有主机
      • ansible all -m ping
    • *:通配符
      • ansible “*” -m ping =ansible all -m ping
      • ansible 192.168.1.* -m ping
      • ansible “srvs” -m ping

范例:通配符使用

1
2
3
4
5
[root@ansible ~]# ansible 192.168.131.12* -m ping
192.168.131.129 | SUCCESS => {
"changed": false,
"ping": "pong"
}

范例:列出管理机中主机清单中的所有主机

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@ansible ~]# ansible all --list-hosts
hosts (3):
192.168.131.129
192.168.131.173
192.168.131.185
[root@ansible ~]# ansible websrvs --list-hosts
hosts (2):
192.168.131.129
192.168.131.173
[root@ansible ~]# ansible appsrvs --list-hosts
hosts (2):
192.168.131.173
192.168.131.185

或关系

  • ansible “websrvs:appsrvs” -m ping
  • ansible “192.168.131.129:192.168.131.130” -m ping

范例:实现主机清单中两个清单中或的关系执行此模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@ansible ~]# ansible "appsrvs:websrvs" --list-hosts
hosts (3):
192.168.131.173
192.168.131.185
192.168.131.129
[root@ansible ~]# ansible "appsrvs:websrvs" -m ping
192.168.131.129 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.131.173 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.131.185 | SUCCESS => {
"changed": false,
"ping": "pong"
}

逻辑与

  • ansible “websrvs:&dbsrvs” –m ping
  • 在websrvs组并且在dbsrvs组中的主机

范例:实现主机清单中两个清单中与的关系执行此模板

1
2
3
4
5
6
7
8
[root@ansible ~]# ansible "appsrvs:&websrvs" --list-hosts
hosts (1):
192.168.131.173
[root@ansible ~]# ansible "appsrvs:&websrvs" -m ping
192.168.131.173 | SUCCESS => {
"changed": false,
"ping": "pong"
}

逻辑非

  • ansible ‘websrvs:!dbsrvs’ –m ping
  • 在websrvs组,但不在dbsrvs组中的主机
    • 注意:此处为单引号

范例:实现主机清单中两个清单中非的关系执行此模板(取反)

1
2
3
4
5
6
7
8
9
此处为单引号
[root@ansible ~]# ansible 'appsrvs:!websrvs' --list-hosts
hosts (1):
192.168.131.185
[root@ansible ~]# ansible 'appsrvs:!websrvs' -m ping
192.168.131.185 | SUCCESS => {
"changed": false,
"ping": "pong"
}

综合逻辑

  • ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping

正则表达式

  • ansible “websrvs:&dbsrvs” –m ping
  • ansible “~(web|db).*.magedu.com” –m ping

十九、ansible命令执行过程

ansible命令执行过程

    1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg
    1. 加载自己对应的模块文件,如command
    1. 通过ansible将模块或命令生成对应的临时py文件,并将该 文件传输至远程 服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
    1. 给文件+x执行
    1. 执行并返回结果
    1. 删除临时py文件,sleep 0退出

执行状态:

  • 绿色:执行成功并且不需要做改变的操作
  • 黄色:执行成功并且对目标主机做变更
  • 红色:执行失败

二十、ansible使用示例

示例 (visudo)

  • 以wang用户执行ping存活检测
    • ansible all -m ping -u wang -k
  • 以wang sudo至root执行ping存活检测
    • ansible all -m ping -u wang –b -k
  • 以wang sudo至dai用户执行ping存活检测
    • ansible all -m ping -u wang –b -k –become-user dai
  • 以wang sudo至root用户执行ls
    • ansible all -m command -u wang –become-user=root -a ‘ls /root’ -b -k -K
-------------------码字不易尊重原创转载标注不胜感激-------------------
Yes or no?
0%