一 安装
1.1 ansible 架构
ansible 是一个非常简单的自动化部署项目, 由 python 编写并且开源. 用于提供自动化云配置, 配置文件管理, 应用部署, 服务编排和很多其他的 IT 自动化需求.
ansible 实现的自动化部署是多层次的, 通过描述系统之间的逻辑关系来构建业务所需要的基础架构模型, 而不仅仅用于管理一个单独的系统; 也就是说 ansible 不仅仅能部署一个或多个独立的服务, 它还能对这些服务做关联, 对部署顺序做编排等, 一个完美的 ansible 部署项目应该是层次分明, 顺序有秩的.
另外, ansible 是 Serverless 和 Agentless 项目, 在部署工具准备阶段基本上是零成本, 而且 ansible 使用 YAML 写 playbooks, 这使 playbook 看起来通俗易懂, 一目了然.
ansible 这个后起之秀在开源社区上也是非常火爆的, 可以说是部署工具届的网红一枚. 现在很多很火的开源项目都在使用 ansible 作为部署工具, 例如我熟悉的 openstack-ansible,openshift-ansible 等等
架构图:
通过架构图我们可以看到 ansible 主要由以下部分组成:
Core Modules
核心模块, 每个模块可以看成是一个小程序, 用于实现具体的部署动作, 也能指定被纳管服务的期望状态.
Custom Modules
自定义模块, 与核心模块相似, 不同之处在于人家是官方的, 自己是民间 (自定义) 的.
Plugins
是为了增强 ansible 核心功能的代码片段, 可以将其看作为一个函数, 作用范围小, 很实用.
Inventory
一个文件 (INI 类型) 或者目录, 主要作用是配置被纳管的主机和主机组, 如果是目录也可以放置组变量 group_vars 和主机变量 host_vars
Playbooks
用于存放 play, 每个 play 可以对指定的主机或主机组进行批量的部署动作, 上面说到的服务的部署, 关联, 编排就是在 playbook 内实现的.
Connection Plugins
控制节点与被纳管节点的通讯插件, Linux 系统默认使用 SSH 进行通讯.
1.2 节点安装
被管理节点安装
依赖于 python 环境, python 版本应该满足 2.6 或 2.7 或>=3.5 与控制节点的通讯服务, 通常是 sshd 服务
控制节点安装
python 环境需求同被管理节点一致, Windows 不能作为控制节点
支持的操作系统包括但不限于 Red Hat, Debian, CentOS, OS X, BSDs
安装方式根据操作系统的不同而定, 比较简单, 以 CentOS 为例, 配置好 yum 源后可以通过命令 yum install ansible -y 进行安装. 其他类型操作系统不一一列举了, 可以参考官方文档 https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html
二 配置文件
2.1 配置文件位置
ansible 配置文件可以存放在不同地方, 按优先级由高到低排序:
命令行 - c 或 --config 指定的配置文件路径
环境变量 ANSIBLE_CONFIG
执行 playbook 所在目录下的 ansible.cnf
当前执行用户家目录下. ansible.cnf(即~/.ansible.cnf)
默认配置文件存放路径 / etc/ansible/ansible.cnf
当我们执行 playbook 时, ansible 会按照上面列表的路径依次查找, 如果高优先级的文件被找到则会被使用.
查看当前正在使用的配置文件路径:
- ? lab-ansible ansible --version
- ansible 2.5.2
- config file = /Users/weim/DevOps/lab-ansible/ansible.cfg
- configured module search path = [u'/Users/weim/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
- ansible python module location = /usr/local/Cellar/ansible/2.5.2/libexec/lib/python2.7/site-packages/ansible
- executable location = /usr/local/bin/ansible
- python version = 2.7.14 (default, Apr 27 2018, 19:33:14) [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.37)]
2.2 配置文件参数
因配置文件参数太多, 下面只列举一些比较常用的参数; 表格中 defaults/inventory 代表 [defaults] 章节下的 inventory 参数, 其他依此类推
参数 | 含义 |
defaults/inventory | inventory 文件 (夹) 路径,默认值 / etc/ansible/hosts |
defaults/roles_path | roles 文件路径,默认值 / etc/ansible/roles |
defaults/remote_user | 指定连接被管理主机的用户,默认值 root |
defaults/forks | 同一时间操作目的主机的数量,默认值 5 |
defaluts/remote_port | 目的主机远程连接的端口,默认值 22 |
defaults/timeout | 连接目的主机的超时时间,默认值 10 |
?privilege_escalation/become | 是否允许当前执行用户提升权限,默认值 True |
privilege_escalation/become_method | 提权使用的方法,默认值 sudo |
privilege_escalation/become_user | 当 defaults/remote_user 不是 root 用户时,该用户提权后所变成的用户,默认值 root |
privilege_escalation/become_ask_pass | 提权时是否要交互式输入密码,默认值 False |
三 inventory
3.1 主机与主机组
主机和主机组
我们可以将 inventory 定义为一个 INI 文件或 YAML 类型的文件, 文件里面可以定义主机和主机组, 以 INI 类型文件为例:
- node1
- node2
- [first_group]
- node1
- [second_group]
- node2
- [nodes]
- node1
- node2
- node[3:10]
- node[a:f]
上面的示例可以看出:
节点可以单独定义, 不从属于任何组
连续数字或字母的主机可以使用 [] 扩起来表示
同一个主机是可以从属不同主机组的
默认主机组
ansible 默认有两个主机组: all 和 ungrouped,all 组包含所有主机, ungrouped 包含的主机只属于 all 组且不属于其他任何一组. 自定义组, all 组, ungrouped 组关系如图:
主机组的继承
主机组是可以继承的, 写法如下:
- [A_group]
- node1
- node2
- [B_group:children]
- A_group
上面示例中 B 组继承了 A 组, A 组的变量定义在 B 组内同样可以使用.
关于主机组的继承要记住的知识点:
all 组是任何主机组的父主机组
主机组继承, 对应的主机变量和组变量也会继承, 如果变量冲突, 子主机组的变量会覆盖父主机组的变量
变量
ansible 能够定义变量的地方可以很多, 所有的变量都可以归类为主机变量或组变量.
主机变量是针对某个主机的, 例如:
- [web]
- web1 http_port = 8080 maxRequestsPerChild = 404
- web2 http_port = 80 maxRequestsPerChild = 404
组变量是针对某个主机组的, 例如:
- [db]
- db1
- db2
- [db:vars]
- db_port = 3306
- bind_ip = 127.0.0.1
变量的分离
生产上如果有大规模的服务器, 那么将变量和主机定义写在一起就不太合适了, 根据需求我们可以将变量写在单独的文件中.
主机变量可以放在 inventory/host_vars 目录, 组变量可以放在 inventory/group_vars 目录, ansible 会通过主机名与 host_vars 目录下的文件名称来识别哪个文件存放的是该主机的变量; 同理, 主机组也是通过组名和文件名称来对应关系.
可能有点蒙圈, 看个例子就懂了:
inventory 目录结构:
.
├── group_vars
│ ├── all.YAML
│ ├── db.YAML
│ └── Web.YAML
├── host_vars
│ ├── web1.YAML
│ └── web2.YAML
└── hosts
hosts 文件内容如下:
- [Web]
- web1
- web2
- [db]
- db1
- db2
上述示例中, 我们可以看到:
group_vars 下的 Web.YAML 和 db.YAML 分别对应 hosts 文件中定义的 Web 和 db 组, 因为 all 组是默认所有组的父组, 所以 all.YAML 也是 Web 组和 db 组的变量定义文件, 如果与 db.YAML 和 Web.YAML 变量定义有冲突, db 和 Web 有效.
同理, host_vars 下的 web1.YAML 和 web2.YAML 分别是 web1 和 web2 主机的变量定义, 如果与 group_vars 下的 Web.YAML 变量有冲突, host_vars 目录下的变量定义有效.
变量的优先级
在 inventory 文件内, 如果变量定义冲突, 那么优先级是这样的:
对于主机组, 子组的变量会覆盖父组的变量
对于主机, 主机变量会覆盖组变量
3.2 动态 inventory
在 3.1 章节中我们介绍和使用的都是静态 inventory,ansible 也可以使用动态 incentory, 那么动态 inventory 是什么呢?
动态 inventory 是指可以从一个公共仓库 pull 下来, 简单配置一些参数后就能直接使用的 inventory. 因为动态 inventory 是对某一项目的通用模版, 所以这种类型的 inventory 通常在大型的开源项目比较常用. 例如: AWS EC2, Cobbler, OpenStack 等等.
动态 inventory pull 下来后是一个 python 脚本, 可以通过添加执行权限后./xxx.py --list 查看都包含哪些主机.
关于动态 inventory, 这里不在扩展. 如果有机会, 在后续的 ansible 进阶章节在着重介绍.
四 Ad Hoc 命令
在 ansible 基础 - 理解篇中, 笔者已经阐述过, ansible 相对于 Puppet 有一个优势, 就是 CLI 更加丰富, 除了让 ansible 执行写好的 playbook 外, 我们也可以使用 ansible 命令对指定的主机或主机组执行批量的动作, 这里要注意一下, ansible 命令可以使用 Core Modules, 但是 inventory 里定义的主机变量和组变量不能生效.
命令帮助如下:
- ? inventory ansible --help
- Usage: ansible <host-pattern> [options]
如果不用 - m 指定模块, ansible 命令默认使用 command 模块.
示例 1: 查看 nodes 主机组的主机名
- ? lab-ansible ansible nodes -a 'hostname'
- node2 | SUCCESS | rc=0>>
- node2
- node1 | SUCCESS | rc=0>>
- node1
ansible 命令也可以指定很多附加参数, 例如指定 remote_user(- u),forks 数量 (- f), 提权(-b), 提权是否要输入密码(--ask-become-pass) 等等, 其他参数请使用 ansible --help 命令查看.
示例 2: 使用 copy 模块将本地 test.txt 文件拷贝到目的主机 / etc/test.txt, 设定使用 student 用户登陆, 并且要求提权, 提权方式为 sudo, 要求交互式输入提权密码.
? lab-ansible ansible nodes -m copy -a 'src=./test.txt dest=/etc/test.txt' --user=student --become --become-user=root --become-method=sudo --ask-sudo-pass
命令行传入的参数优先级是最高的, 包括连接参数和变量, 关于变量优先级, 在后续的 "ansible 基础 - 变量" 会详细阐述.
五 本节应该掌握的技能
使用 ansible 前控制节点和被纳管节点环境需求, 会安装部署 ansible
配置文件可以存在的位置和常用的配置文件参数的含义
会写 inventory, 掌握 inventory 目录结构和各文件作用
简单了解动态 inventory 的概念
会使用 ansible 命令对目的主机批量处理
会使用常用的 Core Module
六 参考链接
- https://docs.ansible.com/ansible/2.5/dev_guide/overview_architecture.html
- https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html
- https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
- https://docs.ansible.com/ansible/latest/user_guide/intro_dynamic_inventory.html#intro-dynamic-inventory
欢迎大家关注我的公众号:
来源: http://www.bubuko.com/infodetail-2868881.html