[转] 第一章 Ansible 基础介绍及安装
1.1 Ansible 基础介绍
Ansible是一个开源自动化运维平台。Ansible是一个可以在Ansible playbook中在完美描述IT应用架构的 简单的自动化语言。它也是一个运行Ansible Playbook的自动化引擎。
Ansible可以管理强大的自动化任务,并且可以适应许多不同的工作流和环境。同时,Ansible的新使用者 可以非常快速的使用它并将其带入生产环境。
1.2 Ansible优势
-
ansible融合了众多老牌运维工具的优点,基本上pubbet和saltsatck能实现的功能,ansible都可以显现。
-
轻量级,无需在客户端上安装agent,更新时,只需要在操作机上进行一次更新即可。
-
ansible是一个轻量级的工具,ansible不需要启动服务,仅仅只是一个工具,可以轻松实现分布式扩展。
-
批量任务执行可以写成脚本,而且不用分发的远程就可以执行。
-
ansible是一致性,高可靠性,安全性设计的轻量级自动化工具。
-
使用python编写,维护更加简单。
1.3 Ansible概念和架构
上图为ansible的基本架构,从上图可以了解到其由以下部分组成:
-
核心:ansible
-
核心模块(Core Modules):这些都是ansible自带的模块
-
扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块
-
插件(Plugins):完成模块功能的补充
-
剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行
-
连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
-
主机群(Host Inventory):定义ansible管理的主机
1.4 Ansible工作原理
使用者使用Ansible或Ansible-playbook (会额外读取Playbook文件)时,在服务器终端输人Ansible的Ad-Hoc命令集或Playbook后,Ansible会遵循预先编排的规则将Playbooks逐条拆解为Play,再将Play组织成Ansible可识别的任务(Task),随后调用任务涉及的所有模块(Module)和插件(Plugin),
根据Inventory中定义的主机列表通过SSH(Linux默认)将任务集以临时文件或命令的形式传输到远程客户端执行并返回执行结果,如果是临时文件则执行完毕后自动删除。
1.5 Ansible 目录结构介绍
Ansible是开源工具, 整个开发过程或二次开发均遵循GPL协议, 所以所有源码均可见。作为一款日常工作所需的核心软件, 我们有必要知道其目录分布及各目录功能。 通过如下命令我们可以获取Ansible所有文件存放目录:
# 查看ansible 安装目录结构
rpm -ql ansible
该命令输出内容较多, 大致分为如下几类:
描述 | 路径 |
---|---|
配置文件目录 | /etc/ansible/ |
执行文件目录 | /usr/bin/ |
Lib库依赖目录 | /usr/lib/pythonX.X/site-packages/ansible/ |
Help 文档目录 | /usr/share/doc/ansible-X.X.X/ |
Man文档目录 | /usr/share/man/manl/ |
其中, 如下目录运维常要配置, 需熟练掌握。
配置文件目录/etc/ansible/,主要功能为: Inventory 主机信息配置、Ansible 工具功能配置等。 所有 Ansible 的配置均存放在该目录下, 运维日常的所有配置类操作也均基于此目录进行。
执行文件目录/usr/bin/, 主要功能为: Ansible 系列命令默认存放目录。 Ansible 所有的可执行文件均存放在该目录下。
1.6 Ansible配置文件解析(ansible.cfg)
Inventory 用千定义 Ansible 的主机列表配置, Ansible 的自身配置文件只有一个, 即 ansible.cfg, Ansible 安装好后它默认存放于/etc/ansible/ 目录下。
ansible.cfg 配置文件可以存在于多个地方, Ansible 读取配置文件的顺序依次是当前命令执行目录→用户家目录下的。ansible.cfg→ /etc/ansible.cfg, 先找到哪个就使用哪个的配置。其 ansible.cfg 配置的所有内容均可在命令行通过参数的形式传递或定义在 Playbooks 中。目前ansible 配置文件有四种,如下显示:
-
使用/etc/ansible/ansible.cfg
ansible 软件包提供一个基本的配置文件,它位于/etc/ansible/ansible.cfg。如果找不到其他配置文件,则使用此文件。
-
使用~/ansible.cfg
Ansible 在用户的主目录中查找. ansible.cfg 文件。如果存在此配萱并且当前工作目录中也没有ansible.cfg 文件,则使用此配置取代/etc/ansible/ansible.cfg。
-
使用./ansible.cfg
如果执行ansible 命令的目录中存在ansible.cfg 文件,则使用它,而不使用全局文件或用户的个入文件。这样,管理员可以创建一种目录结构,将不同的环境或项目存储在单独的目录中,并且每一目录包含为独特的一组设置而定制的配置文件。
-
使用ANSIBLE_CONFIG 环境变量
通过ANSIBLE_CONFIG 环境变量定义配萱文件的位置。定义了此变量时,Ansible 将使用变 量所指定的配置文件,而不用上文中提及的任何配置文件。
-
这四种文件的优先级为
ANSIBLE_CONFIG 环境变量 > ./ansible.cfg > ~/ansible.cfg > /etc/ansible/ansible.cfg
配置文件 ansible.cfg 约有 350 行语句, 大多数为注释行默认配置项。 该文件遵循 INI 格 式, 分为如下几类配置。
1.6.1 [defaults]
该类配置下定义常规的连接类配置, 如 inventory、library、remote_tmp、local_tmp、forks、poll_interval、sudo_user、ask_sudo_pass、ask_pass、transport、remote_port 等。
1.6.2 [privilege_ escalation]
出于安全角度考虑, 部分公司不希望直接以 root 的高级管理员权限直接部署应用, 往往会开放普通用户权限并给予 sudo 的权限, 该部分配置主要针对 sudo 用户提权的配置。
1.6.3 [paramiko—connection]
定义 paramiko_ connection 配置, 该部分功能不常用, 了解即可。
1.6.4 [ssh connection]
Ansible 默认使用 SSH 协议连接对端主机, 该部署是主要是 SSH 连接的一些配置,但配置项较少, 多数默认即可。
1.6.5 [accelerate]
Ansible 连接加速相关配置。因为有部分使用者不满意Ansible 的执行速度, 所以Ansible 在连接和执行速度方面也在不断地进行优化, 该配置项在提升Ansible 连接速度时会涉及, 多数保持默认即可。
1.6.7 [selinux]
关于 selinux 的相关配置几乎不会涉及, 保持默认配置即可。
1.6.8 [colors]
Ansible 对于输出结果的颜色也进行了详尽的定义且可配置, 该选项对日常功能应用影响不大, 几乎不用修改, 保持默认即可。
1.7 Ansible 管理主机配置文件解析(Inventory)
Inventory 是 Ansible 管理主机信息的配置文件,相当于系统 HOSTS 文件的功能,默认存放在/etc/ansible/hosts。为方便批量管理主机,便捷使用其中的主机分组,Ansible 通过Inventory 来定义其主机和组,在使用时通过-i 或 --inventory-file 指定读取,与 Ansible 命令结合使用时组合如下:
ansible -i /etc/ansible/hosts webs -m ping
如果只有一个 Inventory 时可不用指定路径,默认读取/etc/ansible/hosts。 Inventory 可以同时存在多个,而且支持动态生成,如 AWS EC2、Cobbler 等均支持。
1.7.1 定义主机和组
Inventory 配置文件遵循 INI 文件风格,中括号中的字符为组名。 其支持将同一个主机同时归并到多个不同的组中,分组的功能为IT 人员维护主机列表提供了非常大的便利。
此外,若目标主机使用了非默认的 SSH 端口,还可以在主机名称之后使用冒号加端口号来标明,以行为单位分隔配置,详细信息可参考以下代码中的注释。
1.7.2 定义主机变量
在日常工作中, 通常会遇到非标准化的需求配置, 如考虑到安全性问题, 业务人员通常将企业内部的 Web 服务 80 端口修改为其他端口号, 而该功能可以直接通过修改 Inventory 配置来实现, 在定义主机时为其添加主机变量, 以便在 Playbook 中使用针对某一主机的个性化要求。
1.7.3 定义组变量
Ansible 支持定义组变量, 主要针对大量机器的变量定义需求, 赋予指定组内所有主机在 Playbook 中可用的变量, 等同于逐一给该组下的所有主机赋予同一变量。 定义组变量的参考案例如下:
1.7.4 定义组嵌套及组变量
Inventory中,组还可以包含其他的组(嵌套),并且也可以向组中的主机指定变扯。不过,这些变量只能在Ansible-playbook中使用,而Ansible不支持。组与组之间可以相互调用,并且可以向组中的主机指定变量。
Ansible以简单为其核心理念, 上述实现在业务日常使用中并不常见, 了解其用法即可。
1.7.5 多重变量定义
变量除了可以在Inventory中一并定义, 也可以独立于Inventory文件之外单独存储到YAML格式的配置文件中, 这些文件通常以.yml、.yaml、.json为后缀或者无后缀。 变批通常从如下4个位置检索:
-
Inventory配置文件(默认/etc/ansible/hosts)
-
Playbook中vars定义的区域
-
Roles中vars目录下的文件
-
Roles同级目录group_vars和hosts_vars目录下的文件
假如foosball主机同属于raleigh和webservers组, 那么其变量在如下文件中设置均有效:
对于变量的读取,Ansible遵循如上优先级顺序,因此大家设置变量时尽量沿用同一种方式,以方便维护人员管理。
1.7.6 其他Inventory参数列
除了支持如上的功能外,Ansible基于 SSH 连接Inventory中指定的远程主机时, 还内置了很多其他参数,用于指定其交互方式,如下列举了部分重要参数:
其他内置参数还有数十个,这些参数均可以直接写在命令行或 Playbook 文件中,以覆盖配置文件中的定义。更多参数请参考官网。
1.8 Ansible命令用法解析
1.8.1 ansible
命令ansible是日常工作中使用率非常高的命令之一 , man中是如此定义其功能的:run a command somewhere else, 可见其灵活性。 ansible命令主要在如下场景使用:
-
非固化需求
-
临时一次性操作
-
二次开发接口调用
那么什么是非固化需求和临时一次性操作呢?简单来讲, 比如工作中我临时想查看webl服务器组是否存活, 或我想临时复制本地的/etc/fstab到 web服务器组的/tmp目录下 做测试, 类如这些没有规律的 、临时需要做的任务, 我们称之为非固化需求、临时一次性操 作。具体的命令使用如下:
# 检查服务器存活
ansible webl -m ping
# 复制本地文件到远程
ansible webl -m copy -a "src=/etc/fstab dest=/tmp/fstab owner=root group=root mode=644 backup=yes"
Ansible 的返回结果都非常友好, 一般会用3 种颜色来表示执行结果:红色、绿色、橘黄色。其中红色表示执行过程有异常,一般会中止剩余所有的任务,绿色和橘黄色表示执行过程没有异常,所有任务均正常执行,但橘黄色表示命令执行结束后目标有状态的变化。而绿色表示命令执行结束后目标没有状态变化。
不仅 ansible 命令的执行结果如此设置, Ansible系列命令均如此设置, 所以判断 Ansible系列命令的执行结果是否正常是一件非常容易的事情, 只要看颜色即可。
1.8.2 ansible-galaxy
这里的 galaxy 和三星手机没有任何关系。 ansible-galaxy 的功能可以简单地理解为GitHub 或 PIP 的功能, 通过 ansible-galaxy 命令, 我们可以根据下载量和关注量等信息, 查找和安装优秀的 Roles。在 ansible-galaxy 上, 我们可以上传和下载 Roles, 这里也是优秀 Roles 的聚集地, 下载地址为 https://galaxy.ansible.com。
ansible-galaxy 命令使用格式如下:
ansible-galaxy [init | info | install | list | remove] [--help] [options] ...
1) 常用参数 init: 初始化本地的Roles 配置, 以备上传Roles 至galaxy。
参数 | 描述 |
---|---|
info | 列表指定Role 的详细信息 |
install | 下载并安装galaxy 指定的Roles 到本地 |
list | 列出本地巳下载的Roles |
remove | 删除本地已下载的Roles |
Ansible 2.0 版本中, 针对ansible-galaxy 增加了login、import、delete、setup 等功能,但这些功能需基于login 在 galaxy 认证成功后方可执行, 主要为了方便对 galaxy 上已有的 Roles 的配置工作。
2) help 用法显示 [--help]
针对第一部分的 init、info 等功能, 其后跟--help 可单独显示该项用法。 例如:
ansible-galaxy init -help
执行后会返回ansible-galaxy init 选项的用法说明。
3) 参数项 [options]
该部分结合第一部分的参数完成 ansible-galaxy 完整的功能用法, 如:
ansible-galaxy init [options] role_ name 即 ansible-galaxy init 后跟[-f | -h | -c | -p | --offline | -s | SERVER | -v | --version] 参数, 后跟role-name 成为一条完整的命令。
具体可参考如下:
# 下载用户hectcastro的Nginx这个Role到本地并忽略错误(默认存放在/etc/ansible/roles/)
ansible-galaxy --ignore-errors install azavea.git
因为 ansible-galaxy 是对 https://galaxy.ansible.com 网站的上传、 下载、 配置类工作, 如有类似如下报错, 请确保该网站可正常访问。
1.8.3 ansible-pull
该指令的使用涉及Ansible 的另一种工作模式: pull 模式 (Ansible 默认使用 push 模式)。这和通常使用的 push 模式工作机理刚好相反, 其适用于以下场景:1. 你有数量巨大的机器需要配置, 即使使用高并发线程依旧要花费很多时间;2. 你要在刚启动的、 没有网络连接的主机上运行Anisble 。
ansible-pull 命令使用格式如下:
ansible-pull [options] [playbook.yml]
通过 ansible-pull 结合 Git 和 crontab 一并实现, 其原理如下:通过 crontab 定期拉取指定的 Git 版本到本地, 并以指定模式自动运行预先制订好的指令。
具体示例参考如下:
ansible-pull通常在配置大批量机器的场景下会使用,灵活性稍有欠缺,但效率几乎可以无限提升,对运维人员的技术水平和前瞻性规划有较高要求。
1.8.4 ansible-doc
ansible-doc 是Ansible 模块文档说明, 针对每个模块都有详细的用法说明及应用案例介绍,功能和Linux系统man 命令类似。该命令使用方式如下:
ansible-doc [options] [module... ]
ansible-doc 命令后跟 [options] 参数或[模块名], 显示模块用法说明, 具体示例如下:
# 列出支持的模块
ansible-doc -l
# 模块功能说明
ansible-doc ping
1.8.5 ansible-playbook
ansible-playbook 是日常应用中使用频率最高的命令, 其工作机制是:通过读取预先编写 好的 playbook 文件实现批量管理。要实现的功能与命令 ansible 一样, 可以理解为按一定条件组成的 ansible 任务集。
ansible-playbook 命令后跟 YML 格式的 playbook 文件, 执行事先编排好的任务集, 命令使用方式如下:
ansible-playbook playbook.yml
具体示例如下:
# 执行gw.yml这个playbook中定义的所有任务集
ansible-playbook gw.yml
Playbook具有编写简单、可定制性高、灵活方便,以及可固化日常所有操作的特点,运维人员应熟练掌握。
1.8.6 ansible-vault
ansible-vault主要用于配置文件 加密,如编写的Playbook配置文件中包含敏感信息,不希望其他人随意查看,ansible-vault可加密/解密这个配置文件 ,具体使用方式如下:
具体示例如下。 设定如下密码, 加密a.yrnl文件 。
会有以下输入加密密码提示:
这时,再打开a.yml文件 后会发现该文件乱码,只有通过如下命令解密后方可正常查看。
输入预设的密码后方可解密。
此时a.yml文件可正常查看。
1.9 Ansible 正则表达式
1.9.1 All(全量)匹配
匹配所有主机,all或*号功能相同。如检测所有主机存活情况。
# all和*功能相同,但*号需引起来
ansible all -m ping
ansible "*" -m ping
# 检查 192.168.1.0/24 网段所有主机存活状况。
ansible 192.168.1.* -m ping
1.9.2 逻辑或(or)匹配
如我们希望同时对多台主机或多个组同时执行, 相互之间用 “ :"(冒号)分隔即可。
web1:web2
使用方式如下:
ansible "webl:web2" -m ping
1.9.3 逻辑非(!)匹配
逻辑非用感叹号(!)表示,主要针对多重条件的匹配规则,使用方式如下:
# 所有在webservers组但不在phoenix组的主机
webservers:!phoenix
1.9.4 逻辑与(&)匹配
和逻辑非一样,逻辑与也主要针对多重条件的匹配规则,只是逻辑上的判断不同。 逻辑与使用&表示,请看如下示例:
# webservers组和staging组中同时存在的主机
webservers:&staging
1.9.5 多条件组合
Ansible 同样支持多条件的复杂组合,该情况企业应用不多,这里做简单举例说明。
# webservers和dbservers两个组中的所有主机在staging组中存在且在phoenix组中不存在的主机
webservers:dbservers:&staging:!phoenix
1.9.6 模糊匹配
*通配符在 Ansible表示 0个或多个任意字符,主要应用于一些模糊规则匹配,在平时的使用中应用频率非常高,请参考如下示例:
# 所有以.magedu.com结尾的主机均符合
*.magedu.com
# one开头.com结尾的所有主机和dbservers组中的所有主机
one*.com:dbservers
1.9.7 域切割
Ansible 底层基于 Python, 因此也支持域切割。 Python 字符串域切割的示例如下:
str = '12345678'
print str[0:1]
通过 [0:1] 即可获取数值 1。该功能在 Ansible 中也支待,以如下 Inventory 内容为例:
[webservers]
cobweb
webbing
weber
通过截取数组下标可以获得对应变量值。
webservers[0] # == cobweb
webservers[-1] # == weber
webservers[0:1] # == webservers[0],webservers[1]
# == cobweb,webbing
webservers[1:] # == webbing,weber
1.9.8 正则匹配
Ansible 同样完整支持正则匹配功能,“~”开始表示正则匹配。
~(web|db).*\.example\.com
检测beta.example.com 、 web.example.com 、 green.example.com 、 befa.example.org 、web.example.org、 green.example.org 的存活, 使用如下匹配模式:
ansible "~(beta|web|green)\.example\.(com|org)" -m ping
检测 Inventory 中所有以192.168开头的服务器存活信息:
ansible ~192\.168\.[0-9]\{\2}.[0-9]\{2,} -m ping
1.10 Ansible 安装
YUM (Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。 基千RPM包管理, 能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖 的软件包,无需烦琐地一次次下载、安装。 YUM 安装Ansible 过程如下:
# 添加Ansible源
cat <<EOF> /etc/yum.repos.d/tsinghua.repo
[ansible]
name=ansible
baseurl=https://mirror.tuna.tsinghua.edu.cn/epel/7/x86_64/
gpgcheck=0
EOF
# 安装Ansible
yum -y install ansible
# 验证Ansible
ansible --version
1.10.2 源码方式安装
源码安装本身就是一道很高的门槛,作为刚接触Linux的新手不建议使用该方式。
# 安装git客户端
yum -y install git
# 拉取源码
git clone https://github.com/ansible/ansible.git /usr/local/ansible
# 执行安装文件
source /usr/local/ansible/hacking/env-setup
# 验证Ansible
ansible --version