我想使用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/