Ansible是一个IT自动化工具。它能配置系统、部署软件、编排更复杂的IT任务,如连续部署或零停机时间滚动更新。Ansible用Python编写,尽管市面上已经有很多可供选择的配置管理解决方案(例如Sa1t、Puppet、Chef等),但它们各有优劣,而Ansible的特点在于它的简洁(只需要安装服务端)。让Ansib1e在主流的配置管理系统中与众不同的一点便是,它并不需要你在想要配置的每个节点上安装自己的组件。同时提供的另一个优点,如果需要的话,你可以在不止一个地方控制你的整个基础架构。
实现了批量系统配置、批量程序部署、批量运行命令等功能。 ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括: (1) 连接插件connection plugins:负责和被监控端实现通信; (2) host inventory:指定操作的主机,是一个配置文件里面定义监控的主机; (3) 各种模块核心模块、command模块、自定义模块; (4) 借助于插件完成记录日志邮件等功能;playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
主配置文件说明:主配置文件ansible.cfg(主配置文件的内容可以参考/etc/ansible/ansible.cfg) ansible配置文件查找顺序 1.首先检测ANSIBLE_CONFIG变量定义的配置文件(默认没有这个变量) 2.其次检查当前目录下的./ansible.cfg文件 3.再次检查当前用户家目录下~/ansible.cfg文件 4.最后检查/etc/ansible/ansible.cfg文件
1)修改主配置文件 1. [root@control ~]# mkdir ~/ansible 2. [root@control ~]# vim ~/ansible/ansible.cfg 3. [defaults] 4. inventory = ~/ansible/inventory 5. #主机清单配置文件(inventory可以是任意文件名),英语词汇:inventory(清单、财产清单) 6. #forks = 5 #ssh并发数量 7. #ask_pass = True #使用密钥还是密码远程,True代表使用密码 8. #host_key_checking = False #是否校验密钥(第一次ssh时是否提示yes/no) 2) 修改主机清单文件(清单文件名必须与主配置文件inventory定义的一致) 1. [root@control ~]# vim ~/ansible/inventory 2. [test] #定义主机组(组名称任意) 3. node1 #定义组中的具体主机,组中包括一台主机node1 4. [proxy] #定义主机组(组名称任意),英语词汇:proxy(代理人,委托人) 5. node2 #proxy组中包括一台主机node2 6. [webserver] 7. node[3:4] #这里的node[3:4]等同于node3和node4 8. [database] 9. node5 10. [cluster:children] #嵌套组(children为关键字),不需要也可以不创建嵌套组 11. webserver #嵌套组可以在组中包含其他组 12. database
1、在ANSIBLE管理体系中,存在“管理节点”和“被管理节点”两种角色。 2、被管理节点通常被称为“资产” 3、在管理节点上,Ansible将AdHoc或PlayBook 转换为Python脚本。并通过SSH将这些Python 脚本传递到被管理服务器上。
特定的模块Module支持特定的功能
管理节点(ansible)追踪创建密钥对
[root@localhost ~]# ssh-keygen -t rsa将本地的公钥传输到被管理节点 (每个被管理节点都需要传递) (需要被管理节点的用户名和密码)
[root@localhost ~]# ssh-copy-id root@192.168.1.134 [root@localhost ~]# ssh root@192.168.1.134
[WARNING]: Unable to parse /root/192.168.1.134 as an inventory source [WARNING]: No inventory was parsed, only implicit localhost is available [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match ‘all’
注意 -i 参数后面排的是一个列表(List),因此当为一个被管理节点时,我们后面一定要加一个英文逗号(,)告知是List
ansible all -i 192.168.1.134, -m ping在/etc/hosts 添加:192.168.1.134 client 通过主机名:需要在/etc/ansible/hosts 中Ex 1那块添加client
在管理节点上,确保文件/tmp/a.conf 发布到所有被管理节点
touch /tmp/a.conf ansible all -i 192.168.1.134, -m copy -a "src=/tmp/a.conf dest=/tmp/" all 在ansible中,将其叫做pattern,即匹配。我通常称它为资产选择器。就是匹配资产(-i参数指定)中的一部分。这里的all是匹配所有指定的所有资产。将在下面资产部分详细阐述。 -i指定Ansible的资产,也就是被管理服务器。 -m指定要运行的模块,比如这里的ping模块和copy模块 -a 指定模块的参数,这里模块ping 没有指定参数。模块copy指定了src和dest参数。在client端被管理节点查看
总结一句话:ansible就是用什么模块,让谁去干什么事情。在快速入门的场景中,我们一共管理了两台服务器。但是在实际场景中,我们要管理的服务器往往要多得多。难道依然要在Ansible的-i参数后面一个个追加IP指定吗?这显然不合乎常理。 因此这一节我们主要去介绍一下Ansible的资产。 Ansible的资产分为静态资产和动态资产,动态资产会在后面的高级部分详细阐释。
顾名思义它本身是一个文本文件,一个格式类似INI的文件。默认情况下,Ansible的资产文件位于 /etc/ansible/hosts。 我们这里给出一个自定义的静态资产实例,然后再具体解释其含义。
cat inventory 1.1.1.1 2.2.2.2 3.3.3.[1:15] # 表示3.3.3.1 ~ 3.3.3.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// 以上指令,若能列举出我们在资产中定义的服务器,那么你的自定义资产也就生效了。 如下图,列出所有资产
动态资产, -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" } } }有时操作者希望只对资产中的一部分服务器进行操作,而不是资产中列举的所有服务器
基本语法格式:
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 db_servers -i inventory.ini --list-hosts # ansible all_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