roles/nginx/ # 角色名nginx├── defaults/ # 默认变量优先级最低可被外部覆盖│ └── main.yml├── vars/ # 角色内部固定变量优先级高于defaults│ └── main.yml├── tasks/ # 核心执行任务必须有main.yml入口│ └── main.yml├── handlers/ # 触发器notify触发如重启服务│ └── main.yml├── templates/ # jinja2模板文件 .j2│ └── nginx.conf.j2├── files/ # 静态文件直接复制不渲染模板│ └── index.html├── meta/ # 角色依赖、平台声明│ └── main.yml├── README.md # 角色说明文档└── tests/ # 测试用play可选└── test.yml核心目录详解tasks/main.yml必选角色执行的核心步骤安装包、创建目录、复制文件、启动服务等。defaults/main.ymlRole默认参数外部 playbook、inventory 变量可以覆盖这里的值。适合开放给使用者自定义。vars/main.yml角色内部硬编码变量优先级高于 defaults外部很难覆盖存放不希望用户修改的内部参数。handlers/main.yml仅被 notify 触发只有对应任务 changed 时才执行常用于重启、重载服务。templates/存放 jinja2 模板使用 template 模块渲染支持变量插值、循环判断。files/纯静态文件copy 模块直接推送不做变量渲染。回到顶部第一个Role实战案例可使用ansible自带的工具ansible-galaxy初始化Role工程初始化Role工程rootmaster:/data00/ansible# ansible-galaxy init roles/testRole roles/test was created successfully查看对应工程的结构rootmaster:/data00/ansible# tree rolesroles└── test├── defaults│ └── main.yml├── files├── handlers│ └── main.yml├── meta│ └── main.yml├── README.md├── tasks│ └── main.yml├── templates├── tests│ ├── inventory│ └── test.yml└── vars└── main.yml编写tasksrootmaster:/data00/ansible# cat roles/test/tasks/main.ymlname: 分发静态文件copy:src: “{{ src_file_path }}”dest: “{{ dest_file_path }}”mode: 744backup: truenotify: 静态文件分发成功tags: copy_staticname: 分发j2文件template:src: “{{ src_j2_file_path }}”dest: “{{ dest_j2_file_path }}”mode: 744backup: truenotify: j2文件分发成功tags: template_j2编写handlerrootmaster:/data00/ansible# cat roles/test/handlers/main.ymlhandlername: 静态文件分发成功debug:msg: “静态文件分发成功”name: j2文件分发成功debug:msg: “j2文件分发成功”配置变量rootmaster:/data00/ansible# cat roles/test/vars/main.ymlsrc_file_path: nginx.confdest_file_path: /tmp/nginx.confsrc_j2_file_path: mod.j2dest_j2_file_path: /tmp/mod配置静态文件nginx.confrootmaster:/data00/ansible# cat roles/test/files/nginx.confserver {listen 80;server_name www.huangsir.com;root /var/www/html;location / {index index.html;}}配置j2模版文件rootmaster:/data00/ansible# cat roles/test/templates/mod.j2“主机名:{{ ansible_hostname }}”“ip:{{ ansible_all_ipv4_addresses }}”“系统名称:{{ ansible_distribution }}”“系统总内存:{{ ansible_memtotal_mb }}”“系统可用内存:{{ ansible_memfree_mb }}”“系统内存情况:{{ ansible_memory_mb }}”“cpu总数:{{ ansible_processor_vcpus }}”编写顶层playbookrootmaster:/data00/ansible# cat roles/main.yamlname: 第一个roleshosts: es这里的test指定的是我们创建的目录名称roles:{role: test, tags: test,mysql}也可以针对对应的roles配置主机清单文件rootmaster:/data00/ansible# cat roles/hosts[web]10.37.99.6310.37.120.9[db]10.37.99.63[es]10.37.120.9整体工程结构rootmaster:/data00/ansible# tree rolesroles├── hosts├── main.yaml└── test├── defaults│ └── main.yml├── files│ └── nginx.conf├── handlers│ └── main.yml├── meta│ └── main.yml├── README.md├── tasks│ └── main.yml├── templates│ └── mod.j2├── tests│ ├── inventory│ └── test.yml└── vars└── main.yml测试运行role运行role和运行剧本没什么区别直接使用ansible-playbook命令运行即可-i指定清单文件rootmaster:/data00/ansible# ansible-playbook -i roles/hosts roles/main.yamlPLAY [第一个roles] ***********************************************************************************************************************************************************************************************TASK [Gathering Facts] *******************************************************************************************************************************************************************************************ok: [10.37.120.9]TASK [test : 分发静态文件] ***************************************************************************************************************************************************************************************changed: [10.37.120.9]TASK [test : 分发j2文件] *****************************************************************************************************************************************************************************************[WARNING]: Deprecation warnings can be disabled by settingdeprecation_warningsFalsein ansible.cfg.[DEPRECATION WARNING]: INJECT_FACTS_AS_VARS default toTrueis deprecated, top-level facts will not be auto injected after the change. This feature will be removed from ansible-core version 2.24.Origin: /data00/ansible/roles/test/templates/mod.j2Useansible_facts[fact_name](noansible_prefix) instead.changed: [10.37.120.9]RUNNING HANDLER [test : 静态文件分发成功] ************************************************************************************************************************************************************************ok: [10.37.120.9] {“msg”: “静态文件分发成功”}RUNNING HANDLER [test : j2文件分发成功] **************************************************************************************************************************************************************************ok: [10.37.120.9] {“msg”: “j2文件分发成功”}PLAY RECAP *******************************************************************************************************************************************************************************************************10.37.120.9 : ok5 changed2 unreachable0 failed0 skipped0 rescued0 ignored0