我想在AWS上安装一个MySQL服务器,使用Ansible进行配置管理.

当执行下面的 playbook 时,一切都很顺利.但是当我第二次运行它时,task 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 幂等?提前谢谢!

推荐答案

Ansible version for a secure MySQL installation.

mysql_安全安装.yml

- 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 }}
      with_items:
        - "{{ ansible_hostname }}"
        - 127.0.0.1
        - ::1
        - localhost

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

    - name: delete anonymous MySQL server user for $server_hostname
      action: mysql_user user="" host="{{ server_hostname }}" state="absent"

    - name: delete anonymous MySQL server user for localhost
      action: mysql_user user="" state="absent"

    - name: remove the MySQL test database
      action: mysql_db db=test state=absent

模板/root/my.cnf.j2

[client]
user=root
password={{ mysql_root_password }}

References

Mysql相关问答推荐

是否有一种方法可以 Select 表中具有特定列值的行,该行还显示phpmyadmin中原始表中的行号?

创建从表中筛选数据的过程时出错

在MySQL中存储一条帖子的点赞数量

计算符合字段值只能包含一种事件类型这一事实的记录

获取最大登录应用程序用户数以及何时

将上传文件的存储路径放在一张表中的缺点是什么?

外部磁盘上的MySQL表空间和数据文件

如何确保 SQL 记录的列不引用它自己的主键?

Mysql如何分行分词

使用来自另一个表 mysql 的值将新行插入到表中

获取 TEXT 类型行的百分比

为什么order by子句可以利用索引?

一次更新mysql中的多个列

带有 PARTITION BY 子句的 ROW_NUMBER() 停止在 MariaDB 上工作

在一个 SQL 查询中对同一列中相同类型的不同值求和

按长度过滤 varbinary 字段

如何在 SQL 的计算列中显示小数点后两位?

是否可以在内部连接期间重命名连接列?

MySQL 导出到 outfile:CSV 转义字符

MySQL DAYOFWEEK() - 我的一周从星期一开始