ansible的role角色
一、role角色概念
Role 本质是按固定目录规范组织 Ansible 任务、变量、文件、模板等资源的集合。Ansible 会自动识别这些目录并加载对应内容,无需手动指定路径。
(简单理解就是role角色的概念就是
将原本糅合在一个yaml文件里的模块任务分别拆分归类到各自的目录当中)
1.1 role角色标准目录结构
roles/ # 所有角色的根目录(可自定义,建议默认)├── 第一个角色名/ # 单个角色的目录(比如nginx、mysql)│ ├── defaults/ # 【默认变量】优先级最低,可被用户覆盖│ │ └── main.yml # 变量定义文件(必须命名为main.yml)│ ├── files/ # 【静态文件】无需模板渲染的文件(如二进制包、静态配置)│ ├── handlers/ # 【处理器】触发式任务(如重启服务、重载配置)│ │ └── main.yml│ ├── meta/ # 【元数据】角色依赖、作者、版本等信息│ │ └── main.yml│ ├── tasks/ # 【核心任务】角色要执行的具体操作(必须有main.yml)│ │ └── main.yml│ ├── templates/ # 【Jinja2模板】需要变量渲染的配置文件(如nginx.conf.j2)│ ├── tests/ # 【测试用例】角色的测试脚本(可选)│ │ ├── inventory # 测试用清单│ │ └── test.yml # 测试用Playbook│ └── vars/ # 【自定义变量】优先级高,一般为角色内部固定变量│ └── main.yml├── 第二个角色名/ # 角色的目录(比如nginx、mysql)│ ├── defaults/ # 【默认变量】优先级最低,可被用户覆盖│ │ └── main.yml # 变量定义文件(必须命名为main.yml)│ ├── files/ # 【静态文件】无需模板渲染的文件(如二进制包、静态配置)│ ├── handlers/ # 【处理器】触发式任务(如重启服务、重载配置)│ │ └── main.yml│ ├── meta/ # 【元数据】角色依赖、作者、版本等信息│ │ └── main.yml│ ├── tasks/ # 【核心任务】角色要执行的具体操作(必须有main.yml)│ │ └── main.yml│ ├── templates/ # 【Jinja2模板】需要变量渲染的配置文件(如nginx.conf.j2)│ ├── tests/ # 【测试用例】角色的测试脚本(可选)│ │ ├── inventory # 测试用清单│ │ └── test.yml # 测试用Playbook│ └── vars/ # 【自定义变量】优先级高,一般为角色内部固定变量│ └── main.ymlrole文件夹下可以有多个角色,playbook通过role参数调用不同的角色
1.1.1 快捷创建标准目录
用ansible-galaxy init命令自动生成标准化目录(避免手动建目录出错):
# 创建nginx角色,指定存放路径为/etc/ansible/roles/nginxansible-galaxy init /etc/ansible/roles/nginx1.1.2 目录优先级
vars/main.yml > defaults/main.yml:vars 里的变量优先级更高,一般用于角色内部固定值;defaults 用于可被用户覆盖的默认值。
角色内变量 小于 Playbook 中定义的变量 小于 命令行-e传递的变量:用户可灵活覆盖角色默认配置。
1.2 编写role核心文件
1.2.1 defaults/main.yml(默认变量,可被覆盖)
定义 Nginx 的默认端口、文档根目录等可配置项:
nginx_port: 80 # 默认监听80端口nginx_docroot: /usr/share/nginx/html # 默认文档根目录nginx_conf_path: /etc/nginx/nginx.conf # 配置文件路径1.2.2 vars/main.yml(角色内部固定变量)
定义无需用户修改的固定值(如包名、服务名):
nginx_package: nginx # Nginx包名nginx_service: nginx # Nginx服务名1.2.3 tasks/main.yml(核心执行任务)
编写安装、配置、启动 Nginx 的具体步骤:
# 1. 安装Nginx(CentOS用yum,Ubuntu可换apt)- name: 安装Nginx软件包 yum: name: "{{ nginx_package }}" # 变量放在vars/main.yml state: present # 确保包存在 become: yes # 提权执行
# 2. 渲染并拷贝Nginx配置模板- name: 拷贝Nginx配置模板 template: src: nginx.conf.j2 # 模板文件(放在templates目录) dest: "{{ nginx_conf_path }}" # 目标路径 mode: 0644 # 文件权限 become: yes notify: 重启Nginx # 配置变更时触发处理器
# 3. 创建文档根目录- name: 创建Nginx文档根目录 file: path: "{{ nginx_docroot }}" state: directory # 确保目录存在 mode: 0755 become: yes
# 4. 启动并启用Nginx服务- name: 启动并设置Nginx开机自启 service: name: "{{ nginx_service }}" state: started # 启动服务 enabled: yes # 开机自启 become: yes1.2.4 handlers/main.yml(处理器:触发重启)
配置变更后重启 Nginx,仅在任务触发时执行:
- name: 重启Nginx service: name: "{{ nginx_service }}" state: restarted become: yes1.2.5 templates/nginx.conf.j2(Jinja2 配置模板)
编写带变量的 Nginx 配置模板(简化版):
worker_processes auto;error_log /var/log/nginx/error.log;pid /run/nginx.pid;
events { worker_connections 1024;}
http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65;
server { listen {{ nginx_port }} default_server; # 渲染默认端口变量 listen [::]:{{ nginx_port }} default_server; root {{ nginx_docroot }}; # 渲染文档根目录变量 index index.html index.htm; server_name _;
location / { try_files $uri $uri/ =404; } }}1.3 编写 Playbook 调用 Role
- 创建
site.yml文件,指定目标主机并调用 nginx 角色:
# site.yml,名字无固定,任意即可,只是用于调用role角色的一个yml文件# 调用的site.yml文件与roles目录之间也无层级要求,但一般是放于同级目录下# 若site.yml与role目录之间完全独立,那么可以在ansib.cfg指定查找role目录(多个路径,冒号分割)# 或在调用时指定role目录的绝对路径- hosts: webservers # 目标主机组(需在inventory中定义) become: yes # 全局提权 roles: - role: nginx # 调用roles/nginx角色 # 可选:覆盖默认变量(比如把端口改成8080) nginx_port: 8080 when: ansible_os_family == "RedHat" # 仅RedHat系(CentOS)执行,(可选操作)- 执行Playbook
# -i 指定inventory清单文件,--ask-become-pass 提权密码(可选)ansible-playbook -i inventory site.yml --ask-become-pass1.4 将playbook拆解成为role角色案例
使用案例:此为安装rsync的一个playbook文件
- hosts: test vars: user_id: '666' rsync_user: 'www' tasks: # 1.创建www用户和组 - name: 01_create_group group: name: "{{ rsync_user }}" gid: "{{ user_id }}"
# 2.创建www用户 - name: 02_create_user user: name: "{{ rsync_user }}" gid: "{{ user_id }}" group: "{{ rsync_user}}" create_home: no shell: /sbin/nologin
# 3.创建数据目录且授权 - name: 03_createUdata file: path: "{{ item }}" state: direcotry owner: "{{ rsync_user }}" group: "{{ rsync_user}}" mode: "755" loop: - /data - /backup # 4.安装rsync软件 - name: 04_install_rsync yum: name: rsync state: latest # 5.复制配置文件与密码文件 - name: 05_copy_config copy: src: "{{ item.src }}" dest: /etc/ mode: "{{ item.mode }}" notify: - restart_rsyncd loop: - { src:/script/rsyncd.conf,mode:'644'} - { src:/script/rsync.passwd,mode:'600'}
# 6.启动服务 - name: 06_start_rsync systemd: name: rsyncd state: started enabled: yes # 7.重启服务 handlers: - name: restart_rsyncd systemd: name: rsyncd state: restarted1.4.1 创建标准目录
# 创建install_rsync角色,指定存放路径为./roles/install_rsyncansible-galaxy init ./roles/install_rsync
# 展示目录结构[root@mater-22 ~/ansible_role]#tree.└── roles └── install_rsync ├── defaults │ └── main.yml ├── files ├── handlers │ └── main.yml ├── meta │ └── main.yml ├── README.md ├── tasks │ └── main.yml ├── templates ├── tests │ ├── inventory │ └── test.yml └── vars └── main.yml1.4.2 拆分tasks部分
最先拆分tasks部分,然后根据task里面所需的配置再进行创建
# 这是原playbook的tasks部分 tasks: # 1.创建www用户和组 - name: 01_create_group group: name: "{{ rsync_user }}" gid: "{{ user_id }}"
# 2.创建www用户 - name: 02_create_user user: name: "{{ rsync_user }}" gid: "{{ user_id }}" group: "{{ rsync_user}}" create_home: no shell: /sbin/nologin
# 3.创建数据目录且授权 - name: 03_createUdata file: path: "{{ item }}" state: direcotry owner: "{{ rsync_user }}" group: "{{ rsync_user}}" mode: "755" loop: - /data - /backup # 4.安装rsync软件 - name: 04_install_rsync yum: name: rsync state: latest # 5.复制配置文件与密码文件 - name: 05_copy_config copy: src: "{{ item.src }}" dest: /etc/ mode: "{{ item.mode }}" notify: - restart_rsyncd loop: - { src:/script/rsyncd.conf,mode:'644'} - { src:/script/rsync.passwd,mode:'600'}
# 6.启动服务 - name: 06_start_rsync systemd: name: rsyncd state: started enabled: yes将其编辑到tasks的main.yml文件里
vim ./roles/install_rsync/tasks/main.yml# 查看内容[root@mater-22 ~/ansible_role]#cat ./roles/install_rsync/tasks/main.yml---# tasks file for ./roles/install_rsync- name: 1.创建www用户组 group: name: "{{rsync_user}}" gid: "{{user_id}}"
- name: 2.创建www用户 user: name: "{{rsync_user}}" uid: "{{user_id}}" group: "{{rsync_user}}" create_home: no shell: /sbin/nologin
- name: 3.创建数据目录并配置权限 file: path: "{{item}}" state: directory owner: "{{rsync_user}}" group: "{{rsync_user}}" mode: 755 loop: - /data - /backup
- name: 4.安装rsync软件 yum: name: rsync state: latest
- name: 5.复制配置文件和密码文件 copy: src: "{{item.src}}" dest: /etc/ mode: "{{item.mode}}" notify: - restart_rsyncd loop: - {src:rsyncd.conf,mode:'644'} - {src:rsync.passwd,mode:'600'}
- name: 6.启动服务 systemd: name: rsyncd state: started enabled: yes原playbook的tasks拆分后基本没什么变化,只有在调用配置文件和密码文件时的路径进行修改
1.4.3 拆分var变量部分
在task中使用了变量,因此需要编辑var目录下的文件
# 原playbook里面的var变量如下vars: user_id: '666' rsync_user: 'www'将其编辑到vars目录下的main.yml下
vim ./roles/install_rsync/vars/main.yml
# 查看内容[root@mater-22 ~/ansible_role]#cat ./roles/install_rsync/vars/main.yml---# vars file for ./roles/install_rsyncuser_id: '666'rsync_user: 'www'1.4.4 拆分files部分
在task任务中使用了文件,那么就需要将所需要的文件放入到files目录下
cd ./roles/install_rsync/files/# 创建配置文件vim rsyncd.conf#粘贴如下内容uid = wwwgid = wwwport = 873fake super = yesuse chroot = nomax connection = 200timeout = 600pid file = /var/run/rsyncd.pidlock file = /var/run/rsync.locklog file = /var/log/rsyncd.logignore errorsread only = falselist = yesauth users = myusersecrets file = /etc/rsync.passwd
[backup]comment = backup_dirpath = /backup
[data]comment =date_dirpath = /data# 保存退出
# 创建密码文件vim rsync.passwd# 粘贴如下文件myuser:123456# 保存退出1.4.5 拆分handlers部分
在原playbook中使用了handlers触发式任务,并且通过notify触发
# 原playbook的handlers部分: handlers: - name: restart_rsyncd systemd: name: rsyncd state: restarted将其编辑到handlers目录下的main.yml下
vim ./roles/install_rsync/handlers/main.yml# 查看内容[root@mater-22 ~/ansible_role]#cat ./roles/install_rsync/handlers/main.yml---# handlers file for ./roles/install_rsync- name: restart_rsyncd systemd: name: rsyncd state: restarted至此,原playbook所需的任务、文件、变量等都已拆分到各个目录下,最后只需创建一个playbook调用该role角色即可
1.4.6 创建调用role角色的playbook
这里直接在与roles目录同级下创建playbook,但调用的playbook的位置并没有要求
[root@mater-22 ~/ansible_role]#touch install_rsync.yml[root@mater-22 ~/ansible_role]#tree -L 1.├── install_rsync.yml└── roles
1 directory, 1 file#================================# 编辑文件vim install_rsync.yml# 查看内容[root@mater-22 ~/ansible_role]#cat install_rsync.yml- hosts: test roles: - install_rsync1.4.6.1 执行这个playbook
# 测试是否有错误ansible-playbook -C install_rsync.yml
# 真实使用ansible-playbook install_rsync.yml# 成功执行[root@mater-22 ~/ansible_role]#ansible-playbook install_rsync.yml
PLAY [test] **************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************ok: [10.1.1.32]ok: [10.1.1.31]
TASK [install_rsync : 创建www用户组] ******************************************************************************************************changed: [10.1.1.31]changed: [10.1.1.32]
TASK [install_rsync : 创建www用户] *******************************************************************************************************changed: [10.1.1.31]changed: [10.1.1.32]
TASK [install_rsync : 创建数据目录并配置权限] ***************************************************************************************************changed: [10.1.1.32] => (item=/data)changed: [10.1.1.31] => (item=/data)changed: [10.1.1.31] => (item=/backup)changed: [10.1.1.32] => (item=/backup)
TASK [install_rsync : 安装rsync软件] *****************************************************************************************************changed: [10.1.1.32]changed: [10.1.1.31]
TASK [install_rsync : 复制配置文件和密码文件] ***************************************************************************************************changed: [10.1.1.32] => (item={u'src': u'rsyncd.conf', u'mode': u'644'})changed: [10.1.1.31] => (item={u'src': u'rsyncd.conf', u'mode': u'644'})changed: [10.1.1.32] => (item={u'src': u'rsync.passwd', u'mode': u'600'})changed: [10.1.1.31] => (item={u'src': u'rsync.passwd', u'mode': u'600'})
TASK [install_rsync : 启动服务] **********************************************************************************************************changed: [10.1.1.32]changed: [10.1.1.31]
RUNNING HANDLER [install_rsync : restart_rsyncd] *************************************************************************************changed: [10.1.1.32]changed: [10.1.1.31]
PLAY RECAP ***************************************************************************************************************************10.1.1.31 : ok=8 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=010.1.1.32 : ok=8 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
赣公网安备36072602000131号