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 有关。我似乎无法逃避它或用引号解决它(我已经看到建议的几个地方)。

我试过:

我目前 运行 通过 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