community.mysql.mysql_user 模块 – 向 MySQL 或 MariaDB 数据库添加或删除用户
注意
此模块是 community.mysql 集合 (版本 3.11.0) 的一部分。
如果您使用的是 ansible
包,则可能已安装此集合。它不包含在 ansible-core
中。要检查是否已安装它,请运行 ansible-galaxy collection list
。
要安装它,请使用:ansible-galaxy collection install community.mysql
。您需要其他要求才能使用此模块,请参阅 需求 以了解详情。
要在 playbook 中使用它,请指定:community.mysql.mysql_user
。
概要
向 MySQL 或 MariaDB 数据库添加或删除用户。
需求
执行此模块的主机需要以下需求。
PyMySQL (Python 2.7 和 Python 3.x)
参数
参数 |
注释 |
---|---|
将由 priv 定义的权限附加到此用户的现有权限,而不是覆盖现有权限。与 *subtract_privs* 互斥。 选项
|
|
创建、更新或删除用户的属性(任意的“键:值”注释)。 MySQL 服务器必须支持 INFORMATION_SCHEMA.USER_ATTRIBUTES 表。自 MySQL 8.0 起提供。 要删除现有属性,请将其值设置为 null。 |
|
证书颁发机构 (CA) 证书的路径。如果使用此选项,则必须指定与服务器使用的证书相同的证书。 |
|
当需要 SSL 连接时,是否验证服务器主机名。对应于 MySQL CLI 的 将其设置为 需要 pymysql >= 0.7.11。 选项
|
|
在尝试提供的凭据之前,检查 mysql 是否允许以 root/nopassword 登录。 如果成功,则将忽略传递的 *login_user*/ *login_password*。 选项
|
|
客户端公钥证书的路径。 |
|
客户端私钥的路径。 |
|
默认为 当 当 引入此功能是因为 MySQL 8 及更高版本在权限中使用区分大小写的字段名。 选项
|
|
指定从中读取用户名和密码的配置文件。 如果存在,则即使未指定 *config_file*,也会读取默认配置文件 如果存在,默认配置文件 要阻止读取默认配置文件,请将 *config_file* 设置为空字符串。 默认值: |
|
连接到 MySQL 服务器时的连接超时。 默认值: |
|
指示“password”字段是 `mysql_native_password` 哈希。 选项
|
|
将 С(mysql) 系统数据库设置为执行语句的上下文(它将用作要连接到的数据库)。如果您在 MySQL 中使用 binlog/复制过滤器,这很有用,因为默认情况下,语句无法被 binlog/复制过滤器捕获,它们需要设置数据库才能工作,否则复制可能会中断。 有关 binlog 过滤器如何工作(在主服务器上进行过滤)的说明,请参阅 https://dev.mysqlserver.cn/doc/refman/8.0/en/replication-options-binary-log.html#option_mysqld_binlog-ignore-db。 有关复制过滤器如何工作(在副本上进行过滤)的说明,请参阅 https://dev.mysqlserver.cn/doc/refman/8.0/en/replication-options-replica.html#option_mysqld_replicate-ignore-db。 选项
|
|
MySQL 用户名的“主机”部分。 默认值: |
|
覆盖 host 选项,使 ansible 将更改应用于给定用户的全部主机名。 创建用户时不能使用此选项。 选项
|
|
运行数据库的主机。 在某些情况下,对于本地连接,需要使用 *login_unix_socket=/path/to/mysqld/socket*(通常为 默认值: |
|
用于身份验证的密码。 |
|
MySQL 服务器的端口。如果使用 login_port,则需要将 *login_host* 定义为 localhost 以外的值。 默认值: |
|
本地连接的 Unix 域套接字的路径。 使用此参数可避免 |
|
用于身份验证的用户名。 |
|
要添加或删除的用户(角色)名称。 |
|
设置用户的密码。仅适用于 |
|
选项
|
|
password 将过期的天数。需要password_expire=interval。 |
|
用户的身份验证插件(``CREATE USER user IDENTIFIED WITH plugin``)。 |
|
用户的插件 auth_string(``CREATE USER user IDENTIFIED WITH plugin BY plugin_auth_string``)。 如果plugin为``pam``(MariaDB)或``auth_pam``(MySQL),则可以使用可选的plugin_auth_string来选择特定的PAM服务。 你需要定义一个salt,才能在使用``caching_sha2_password``和``sha256_password``插件更改密码时具有幂等性。 |
|
用户的插件哈希字符串(``CREATE USER user IDENTIFIED WITH plugin AS plugin_hash_string``)。 |
|
MySQL 权限字符串,格式为: 此外,表和权限之间不能有空格,因为这将产生非幂等的检查模式。 可以使用正斜杠分隔多个权限: 此格式基于 MySQL 数据库和表名可以使用 MySQL 风格的引号。 如果使用列权限,则 可以作为字典传递(参见示例)。 支持针对过程和函数的 GRANT(参见示例)。 注意:如果将相同的 |
|
限制用户对某些服务器资源的使用。自 MySQL 5.6 / MariaDB 10.2 起提供。 可用选项为 在state=present时使用,否则忽略。 |
|
用于从plugin_auth_string生成密码哈希的盐。 盐长度必须为 20 个字符。 盐仅支持``caching_sha2_password``或``sha256_password``身份验证plugin。 |
|
以 不能用于设置全局变量,请改用community.mysql.mysql_variables模块。 |
|
是否应为连接启用或禁用二进制日志记录。 选项
|
|
用户是否应该存在。 当 选项
|
|
撤销由priv选项定义的权限,并保留其他现有权限。如果设置了此选项,则忽略priv中的无效权限。与append_privs互斥。 选项
|
|
将安全传输的要求设置为需求字典(参见示例)。 有效要求为 SSL、X509、SUBJECT、ISSUER、CIPHER。 SUBJECT、ISSUER 和 CIPHER 是互补的,并且与 SSL 和 X509 互斥。 https://mariadb.com/kb/en/securing-connections-for-client-and-server/#requiring-tls. |
|
选项
|
属性
属性 |
支持 |
描述 |
---|---|---|
支持:完全支持 |
可以在check_mode下运行,并在不修改目标的情况下返回更改状态预测。 |
备注
注意
兼容 MySQL 或 MariaDB。
MySQL 服务器安装使用默认的login_user为
root
且无密码。为了将此用户作为幂等剧本的一部分进行保护,你必须至少创建两个任务:1) 更改 root 用户的密码,不提供任何login_user/login_password详细信息;2) 删除包含新 root 凭据的~/.my.cnf
文件。随后运行剧本将通过从文件中读取新的凭据而成功。目前,只支持
mysql_native_password
加密密码哈希模块。需要在远程主机上安装 PyMySQL(Python 2.7 和 Python 3.X)包。可以使用 apt-get install python-pymysql(Ubuntu;参见ansible.builtin.apt)或 yum install python2-PyMySQL(RHEL/CentOS/Fedora;参见ansible.builtin.yum)来安装 Python 包。对于较新的 Fedora 版本,你也可以使用 dnf install python2-PyMySQL;参见ansible.builtin.dnf。
确保你在 Ansible 检测到的 Python 解释器目标机器上安装了 PyMySQL 库。例如,如果 ansible 检测到并使用 Python 3,则需要安装 Python 3 版本的 PyMySQL。如果 ansible 检测到并使用 Python 2,则需要安装 Python 2 版本的 PyMySQL。
如果遇到问题,通过指定
ansible_python_interpreter
来强制 Ansible 使用所需的 Python 解释器可能会有所帮助。有关更多信息,请参见https://docs.ansible.org.cn/ansible/latest/reference_appendices/interpreter_discovery.html。当你传递凭据时,
login_password
和login_user
都是必需的。如果没有,模块将尝试从~/.my.cnf
读取凭据,最后回退到使用 MySQL 默认登录“root”且无密码。如果本地连接出现问题,使用`login_unix_socket=/path/to/mysqld/socket`代替`login_host=localhost`可能会有所帮助。例如,10.4及更高版本的MariaDB默认安装使用unix_socket认证插件,如果不使用`login_unix_socket=/var/run/mysqld/mysqld.sock`(默认路径),则会导致错误“Host ‘127.0.0.1’ is not allowed to connect to this MariaDB server”。
如果不需要配置文件(例如,
/root/.my.cnf
)中的凭据来连接数据库服务器,但该文件存在且在任何其他有效指令之前不包含[client]
部分,则会读取该文件,这将导致连接失败。为防止这种情况,将其设置为一个空字符串(例如config_file: ''
)。为避免
Please explicitly state intended protocol
错误,请使用`login_unix_socket`参数,例如login_unix_socket: /run/mysqld/mysqld.sock
。或者,为了避免在每次调用时都使用`login_unix_socket`参数,你可以在目标主机上的MySQL配置文件(通常为
~/.my.cnf
)中使用`socket`选项指定套接字路径,例如socket=/var/lib/mysql/mysql.sock
。
参见
另见
- community.mysql.mysql_info
收集关于MySQL或MariaDB服务器的信息。
- MySQL访问控制和账户管理参考
MySQL访问控制和账户管理文档的完整参考。
- MySQL提供的权限参考
MySQL提供的权限文档的完整参考。
示例
# If you encounter the "Please explicitly state intended protocol" error,
# use the login_unix_socket argument
- name: Removes anonymous user account for localhost
community.mysql.mysql_user:
name: ''
host: localhost
state: absent
login_unix_socket: /run/mysqld/mysqld.sock
- name: Removes all anonymous user accounts
community.mysql.mysql_user:
name: ''
host_all: true
state: absent
- name: Create database user with name 'bob' and password '12345' with all database privileges
community.mysql.mysql_user:
name: bob
password: 12345
priv: '*.*:ALL'
state: present
- name: Create database user using hashed password with all database privileges
community.mysql.mysql_user:
name: bob
password: '*EE0D72C1085C46C5278932678FBE2C6A782821B4'
encrypted: true
priv: '*.*:ALL'
state: present
# Set session var wsrep_on=off before creating the user
- name: Create database user with password and all database privileges and 'WITH GRANT OPTION'
community.mysql.mysql_user:
name: bob
password: 12345
priv: '*.*:ALL,GRANT'
state: present
session_vars:
wsrep_on: off
- name: Create user with password, all database privileges and 'WITH GRANT OPTION' in db1 and db2
community.mysql.mysql_user:
state: present
name: bob
password: 12345dd
priv:
'db1.*': 'ALL,GRANT'
'db2.*': 'ALL,GRANT'
# Use 'PROCEDURE' instead of 'FUNCTION' to apply GRANTs for a MySQL procedure instead.
- name: Grant a user the right to execute a function
community.mysql.mysql_user:
name: readonly
password: 12345
priv:
FUNCTION my_db.my_function: EXECUTE
state: present
- name: Modify user attributes, creating the attribute 'foo' and removing the attribute 'bar'
community.mysql.mysql_user:
name: bob
attributes:
foo: "foo"
bar: null
- name: Modify user to require TLS connection with a valid client certificate
community.mysql.mysql_user:
name: bob
tls_requires:
x509:
state: present
- name: Modify user to require TLS connection with a specific client certificate and cipher
community.mysql.mysql_user:
name: bob
tls_requires:
subject: '/CN=alice/O=MyDom, Inc./C=US/ST=Oregon/L=Portland'
cipher: 'ECDHE-ECDSA-AES256-SHA384'
- name: Modify user to no longer require SSL
community.mysql.mysql_user:
name: bob
tls_requires:
- name: Ensure no user named 'sally'@'localhost' exists, also passing in the auth credentials
community.mysql.mysql_user:
login_user: root
login_password: 123456
name: sally
state: absent
# check_implicit_admin example
- name: >
Ensure no user named 'sally'@'localhost' exists, also passing in the auth credentials.
If mysql allows root/nopassword login, try it without the credentials first.
If it's not allowed, pass the credentials
community.mysql.mysql_user:
check_implicit_admin: true
login_user: root
login_password: 123456
name: sally
state: absent
- name: Ensure no user named 'sally' exists at all
community.mysql.mysql_user:
name: sally
host_all: true
state: absent
- name: Specify grants composed of more than one word
community.mysql.mysql_user:
name: replication
password: 12345
priv: "*.*:REPLICATION CLIENT"
state: present
- name: Revoke all privileges for user 'bob' and password '12345'
community.mysql.mysql_user:
name: bob
password: 12345
priv: "*.*:USAGE"
state: present
# Example privileges string format
# mydb.*:INSERT,UPDATE/anotherdb.*:SELECT/yetanotherdb.*:ALL
- name: Example using login_unix_socket to connect to server
community.mysql.mysql_user:
name: root
password: abc123
login_unix_socket: /var/run/mysqld/mysqld.sock
- name: Example of skipping binary logging while adding user 'bob'
community.mysql.mysql_user:
name: bob
password: 12345
priv: "*.*:USAGE"
state: present
sql_log_bin: false
- name: Create user 'bob' authenticated with plugin 'AWSAuthenticationPlugin'
community.mysql.mysql_user:
name: bob
plugin: AWSAuthenticationPlugin
plugin_hash_string: RDS
priv: '*.*:ALL'
state: present
- name: Create user 'bob' authenticated with plugin 'caching_sha2_password' and static salt
community.mysql.mysql_user:
name: bob
plugin: caching_sha2_password
plugin_auth_string: password
salt: 1234567890abcdefghij
- name: Limit bob's resources to 10 queries per hour and 5 connections per hour
community.mysql.mysql_user:
name: bob
resource_limits:
MAX_QUERIES_PER_HOUR: 10
MAX_CONNECTIONS_PER_HOUR: 5
- name: Ensure bob does not have the DELETE privilege
community.mysql.mysql_user:
name: bob
subtract_privs: true
priv:
'db1.*': DELETE
# Example .my.cnf file for setting the root password
# [client]
# user=root
# password=n<_665{vS43y