Ниже приведен фрагмент кода, который я реализовал в Ansible, который пытается настроить репликацию MySQL:
- stat: path=/etc/mysql/ansible.repl
register: check_sql_path
- name: create replicator user
mysql_user:
name: "replicator"
host: "%"
password: "{{ mypass.password_replication }}"
priv: "*.*:REPLICATION SLAVE"
state: present
notify:
- restart mysql
- mysql_replication:
mode: changemaster
master_host: hostvars[inventory_hostname]['ansible_default_ipv4']['address']
master_user: replicator
master_password: "{{ mypass.password_replication }}"
when: check_sql_path.stat.exists == false
notify:
- restart mysql
- command: touch /etc/mysql/repl.ansible
when: check_sql_path.stat.exists == false
Но перед этим он проверяет,
check_sql_path.stat.exists is false
Переменная check_sql_path.stat.exists
установлено значение true при первом запуске Ansible, поэтому при втором вызове Ansible этот блок кода не выполняется.
Но каким-то образом это выполняется во время моего второго запуска, и я получаю следующее исключение:
==> site: TASK [mysql_replication] *******************************************************
==> site: fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "(1198, 'This operation cannot be performed with a running slave; run STOP SLAVE first'). Query == CHANGE MASTER TO ['MASTER_HOST=%(master_host)s', 'MASTER_USER=%(master_user)s', 'MASTER_PASSWORD=%(master_password)s']"}
==> site: to retry, use: --limit @/vagrant/ansible/playbook.retry
Похоже, что when
условие не принимается во внимание Ansible.
Я также проверил сервер и файл /etc/mysql/ansible.repl
создается впервые.
Есть идеи, что я здесь делаю не так?
Вы проверяете наличие /etc/mysql/ansible.repl
и ты бежишь touch
командовать /etc/mysql/repl.ansible
. Имена файлов разные.
Чтобы избежать ошибок, используйте константы (определенные как переменные, возможно, со значимыми именами).
Также используйте согласованный синтаксис YAML (т.е. не смешивайте =
с участием :
-style) и собственные модули (file
вместо того command: touch
).
vars:
mysql_repl_flag_path: /etc/mysql/ansible.repl
tasks:
- stat:
path: "{{ mysql_repl_flag_path }}"
register: mysql_repl_flag
# two tasks skipped for clarity
- file:
path: "{{ mysql_repl_flag_path }}"
state: touch
# because it is "touch" operation, the following condition is not necessary:
# when: mysql_repl_flag.stat.exists == false
# it also could be simpler:
# when: not mysql_repl_flag.stat.exists