目录
1.loop的使用
使用loop来输出 My name is zhangsan/lisi My age is 18/20
- name: zhangsan
age: 18
- name: lisi
age: 20
给定数据Services,要求使用loop来重启服务:
提示:将services定义为变量
可以使用lookup('dict', services)来进行转换或者使用{{ services | dict2items }}
services:
httpd:
name: httpd
state: restarted
firewalld:
name: firewalld
state: restarted
2.使用when,当条件成立时才执行任务
测试给定一个0/1,
给定一个未定义的变量,
给定一个变量当变量>10时才执行
使用and 和 or来连接两个条件: True and False , True or False
loop和when联合使用 1 中,当name == firewalld时不执行任务
3.notify和handler的使用
定义一个任务:使用shell模块执行 echo "123", 使用notify通知handler 任务 debug info
定义handler: 包含一个任务:debug info: 执行 输出: I handled the notify
4.tags使用
定义三个任务:分别打上标签:tag1, tag2, tag2
执行playbook, 且指定只执行tag2
5.处理任务失败
ignore_errors的使用: 定义任务使用command模块执行 test1111,
再定义一个任务:使用debug模块输出: This is test for ignore errors(确保这个任务可以正常执行)
failed_when: 定义一个任务: 使用shell模块执行echo 123, 将此任务设置为执行失败
changed_when: 定义一个任务: 使用shell模块执行echo 123 > /root/changed_test, 将此任务的changed状态改为0
block, rescue, always: 在block定义两个任务,在rescue中定义两个任务,在always中定义两个任务,去执行让rescue中的任务可以执行
[root@server .ansible]# vim fail.yml
[root@server .ansible]# ansible-playbook fail.yml
6. 构建一个jinja2模板
要求:在模板中输出1-10, 打印主机的全限定名称, 输出默认的IP地址
如果权限定名称为node1.example.com 将其输出为: node1
7.forks和serial的区别
7.1 Aniable运行play机制---forks
1)当Ansible处理playbook时,会按顺序运行每个play。确定play的主机列表之后,Ansible将按顺序运行每个任务
2)通常,所有主机必须在任何主机在play中启动下一个任务之前成功完成任务
3) 注意:
理论上,Ansible可以同时连接到play中的所有主机以执行每项任务。这非常适用于小型主机列表。但如果该play以数百台主机为目标,则可能会给控制节点带来沉重负担
4) Ansible所进行的最大同时连接数由Ansible配置文件中的forks参数控制,默认情况下设为5(forks:分叉)
通过以下方式之一来验证:[root@localhost ~]# grep forks /etc/ansible/ansible.cfg #forks = 5
5) 例如,假设Ansible控制节点配置了5个forks的默认值,并且play具有10个受管主机。
Ansible将在前5个受管主机上执行play中的第一个任务,然后在其他5个受管主机上对第一个任务执行第二轮。
在所有受管主机上执行第一个任务后,Ansible将继续一次在5受管主机的组中的所有受管主机上执行下一个任务。Ansible将依次对每个任务执行此操作,直到play结束。
6)forks的默认值设置得非常保守。如果你的控制节点正在管理Linux主机,则大多数任务将在受管主机上运行,并且控制节点的负载较少。在这种情况下,通常可以将forks的值设置得更高,可能接近100,然后性能就会提高
7)如果playbook在控制节点上运行很多代码,则应明智地提高forks限值。如果使用Ansible管理网络路由器和交换机,则大多数模块在控制节点上运行而不是在网络设备上运行。
由于这会增加控制节点上的负载,因此其支持forks数量增加的能力将显著低于仅管理Linux主机的控制节点
8)可以从命令行覆盖Ansible配置文件中forks的默认设置。ansible和ansible-playbook命令均提供-f或--forks选项以指定要使用的forks数量
7.2 serial--Ansible运行滚动机制
1)通常,当Ansible运行play时,它会确保所有受管主机在启动任何主机进行下一个任务之前已完成每个任务。在所有受管主机完成所有任务后,将运行任何通知的处理程序
2)但是,在所有主机上运行所有任务可能会导致意外行为。
例如,如果play更新负载均衡Web服务器集群,则可能需要在进行更新时让每个Web服务器停止服务。如果所有服务器都在同一个play中更新,则它们可能全部同时停止服务
3)避免此问题的一种方法是使用serial关键字,通过play批量运行主机。在下一批次启动之前,每批主机将在整个play中运行
4)演示实例:
[root@localhost project]# cat playbook.yml
---
- hosts: all
serial: 2
tasks:
- name: install httpd
yum:
name: httpd
state: present
notify:
- start httpd
handlers:
- name: start httpd
service:
name: httpd
state: started
在上面的示例中,Ansible一次在两个受管主机上执行play,直至所有受管主机都已更新
5)更新机制:
- Ansible首先在前两个受管主机上执行play中的任务。如果这两个主机中的任何一个或两个都通知了处理程序,则Ansible将根据这两个主机的需要运行处理程序。
- 在这两个受管主机上执行完play时,Ansible会在接下来的两个受管主机上重复该过程。Ansible继续以这种方式运行play,直到所有受管主机都已更新
6)假设上一示例中的webservers组包含5个Web服务器,它们位于负载均衡器后面。将serial参数设置为2后,play一次将运行两台Web服务器。因此,5台Web服务器中的大多数服务器将始终可用
- 相反,如果不使用serial关键字,将同时在5台Web服务器上执行play和生成的处理程序。这可能会导致服务中断,因为Web服务将在所有Web服务器上同时重新启动
7)重要:
在设置了serial: 2 的上一个场景中,如果出现问题并且处理的前2个主机的play失败,则playbook将中止,其余3个主机将不会通过play运行。这是一个有用的功能,因为只有一部分服务器会不可用,使服务降级而不是中断
serial关键字也可以指定为百分比。此百分比应用于play中的主机总数,以确定滚动更新批处理大小。无论百分比为何,每一工序的主机数始终为1或以上
8.导入playbook和task
建立一个import_playbook.yaml 然后将其导入另一个playbook: main_playbook.yaml
建立一个import_task.yaml里面只写任务:将其导入main_task_playbook.yaml中