如何重构Ansible MySQL角色代码,实现类似参数化类的可复用能力
Ansible 代码重构方案
Ansible 中对应 Puppet 参数化类的复用能力可以通过参数化任务引用 + 结构化变量合并实现,完全可以消除现有冗余代码,具体实现如下:
第一步:合并结构化变量,消除变量文件冗余
删掉原有的 mysql_user_privileges.yml,将用户、权限配置合并到 vars/main/mysql_users.yml 中,统一用结构化列表存储所有用户配置:
--- # 公共登录配置 mysql_login_port: 3306 mysql_login_user: root mysql_login_pwd: your_mysql_root_password # 统一用户配置列表,新增用户直接在下方添加即可 mysql_users: # 只读用户 - name: user1 host: "%" password: "secret" priv: "*.*:SELECT" state: present # 管理员用户 - name: user2 host: "%" password: "secret" priv: "*.*:ALL" state: present
第二步:抽离可复用任务单元,消除任务逻辑冗余
在 tasks 目录下新建可复用的用户创建任务文件 create_user.yml,相当于 Puppet 的参数化类,接收传入的用户参数执行创建逻辑:
--- - name: "Create MySQL user {{ mysql_user.name }}" community.mysql.mysql_user: login_port: "{{ mysql_login_port }}" login_user: "{{ mysql_login_user }}" login_password: "{{ mysql_login_pwd }}" host: "{{ mysql_user.host }}" name: "{{ mysql_user.name }}" password: "{{ mysql_user.password }}" priv: "{{ mysql_user.priv }}" state: "{{ mysql_user.state | default('present') }}"
修改原有 tasks/main.yml,仅保留循环调用复用任务的逻辑,代码量大幅缩减:
--- - name: Batch create all MySQL users include_tasks: create_user.yml loop: "{{ mysql_users }}" loop_control: loop_var: mysql_user
进阶优化(可选)
如果需要按角色批量设置权限,避免每个用户重复写权限配置,可以新增角色权限映射,进一步简化变量:
# 新增角色-权限映射 mysql_user_role_privs: ro: "*.*:SELECT" admin: "*.*:ALL" mysql_users: - name: user1 host: "%" password: "secret" role: ro - name: user2 host: "%" password: "secret" role: admin
对应修改 create_user.yml 中的 priv 字段即可自动匹配角色权限:
priv: "{{ mysql_user.priv | default(mysql_user_role_privs[mysql_user.role]) }}"
内容的提问来源于stack exchange,提问作者user465465
相关产品推荐
相关产品推荐

