运维自动化之 ANSIBLE 详解
相关概念介绍
1、常用自动化运维工具
- Ansible — python,Agentless,中小型应用环境
- Saltstack — python,一般需部署agent,执行效率更高
- Puppet — ruby, 功能强大,配置复杂,重型,适合大型环境
- Fabric — python,agentless
- Chef — ruby,国内应用少
- Cfengine
- func
2、Ansible 特性
- 模块化 — 调用特定的模块,完成特定任务
- 关键模块 — 有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块
- 支持自定义模块
- 基于Python语言实现
- 部署简单,基于python和SSH(默认已安装),agentless(客户端无须部署额外程序)
- 安全 — 基于OpenSSH
- 支持playbook编排任务
- 幂等性 — 一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
- 无需代理不依赖PKI(无需ssl)
- 可使用任何编程语言写模块
- YAML格式 — 编排任务,支持丰富的数据结构
- 较强大的多层解决方案
3、Ansible 架构
4、Ansible 工作原理
5、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实现管理的方式:
# 1、Ad-Hoc 即 ansible 命令,主要用于临时命令使用场景 # 2、Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划
-
Ansible-playbook(剧本)执行过程:
# 1、将已有编排好的任务集写入 Ansible-Playbook # 2、通过 ansible-playbook 命令分拆任务集至逐条 ansible 命令,按预定规则逐条执行
-
Ansible主要操作对象:
# 1、HOSTS 主机 # 2、NETWORKING 网络设备
-
注意事项:
# 1、执行ansible的主机一般称为主控端,中控,master或堡垒机 # 2、主控端Python版本需要2.6或以上 # 3、被控端Python版本小于2.4需要安装python-simplejson # 4、被控端如开启SELinux需要安装libselinux-python # 5、windows不能做为主控端
ANSIBLE 安装和相关文件
1、Ansible 安装方式
1.1 epel 源安装 rpm 包
# yum install ansible
1.2 编译安装
# 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
1.3 Git 方式
# git clone git://github.com/ansible/ansible.git --recursive
# cd ./ansible
# source ./hacking/env-setup
1.4 pip 安装
pip 是安装 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
1.5 确认是否安装 Ansible 的命令
[root@Tang ~]# ansible --version
ansible 2.8.5
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
2、Ansible 相关文件
2.1 配置文件
# /etc/ansible/ansible.cfg # 主配置文件,配置 ansible 工作特性
# /etc/ansible/hosts # 主机清单
# /etc/ansible/roles/ # 存放角色的目录
2.2 程序文件
# /usr/bin/ansible # 主程序,临时命令执行工具
# /usr/bin/ansible-doc # 查看配置文档,模块功能查看工具
# /usr/bin/ansible-galaxy # 下载/上传优秀代码或Roles模块的官网平台
# /usr/bin/ansible-playbook # 定制自动化任务,编排剧本工具/usr/bin/ansible-pull 远程执行命令的工具
# /usr/bin/ansible-vault # 文件加密工具
# /usr/bin/ansible-console # 基于Console界面与用户交互的执行工具
2.3 主机清单 inventory
- ansible 的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在 inventory file 中将其分组命名
- 默认的 inventory file 为 /etc/ansible/hosts
- inventory file 可以有多个,且也可以通过 Dynamic Inventory 来动态生成
2.4 /etc/ansible/hosts 文件格式
-
inventory 文件遵循 INI 文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明
ntp.neotang.com [webservers] www1.neotang.com:2222 www2.neotang.com [dbservers] db1.neotang.com db2.neotang.com db3.neotang.com
-
如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机,中括号内的数字或字母会自动展开
[websrvs] www[01:100].example.com [dbsrvs] db-[a:f].example.com
-
示例:
[root@Tang ~]# cat /etc/ansible/hosts | grep testhosts -A 1 [testhosts] www.neotang[1:5].com [root@Tang ~]# ansible testhosts --list-hosts hosts (5): www.neotang1.com www.neotang2.com www.neotang3.com www.neotang4.com www.neotang5.com
2.5 ansible 配置文件
- Ansible 配置文件 /etc/ansible/ansible.cfg (一般保持默认)
- Ansible 配置文件的默认配置项说明
[defaults]
#inventory = /etc/ansible/hosts # 主机列表配置文件
#library = /usr/share/my_modules/ # 库文件存放目录
#remote_tmp = $HOME/.ansible/tmp # 临时py命令文件存放在远程主机目录
#local_tmp = $HOME/.