主机模式选择主机
引用清单主机
- 主机模式用于指定要作为play或临时命令的目标的主机
- 最简单的形式中,清单中受管主机或主机组的名称就是指定该主机或主机组的主机模式
受管主机
- 最基本的主机模式是单一受管主机名称列在清单中
- 如果清单中明确列出了IP地址,而不是主机名,则可以将其用作主机模式
- 如果IP地址未列在清单中,我们就无法用它来指定主机,即使该IP地址会在DNS中解析到这个主机名
**注意:**在清单中通过IP地址引用受管主机存在一个问题,那就是难以记住play或临时命令所针对的主机使用了哪个IP地址。但是,如果没有可解析的主机名,我们可能必须按IP地址指定主机以进行连接
使用组指定主机
- 当组名称用作主机模式时,它指定Ansible将对属于该组的成员的主机执行操作。
---
- hosts: lab //lab为一个主机组的名字
- 特别组all,它匹配清单中的所有受管主机
---
- hosts: all //执行时匹配所有主机
- 特别组ungrouped,它包括清单中不属于任何其他组的所有受管主机:
---
- hosts: ungrouped
使用通配符匹配多个主机
- 匹配所有主机除了all以外,还可以使用 * ,但是使用时必须用 ‘*’
---
- hosts: '*'
- 如果在Ansible Playbook中使用了任何特殊通配符或列表字符,必须将主机模式放在单引号里,确保能够正确解析主机模式
---
- hosts: '!test1.example.com,development'
- 也可使用*字符匹配包含特定子字符串的受管主机或组,以下通配符主机模式匹配以.example.com结尾的所有清单名称:
---
- hosts: '*.example.com'
- 以下示例使用通配符主机模式来匹配开头为192.168.2.的主机或主机组的名称:
---
- hosts: '192.168.2.*'
列表
-
可以通过逻辑列表来引用清单中的多个条目
-
主机模式的逗号分隔列表匹配符合任何这些主机模式的所有主机
-
如果提供受管主机的逗号分隔列表,则所有这些受管主机都将是目标:
---
- hosts: labhost1.example.com,test2.example.com,192.168.2.2
- 如果提供组的逗号分隔列表,则属于任何这些组的所有主机都将是目标:
---
- hosts: lab,datacenter1
- 也可以混合使用受管主机、主机组和通配符,如下所示:
---
- hosts: 'lab,data*,192.168.2.2'
- 如果列表中的某一项以与符号(&)开头,则主机必须与该项匹配才能匹配主机模式。它的工作方式类似于逻辑AND。
例如,根据我们的示例清单,以下主机模式将匹配lab组中同时也属于datacenter1组的计算机:
---
- hosts: lab,&datacenter1
- 通过在主机模式的前面使用感叹号(!)表示从列表中排除匹配某一模式的主机。它的工作方式类似于逻辑NOT。
根据示例清单,以下示例匹配datacenter组中定义的所有主机,但test2.example.com除外:
---
- hosts: datacenter,!test2.example.com
//也可以使用以下方式
---
- hosts: '!test2.example.com,datacenter'
- 演示了使用匹配测试清单中的所有主机的主机模式,datacenter1组中的受管主机除外
---
- hosts: all,!datacenter1
- 总结:
- 能够精确写精确
- 所有主机使用all或者’*’
- 针对某一个组里面的所有主机就写组
- 如果是多个组就用,把组名隔开
- 如果是某个组里面的某一台不要那就先写组名,再写逗号,再写!加上主机的名字
配置并行
使用分叉在ansible中配置并行
- 当Ansible处理playbook时,会按顺序运行每个play
- 确定play的主机列表之后,Ansible将按顺序运行每个任务
- 理论上,Ansible可以同时连接到play中的所有主机以执行每项任务
- Ansible所进行的最大同时连接数由Ansible配置文件中的forks参数控制,默认情况下设为5
- 假设Ansible控制节点配置了5个forks的默认值,并且play具有10个受管主机。Ansible将在前5个受管主机上执行play中的第一个任务,然后在其他5个受管主机上对第一个任务执行第二轮
- 在所有受管主机上执行第一个任务后,Ansible将继续一次在5受管主机的组中的所有受管主机上执行下一个任务。Ansible将依次对每个任务执行此操作,直到play结束。
- forks的默认值设置得非常保守
- 如果你的控制节点正在管理Linux主机,则大多数任务将在受管主机上运行,并且控制节点的负载较少,这时可以设置偏大
- 如果playbook在控制节点上运行很多代码,则应明智地提高forks限值
管理滚动更新
- Ansible运行play时,它会确保所有受管主机在启动任何主机进行下一个任务之前已完成每个任务
- 在所有受管主机完成所有任务后,将运行任何通知的处理程序
- 但是,在所有主机上运行所有任务可能会导致意外行为
- 例如,如果play更新负载均衡Web服务器集群,则可能需要在进行更新时让每个Web服务器停止服务。如果所有服务器都在同一个play中更新,则它们可能全部同时停止服务。
- 避免此问题的一种方法是使用serial关键字,通过play批量运行主机。在下一批次启动之前,每批主机将在整个play中运行。
注意:
- 出于某些目的,每批主机算作在主机子集上运行的完整play。这意味着,如果整个批处理失败,play就会失败,这将导致整个playbook运行失败。
- 在设置了serial: 2的上一个场景中,如果出现问题并且处理的前2个主机的play失败,则playbook将中止,其余3个主机将不会通过play运行。这是一个有用的功能,因为只有一部分服务器会不可用,使服务降级而不是中断
//举例解释
加入forks为默认值,serial为2,总共有有10台受管主机,需要运行多少次
结果:需要运行6次,因为serial为2,forks为2,第一批一二运行一次,第二次三四运行一次,第五台运行一次,然后第二批一二运行一次,三四运行一次,五运行一次,一共是六次
- 在设置了serial: 2的上一个场景中,如果出现问题并且处理的前2个主机的play失败,则playbook将中止,其余3个主机将不会通过play运行。这是一个有用的功能,因为只有一部分服务器会不可用,使服务降级而不是中断