如何在Ansible Playbook中根据主机名设置目录所有者
优化后的Ansible Playbook:按主机名动态设置目录所有者
需求说明
在多台RHEL 8服务器上创建目录/usr/dir/newdir,要求:
- 权限模式统一设为
0755 - 所属组固定为
chosengroup - 所属用户根据主机名动态匹配:
- 主机名格式为
hostnameABCdb时,所有者为ABCadm - 主机名格式为
hostnameDEFdb时,所有者为DEFadm
- 主机名格式为
原方案分两个Playbook执行(先创建目录、再逐个修改所有者),流程繁琐,以下是合并后的优化方案。
优化后的Playbook代码
- hosts: all become: yes become_method: sudo gather_facts: yes # 开启以获取主机名变量 tasks: - name: 创建目录并配置所有者、组和权限 file: path: /usr/dir/newdir state: directory recurse: yes owner: "{{ inventory_hostname | regex_replace('^hostname(.*)db$', '\\1adm') }}" group: chosengroup mode: 0755
关键逻辑说明
- 获取主机名:开启
gather_facts: yes后,Ansible会自动收集目标主机的inventory_hostname变量(即主机清单中配置的主机名) - 动态生成所有者:使用
regex_replace过滤器处理主机名:- 正则
^hostname(.*)db$匹配hostnameXXdb格式的主机名,捕获中间的XX标识 - 替换为
\\1adm,将捕获的标识拼接成目标所有者(如ABC→ABCadm)
- 正则
- 一步完成所有配置:通过
file模块一次性完成目录创建、权限设置、所有者和组配置,无需拆分多个Playbook或调用系统chown命令,符合Ansible声明式配置的最佳实践
验证与测试
- 预览执行结果(不实际修改服务器):
ansible-playbook -i inventory.ini your_playbook.yml --check - 针对单台主机测试:
ansible-playbook -i inventory.ini your_playbook.yml --limit hostnameABCdb
内容的提问来源于stack exchange,提问作者lnmeyid
相关产品推荐
相关产品推荐

