我想使用Ansible进行配置管理,在AWS上设置MySQL服务器。
我正在使用来自Amazon(ami-3275ee5b)的默认AMI,该默认AMI使用yum进行程序包管理。

执行下面的Playbook后,一切顺利。但是当我第二次运行它时,任务Configure the root credentials失败了,因为MySQL的旧密码已不再匹配,因为它是我上次运行此Playbook时更新的。

这使Playbook不具有幂等性,这是我不喜欢的。我希望能够尽可能多地运行Playbook。

- hosts: staging_mysql
  user: ec2-user
  sudo: yes

  tasks:
    - name: Install MySQL
      action: yum name=$item
      with_items:
        - MySQL-python
        - mysql
        - mysql-server

    - name: Start the MySQL service
      action: service name=mysqld state=started

    - name: Configure the root credentials
      action: command mysqladmin -u root -p $mysql_root_password

解决此问题的最佳方法是什么,这意味着使Playbook成为幂等?提前致谢!

最佳答案

我在coderwall上发布了有关此内容的文章,但我将在原始文章的评论中重述dennisjac的改进。

决定性地做到这一点的诀窍是知道mysql_user模块将在找到〜/ .my.cnf文件时加载它。

我首先更改密码,然后使用密码凭据复制一个.my.cnf文件。当您再次尝试运行它时,myqsl_user ansible模块将找到.my.cnf并使用新密码。

- hosts: staging_mysql
  user: ec2-user
  sudo: yes

  tasks:
    - name: Install MySQL
      action: yum name={{ item }}
      with_items:
        - MySQL-python
        - mysql
        - mysql-server

    - name: Start the MySQL service
      action: service name=mysqld state=started

    # 'localhost' needs to be the last item for idempotency, see
    # http://ansible.cc/docs/modules.html#mysql-user
    - name: update mysql root password for all root accounts
      mysql_user: name=root host={{ item }} password={{ mysql_root_password }} priv=*.*:ALL,GRANT
      with_items:
        - "{{ ansible_hostname }}"
        - 127.0.0.1
        - ::1
        - localhost

    - name: copy .my.cnf file with root password credentials
      template: src=templates/root/.my.cnf dest=/root/.my.cnf owner=root mode=0600

.my.cnf模板如下所示:
[client]
user=root
password={{ mysql_root_password }}

编辑:添加了Dhananjay Nene在注释中建议的特权,并更改了变量插值以使用大括号而不是美元符号。

关于mysql - Ansible幂等MySQL安装手册,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16444306/

10-11 08:30