39.Ansible: 包含与导入
Ansible: 包含与导入
Ansible Playbook 中的 hosts: 字段必须引用在主机清单(Inventory)中明确定义的主机或组名
如果主机清单里面没有写ip,那么在playbook里面写的ip即使是正确的也依然不能执行
playbook引用主机清单的方式:
模式类型 | 模式示例 | 描述与解释 |
---|---|---|
指定单个主机 | node1 | 匹配清单中名为 node1 的主机。 |
node1.example.com | 匹配 FQDN (完整域名) 为 node1.example.com 的主机。 | |
192.168.122.10 | 匹配 IP 地址为 192.168.122.10 的主机。 | |
指定主机组 | net | 匹配主机组 net 中的所有主机。 |
特殊关键字 | all | 匹配所有受管主机,这是最常用的模式之一。 |
通配符匹配 | '*' | 匹配所有主机,功能同 all 。通常需要引号以防止 Shell 扩展。 |
'*.example.com' | 匹配所有以 .example.com 结尾的主机名。 | |
192.168.122.*' | 匹配 IP 地址在 192.168.122.0/24 网段的所有主机。 | |
'web*' | 匹配所有以 web 开头的主机名。 | |
集合操作 | net:webserver | 并集:匹配在 net 组 或 webserver 组中的主机。 |
net:&webserver | 交集:匹配同时在 net 组 和 webserver 组中的主机。 | |
net:!node1 | 排除:匹配在 net 组中但排除主机 node1 的所有主机。 | |
字符范围 | node[1-5] | 匹配 node1 , node2 , node3 , node4 , node5 。 |
node[a-d] | 匹配 nodea , nodeb , nodec , noded |
serial参数
Handlers 在任务中通过 notify
触发,但只在所有任务都运行完毕后一次性执行的操作(通常用于重启服务)。
-
如果 Playbook 失败:即使前面5台主机的任务通知了 handler(例如
notify: restart httpd
),这些 handler 也不会被执行。 -
这是因为 Ansible 的设计是:只有在所有主机的所有任务都成功时,才会触发 handlers,以确保状态的一致性。
-
httpd
软件包已经被安装在了前5台主机上。 -
但是,如果安装任务后有
notify: start httpd
或notify: restart httpd
,那么 httpd 服务可能没有被启动,因为 handler 没有被触发
当serial的参数为2时,会先让2台主机运行所有任务,然后再让后面2台主机运行所有任务,这样如果其中一台主机出现错误,因为前面的主机已经跑完整个流程,就不需要重新启动
---
- name: a1hosts: node1,node2,node3serial: 2tasks:- name: a2debug:msg: 123- name: a3debug:msg: 234
导入
当我们需要重复安装时,可以通过导入提前写好的剧本或者任务来减少工作量
---
- name: repohosts: node1,node2,node3tasks:- name: repo1yum_repository:name: baseosdescription: aabaseurl: http://ansible.example.com/rhel9/BaseOSenabled: yesgpgcheck: no- name: repo2yum_repository:name: appstreamdescription: aa1baseurl: http://ansible.example.com/rhel9/AppStreamenabled: yesgpgcheck: no
导入node2然后安装httpd
[student@master ansible]$ vim httpd.yml
---
- name: httpd1hosts: node2import_playbook: repo.ymltasks:- name: httpd2yum:name: httpdstate: present
写一个安装samba服务的任务
---
- name: s1yum:name: sambastate: present
导入到node3
---
- name: s3import_playbook: repo.yml
- name: s4hosts: node3tasks:- import_tasks: samba.yml
包含
用include_tasks: samba.yml可以查看包含任务的地址
---
- name: a1hosts: node2tasks:- include_tasks: samba.yml