Ansible mysql_user priv - " invalid privileges string:指定的权限无效"

时间:2015-03-06 21:41:08

标签: ansible

我正在使用mysql_user模块尝试添加用户和权限。我在以下任务中收到“无效权限字符串”错误。

- 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)'])

我不是百分百肯定,但我认为这个问题与特权中的空间有关。我似乎无法摆脱它或用引号解决它(我已经看到了一些地方的建议)。

我试过了:

  • 仅授予SELECT - 作品
  • 在整个权限周围加上引号 - 失败
  • 使用\转义空间 - 失败

我目前正在Mac OSX 10.10.2上通过Homebrew安装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

4 个答案:

答案 0 :(得分:2)

目前这是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

答案 1 :(得分:0)

我的剧本中有这样的东西正常工作:

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)

答案 2 :(得分:0)

这对我有用。

# cat stackoverflow_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 stackoverflow_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

答案 3 :(得分:0)

最近看起来空间的处理可能已经改变了。由于&#34;,SUPER&#34 ;;我的mysql_user运行在最近的ansible版本中开始失败。修改为&#34;,SUPER&#34;。