1, Ansible 发展史
1.1 Ansible
- 创始人,Michael DeHaan(Cobbler 与 Func 的作者)
- 2012-03-09,发布 0.0.1 版,红帽收购
- 2015-10-17,Red Hat 宣布收购
1.2 同类自动化工具 GitHub 关注程度(2016-07-10)
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 文件
- INVEVTORY:Ansible 管理主机的清单 /etc/ansible/hosts
- MODULES:Ansible 执行命令的功能模块,多数为内置核心模块,也可自定义
- PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
- API:供第三方程序调用的程序编程接口
- ANSIBLE:组合 INVENTORY、API、MODULES、PLUGINS 的绿框,可以理解为 ansible 命令工具,气味核心执行工具
5.1 Ansible 命令执行来源:
- USER,普通用户,即 SYSTEM ADMINISTRATOR
- CMDB(配置管理数据库)API调用
- PUBLIC/PRIVATE CLOUD API 调用
- USER -> Ansible Playbook -> Ansible
5.2 利用 ansible 实现管理的方式
- Ad-Hoc 即 ansible 命令,主要用于临时命令使用场景
- Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有提前的规划
5.3 Ansible-playbook (剧本)执行过程
- 将已有编排好的任务集写入 Ansible-Playbook
- 通过ansible-playbook 命令分拆任务集逐条 ansible 命令,按预定规则逐条执行
5.4 Ansible 主要操作对象:
5.5 注意事项
- 执行 ansible 的主机一般称为主控端,中控,master 或堡垒机
- 主控端 Python 版本需要 2.6 及以上
- 被控端 Python 版本小于 2.4 需要安装 Python-simplejson
- 被控端如开启 SELinux 需要安装 libselinux-python
- windows 不能做为主控端
6,安装
# yum info ansible
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Installed Packages
Name : ansible
Arch : noarch
Version : 2.7.7
Release : 1.el7
Size : 60 M
Repo : installed
From repo : epel
Summary : SSH-based configuration management, deployment, and task execution system
URL : http://ansible.com
License : GPLv3+
Description : Ansible is a radically simple model-driven configuration management,
: multi-node deployment, and remote task execution system. Ansible works
: over SSH and does not require any software or daemons to be installed
: on remote nodes. Extension modules can be written in any language and
: are transferred to managed machines automatically.
yum install -y ansible
# ansible --version
ansible 2.7.7
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)]
7, 相关文件
7.1 配置文件
/etc/ansible/ansible.cfg # 主配置文件,配置 ansible 工作特性
/etc/ansible/hosts # 主机清单
/etc/ansible/roles/ # 存放角色的目录
7.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 界面与用户交互的执行工具
8,主机清单 inventory
- Inventory 主机清单
- ansible 的主要功能用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file 中将其分组命名
- 默认的 inventory file 为 /etc/ansible/hosts
- inventory file 可以有多个,且也可以通过 Dynamic Inventory 来动态生成
- /etc/ansible/hosts 文件格式
- inventory 文件遵循 INI 文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口来表明
ntp.example.com
[webservers]
www1.example.com:222
www2.example.com
[dbservers]
db1.example.com
db2.example.com
[servers]
192.168.1.100
192.168.1.111
- 如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机
[webservs]
www[01:100].example.com
[dbsrvs]
db-[a:f].example.com
[srvs]
192.168.1.10[0:1]
9, Ansible 配置文件
- Ansible 配置文件 /etc/ansible/ansible.cfg (一般保持默认)
- [defaults]
# inventory = /etc/ansible/hosts # 主机列表配置文件
# library = /usr/share/my_modules/ # 库文件存放目录
# remote_tmp = $HOME/.ansible/tmp # 临时py命令文件存放远程主机目录
# loacl_tmp = $HOME/.ansible/tmp # 本机的临时命令执行目录
# forks = 5 # 默认并发数
# sudo_user = root # 默认 sudo 用户
# ask_sudo_pass = True # 每次执行 ansible 命令是否询问 ssh 密码
# ask_pass = True
# remote_port = 22
# host_key_checking = False # 检查对应服务器的host_key,建议取消注释
# log_path = /var/log/ansible.log # 日志文件