第 1 章 Ansible 介绍及安装
1.1 介绍
Ansible 是一个 IT 自动化工具。它能配置系统、部署软件、编排更复杂的 IT 任务,如连续部署或零停机时间滚动更新。Ansible 用 Python 编写,尽管市面上已经有很多可供选择的配置管理解决方案(例如 Salt、Puppet、Chef等),但它们各有优劣,而Ansible的特点在于它的简洁。
让 Ansible 在主流的配置管理系统中与众不同的一点便是,它并不需要你在想要配置的每个节点上安装自己的组件。同时提供的另一个优点,如果需要的话,你可以在不止一个地方控制你的整个基础架构。
1.2 工作原理
1、在ANSIBLE 管理体系中,存在"管理节点" 和 "被管理节点" 两种角色。
2、被管理节点通常被称为"资产"
3、在管理节点上,Ansible将 AdHoc 或 PlayBook 转换为Python脚本。并通过SSH将这些Python
脚本传递到 被管理服务器上。在被管理服务器上依次执行,并实时的将结果返回给管理节点。
1.3 如何安装
管理节点
确保存在OpenSSH
确保Python 版本 >= 2.6
确保安装ansible
被管理节点
确保存在OpenSSH
确保Python 版本 >= 2.4 //若为2.4 版本,确保安装了python-samplesjson 扩展
不需要安装ansible
安装Ansible
# pip install ansible // 确保最新版本ansible 或者 pip3 install ansible
# yum -y install ansible // (运维推荐使用)不一定是最新版本ansible
确保管理节点与被管理节点之间SSH 信任关系
// 生成公私钥对
# ssh-keygen -t rsa
# cd ~/.ssh && ls
id_rsa id_rsa.pub
// 将公钥 id_rsa.pub copy 到 被管理服务器上 authorized_keys 文件中, 确保文件的权限为 0600
// managedhost 为被管理服务器,copy的过程中需要用户名及密码
# ssh-copy-id root@managedhost
1.4 快速入门
场景假设
管理节点:
10.3.134.2
被管理节点(资产):
10.3.134.4
10.3.134.98
且管理节点 和 被管理节点之间的节点已经打通 SSH 信任关系。
场景一
在管理节点上,确保同所有被管理节点的网络连通性。
# ansible all -i 10.3.134.4,10.3.134.98 -m ping
// 注意 -i 参数后面接的是一个列表(List)。因此当为一个被管理节点时,#我们后面一定要加一个逗号(,)#告知是List
# ansible all -i 10.3.134.4, -m ping
场景二
在管理节点上,确保文件/tmp/a.conf 发布到所有被管理节点
# ansible all -i 10.3.134.4,10.3.134.98 -m copy -a "src=/tmp/a.conf dest=/tmp/a.conf"
参数解释
-i // 指定Ansible 的资产,也就是被管理服务器。
-m // 指定要运行的模块,比如这里的 ping 模块和 copy 模块
-a // 指定模块的参数, 这里模块 ping 没有指定参数。 模块 copy 指定了 src 和 dest 参数
all // ansible 中, 将其叫做pattern , 即匹配。我通常称它为资产选择器。
// 就是匹配资产(-i 参数指定) 中的一部分。这里的 all 是匹配所有指定的所有资产。
// 在资产的章节中,我们将详细阐述。
第 2 章 Ansible 资产
在快速入门的场景中,我们一共管理了两台服务器。但是在实际场景中,我们要管理的服务器往往要多得多。难道依然要在Ansible 的 -i 参数后面一个个追加IP指定吗? 这显然不合乎常理。因此这一节我们主要去介绍一下Ansible的资产。Ansible 的资产分为静态资产和动态资产。
1.1 静态资产
顾名思义它本身是一个文本文件,一个格式类似INI的文件。默认情况下,Ansible的资产文件位于 /etc/ansible/hosts。
我们这里给出一个自定义的静态资产实例,然后再具体解释其含义。
# cat inventory
1.1.1.1
2.2.2.2
3.3.3.[1:15]
test01.biudefor.com
test03.biudefor.com
test[05:09].biudefor.com
[web_servers]
10.3.134.4
10.3.134.3
10.3.134.5
[db_servers]
10.3.134.4
10.3.134.3
10.3.134.5
[all_servers]
[all_servers:children]
db_servers
web_servers
1、Ansible 的资产文件中,可以以IP地址的形式或者主机名的形式存在
2、Ansible 的资产若连续,可以使用[stat:end] 的形式去表达
3、可以将服务器按照业务场景定义成组,比如db_servers 和 web_servers
4、组和组之间可以存在继承关系,比如db_servers 和 web_servers 同时继承all_servers 组
如何使用自定义资产
// 通过 -i 参数指定自定义资产的位置即可(可以是全路径,也可以是相对路径)。
# ansible all -i inventory.ini ... // 伪指令,不可执行
如何验证自定义资产
// 假如我们刚刚定义的资产为 inventory.ini
// 列举出所有资产
# ansible all -i inventory.ini --list-hosts
// 列举出选定资产,比如这里列举出`web-servers短横线是错误写法` web_servers
// 注意这里使用的了资产选择器(pattern),我们将会在下面对他进行详细的阐述
# ansible web_servers -i inventory.ini --list-hosts
// 以上指令,若能列举出我们在资产中定义的服务器,那么你的自定义资产也就生效了。
生产实战
生产中一般会改变配置文件,将资产指定一个目录,然后将资产进行分批管理。实际生产中不可能只有几台服务器,可能是几十台,几百台,这时候就需要进行统一管理,管理时还需要分服务器服务类别方便运维人员进行管理。
[root@biudefor ~]# vim /etc/ansible/ansible.cfg
[defaults]
# some basic default values...
inventory = /etc/ansible/duan/
将原来的注释取消,把原来的hosts改为指定目录
[root@biudefor ~]# ls /etc/ansible/duan/
dbserver webserver
#将不同功能服务器放在统一文件里方便管理
1.2 动态资产
动态资产, -i 参数后面接的是一个可运行的脚本。脚本的结果为一个 Ansible 可理解的 JSON 格式字符串。
为什么要存在动态资产呢? 往往我们在使用 Ansible 管理服务器前,公司中有可能已经将服务器信息存储在了特定位置,比如 CMDB, 数据库等系统。
此时若我们再使用静态资产去管理服务器,势必会造成资产管理入口不统一的问题。
因此我们只能抛弃原先的静态资产,通过脚本从已存在的系统中获取要管理的节点,并按照特定的形式传给 Ansible。这样既解决了公司资产统一入
口, 也解决了Ansible 的服务器管理来源。
动态资产实例
{
"_meta": {
"hostvars": {
"10.3.134.3": {
"host_var": "hoge"
},
"10.3.134.4": {
"host_var": "fuga"
}
}
},
"sample-servers": {
"hosts": [
"10.3.134.3",
"10.3.134.4"
],
"vars": {
"group_var": "hogefuga"
}
}
}
1.3 资产选择器
有时操作者希望只对资产中的一部分服务器进行操作,而不是资产中列举的所有服务器。此时我们该如何选择呢?
这里我们将学习 Ansible 的资产选择器 PATTERN,通过资产选择器,我们可以灵活的选择想要操作的服务器。
格式
# ansible PATTERN -i inventory -m module -a argument // 伪代码,勿执行
选择一台或者几台服务器
# ansible 1.1.1.1 -i inventory.ini --list-hosts
# ansible test01.biudefor.com -i inventory.ini --list-hosts
# ansible 1.1.1.1,2.2.2.2 -i inventory.ini --list-hosts
选择所有服务器
# ansible '*' -i inventory.ini --list-hosts
# ansible all -i inventory.ini --list-hosts
选择一组服务器
# ansible web-servers -i inventory.ini --list-hosts
使用 * 匹配
# ansible 3.3.3.* -i inventory.ini --list-hosts
使用逻辑匹配
// web_servers 和 db_servers 的并集
# ansible 'web_servers:db_servers' -i inventory.ini --list-hosts
// web_servers 和 db_servers 的交集
# ansible 'web_servers:&db_servers' -i inventory.ini --list-hosts
// 在 web_servers 中, 但不在 db_servers 的服务器
# ansible 'web_servers:!db_servers' -i inventory.ini --list-hosts
网友评论