Назад | Перейти на главную страницу

Оставить хлебные крошки в Ansible не работает

Ниже приведен фрагмент кода, который я реализовал в 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