Ansible mysql_user 私有 - "invalid privileges string: Invalid privileges specified"
Ansible mysql_user priv - "invalid privileges string: Invalid privileges specified"
我正在使用 mysql_user
模块尝试添加用户和权限。我在以下任务中遇到 "invalid privileges string" 错误。
- name: Add api user
mysql_user:
name="user_name"
host="{{ item }}"
password={{ mysql_password }}
priv={{ mysql_project_database }}.console_users:"SELECT (col_one, col_two)"
with_items:
- "%"
tags:
- mysql-user
我是 运行 命令行中的任务,如下所示:
ansible-playbook playbook.yml -i inventory/develop -vv --tags=mysql-user
这会导致以下错误:
failed: [192.168.37.100] => (item=%) => {"failed": true, "item": "%"}
msg: invalid privileges string: Invalid privileges specified: frozenset(['SELECT (COL_ONE', ' COL_TWO)'])
我不是 100% 确定,但我认为这个问题与权限中的 space 有关。我似乎无法逃避它或用引号解决它(我已经看到建议的几个地方)。
我试过:
- 仅授予
SELECT
- 有效
- 在整个特权周围加上引号 - 失败
- 使用
\
转义 space - 失败
我目前 运行 通过 Homebrew 在 Mac OSX 10.10.2 上安装了 ansible 1.8.4。
剧本正在配置 Ubuntu 14.04 盒子和 MySQL 5.5.41-0ubuntu0.14.04.1 (Ubuntu)
我肯定遗漏了一些明显的东西。有什么建议吗?
更新
调试输出:
TASK: [console | Add api user] ************************************************
<192.168.37.100>
<192.168.37.100> host=% password=VALUE_HIDDEN name=user_name priv=db_name.console_users:"SELECT (col_one, col_two)"
<192.168.37.100> IdentityFile=/Users/jeremykendall/.ssh/id_rsa ConnectTimeout=10 PasswordAuthentication=no KbdInteractiveAuthentication=no User=deploy ForwardAgent=yes PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey StrictHostKeyChecking=no
<192.168.37.100>
<192.168.37.100> IdentityFile=/Users/jeremykendall/.ssh/id_rsa ConnectTimeout=10 'sudo -k && sudo -H -S -p "[sudo via ansible, key=sxqmfmrnzwqhgohgejmdydblzjczuvyr] password: " -u root /bin/sh -c '"'"'echo SUDO-SUCCESS-sxqmfmrnzwqhgohgejmdydblzjczuvyr; LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 /usr/bin/python /home/deploy/.ansible/tmp/ansible-tmp-1425679033.3-193113161035706/mysql_user; rm -rf /home/deploy/.ansible/tmp/ansible-tmp-1425679033.3-193113161035706/ >/dev/null 2>&1'"'"'' PasswordAuthentication=no KbdInteractiveAuthentication=no User=deploy ForwardAgent=yes PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey StrictHostKeyChecking=no
failed: [192.168.37.100] => (item=%) => {"failed": true, "item": "%"}
msg: invalid privileges string: Invalid privileges specified: frozenset(['SELECT (COL_ONE', ' COL_TWO)'])
FATAL: all hosts have already failed -- aborting
我的剧本中有这样的东西运行正常:
priv=db1.table_name1:SELECT,UPDATE(visible,refid,user_signature)/db2.table_name2:SELECT,INSERT
有什么好处吗?那么对于你来说:
priv={{ mysql_project_database }}.console_users:SELECT(col_one,col_two)
这对我有用。
# cat Whosebug_28908155.yml
---
- hosts: localhost
user: ansible
tasks:
- name: Add api user
mysql_user: >
name="combo"
host="{{ item }}"
password="bogFanJoadFojBacUlvimudFilpUrcac"
priv=dashboard.metrics:"SELECT (report_id, category)"
with_items:
- "%"
tags:
- mysql-user
# mysql -e 'desc dashboard.metrics'
+-----------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| report_id | int(11) | NO | MUL | NULL | |
| category | varchar(255) | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| value | decimal(12,6) | YES | | NULL | |
+-----------+---------------+------+-----+---------+----------------+
# ansible-playbook Whosebug_28908155.yml
PLAY [localhost] **************************************************************
GATHERING FACTS ***************************************************************
ok: [localhost]
TASK: [Add api user] **********************************************************
changed: [localhost] => (item=%)
PLAY RECAP ********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0
# mysql -Bse 'select Host,User,Password from mysql.user where User="combo";'
% combo *5E916E80BFCBBEEDFEB614DEF49616F7F124D6EE
最近似乎对空格的处理发生了变化。由于“,SUPER”,我的 mysql_user 的 运行 在最近的 ansible 版本中开始失败;通过更改为“,SUPER”来修复。
目前这是 Ansible MySQL 模块中的一个未决问题。
它是在模块开始根据模块中的硬编码列表验证权限后启动的。通过检查新权限列表是否是有效权限列表的子集来完成验证。
当然,SELECT、UPDATE等都在列表中。但是 SELECT(columnname) 显然不是。验证逻辑不够智能。
这解释了为什么它以前有效而现在不再有效。
您可以在此处找到包含修复的问题报告:https://github.com/ansible/ansible-modules-core/issues/1120
更新 30.06.:修复已提交到 Ansible 存储库,应该会出现在下一个稳定版本中:https://github.com/ansible/ansible-modules-core/commit/4ee18957dc95db427fec5a0cd66b6257b549213b
我正在使用 mysql_user
模块尝试添加用户和权限。我在以下任务中遇到 "invalid privileges string" 错误。
- name: Add api user
mysql_user:
name="user_name"
host="{{ item }}"
password={{ mysql_password }}
priv={{ mysql_project_database }}.console_users:"SELECT (col_one, col_two)"
with_items:
- "%"
tags:
- mysql-user
我是 运行 命令行中的任务,如下所示:
ansible-playbook playbook.yml -i inventory/develop -vv --tags=mysql-user
这会导致以下错误:
failed: [192.168.37.100] => (item=%) => {"failed": true, "item": "%"}
msg: invalid privileges string: Invalid privileges specified: frozenset(['SELECT (COL_ONE', ' COL_TWO)'])
我不是 100% 确定,但我认为这个问题与权限中的 space 有关。我似乎无法逃避它或用引号解决它(我已经看到建议的几个地方)。
我试过:
- 仅授予
SELECT
- 有效 - 在整个特权周围加上引号 - 失败
- 使用
\
转义 space - 失败
我目前 运行 通过 Homebrew 在 Mac OSX 10.10.2 上安装了 ansible 1.8.4。
剧本正在配置 Ubuntu 14.04 盒子和 MySQL 5.5.41-0ubuntu0.14.04.1 (Ubuntu)
我肯定遗漏了一些明显的东西。有什么建议吗?
更新
调试输出:
TASK: [console | Add api user] ************************************************
<192.168.37.100>
<192.168.37.100> host=% password=VALUE_HIDDEN name=user_name priv=db_name.console_users:"SELECT (col_one, col_two)"
<192.168.37.100> IdentityFile=/Users/jeremykendall/.ssh/id_rsa ConnectTimeout=10 PasswordAuthentication=no KbdInteractiveAuthentication=no User=deploy ForwardAgent=yes PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey StrictHostKeyChecking=no
<192.168.37.100>
<192.168.37.100> IdentityFile=/Users/jeremykendall/.ssh/id_rsa ConnectTimeout=10 'sudo -k && sudo -H -S -p "[sudo via ansible, key=sxqmfmrnzwqhgohgejmdydblzjczuvyr] password: " -u root /bin/sh -c '"'"'echo SUDO-SUCCESS-sxqmfmrnzwqhgohgejmdydblzjczuvyr; LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 /usr/bin/python /home/deploy/.ansible/tmp/ansible-tmp-1425679033.3-193113161035706/mysql_user; rm -rf /home/deploy/.ansible/tmp/ansible-tmp-1425679033.3-193113161035706/ >/dev/null 2>&1'"'"'' PasswordAuthentication=no KbdInteractiveAuthentication=no User=deploy ForwardAgent=yes PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey StrictHostKeyChecking=no
failed: [192.168.37.100] => (item=%) => {"failed": true, "item": "%"}
msg: invalid privileges string: Invalid privileges specified: frozenset(['SELECT (COL_ONE', ' COL_TWO)'])
FATAL: all hosts have already failed -- aborting
我的剧本中有这样的东西运行正常:
priv=db1.table_name1:SELECT,UPDATE(visible,refid,user_signature)/db2.table_name2:SELECT,INSERT
有什么好处吗?那么对于你来说:
priv={{ mysql_project_database }}.console_users:SELECT(col_one,col_two)
这对我有用。
# cat Whosebug_28908155.yml
---
- hosts: localhost
user: ansible
tasks:
- name: Add api user
mysql_user: >
name="combo"
host="{{ item }}"
password="bogFanJoadFojBacUlvimudFilpUrcac"
priv=dashboard.metrics:"SELECT (report_id, category)"
with_items:
- "%"
tags:
- mysql-user
# mysql -e 'desc dashboard.metrics'
+-----------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| report_id | int(11) | NO | MUL | NULL | |
| category | varchar(255) | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| value | decimal(12,6) | YES | | NULL | |
+-----------+---------------+------+-----+---------+----------------+
# ansible-playbook Whosebug_28908155.yml
PLAY [localhost] **************************************************************
GATHERING FACTS ***************************************************************
ok: [localhost]
TASK: [Add api user] **********************************************************
changed: [localhost] => (item=%)
PLAY RECAP ********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0
# mysql -Bse 'select Host,User,Password from mysql.user where User="combo";'
% combo *5E916E80BFCBBEEDFEB614DEF49616F7F124D6EE
最近似乎对空格的处理发生了变化。由于“,SUPER”,我的 mysql_user 的 运行 在最近的 ansible 版本中开始失败;通过更改为“,SUPER”来修复。
目前这是 Ansible MySQL 模块中的一个未决问题。
它是在模块开始根据模块中的硬编码列表验证权限后启动的。通过检查新权限列表是否是有效权限列表的子集来完成验证。 当然,SELECT、UPDATE等都在列表中。但是 SELECT(columnname) 显然不是。验证逻辑不够智能。
这解释了为什么它以前有效而现在不再有效。
您可以在此处找到包含修复的问题报告:https://github.com/ansible/ansible-modules-core/issues/1120
更新 30.06.:修复已提交到 Ansible 存储库,应该会出现在下一个稳定版本中:https://github.com/ansible/ansible-modules-core/commit/4ee18957dc95db427fec5a0cd66b6257b549213b