LINUX.ORG.RU
решено ФорумAdmin

Передача значения переменной одного хоста в другой в плэйбуке Ansible

 , ,


0

1

Есть переменная master_status хоста ubu1:

  - name: Get primary binlog File name and binlog Position
    community.mysql.mysql_replication:
      mode: getprimary
      login_unix_socket: /run/mysqld/mysqld.sock
    register: master_status

Надо использовать значение переменной master_status в хосте ubu2:

  - name: Start replication
    community.mysql.mysql_replication:
      mode: startreplica
      primary_host: 192.168.56.121
      primary_log_file: '{{ [ubu1][master_status.File] }}'
      primary_log_pos: '{{ [ubu1][master_status.Position] }}'
      login_unix_socket: /run/mysqld/mysqld.sock

У меня неработающий вариант: [ubu1][master_status.File]



Последнее исправление: paa66 (всего исправлений: 2)

Обычно это bad practice, но тут вроде имеет смысл

Важно: с mythogen работать не будет и не должно

попробуй https://stackoverflow.com/questions/48936489/use-variable-from-another-host

{{ hostvars[ubu1].master_status.File }}

ну ещё остаётся вариант для мастера делать таски с delegate_to (определение статуса, сохранение в файл, копирование файла на localhost). а для слейвов копировать файл и брать данные из него

router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)

У меня неработающий вариант: [ubu1][master_status.File]

а это вроде вообще работать не должно. кроме пропуска hostvars, тут какая-то дикая смесь синтаксиса питона «[]» и ансибла «.»

в любом случае, всегда есть ansible.builtin.debug, чтобы глянуть на данные

router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от router

В таске второго хоста сделал такой плэй:

  - name: Debug var master_status.File
    debug:
      var: hostvars['ubu1']['master_status']['Position']

Получил ответ:

ok: [ubu2] => {

«hostvars['ubu1']['master_status']['Position']»: «157»

А вот при выполнении следующего плэя:

  - name: Start replication
    community.mysql.mysql_replication:
      mode: startreplica
      primary_host: 192.168.56.121
      primary_log_file: hostvars['ubu1']['master_status']['File']
      primary_log_pos: hostvars['ubu1']['master_status']['Position']
      login_unix_socket: /run/mysqld/mysqld.sock

получил ответ:

«msg»: «argument 'primary_log_pos' is of type <class 'str'> and we were unable to convert to int: <class 'str'> cannot be converted to an int»

Есть ли возможность конвертировать «157» в int?

paa66
() автор топика
Ответ на: комментарий от router

Сделал так:

  - name: Start replication
    community.mysql.mysql_replication:
      mode: startreplica
      primary_host: 192.168.56.121
      primary_log_file: hostvars['ubu1']['master_status']['File']
      primary_log_pos: "{{ hostvars['ubu1']['master_status']['Position'] | int }}"
      login_unix_socket: /run/mysqld/mysqld.sock

Всё получилось. Спасибо!

paa66
() автор топика
Ответ на: комментарий от router

Я рано праздновал победу. При таком синтаксисе в плэйбуке (сначала было без точек между квадратными скобками)

primary_log_file: hostvars['ubu1'].['master_status'].['File']

ансибл вместо

«binlog.000003»

вставляет

«primary_log_file»: «hostvars['ubu1'].['master_status'].['File']»

Т.е., не значение переменной, а её название. Как исправить?

paa66
() автор топика
Ответ на: комментарий от paa66

Почитать что-нибудь про ansible. Ну или хотя бы найти отличие в строке, которая работает, и которая не работает в Передача значения переменной одного хоста в другой в плэйбуке Ansible (комментарий)

router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от router

Сделал так:

  - name: Start replication
    community.mysql.mysql_replication:
      mode: startreplica
      primary_host: 192.168.56.121
      primary_log_file: "{{ hostvars['ubu1']['master_status']['File'] }}"
      primary_log_pos: "{{ hostvars['ubu1']['master_status']['Position'] | int }}"
      login_unix_socket: /run/mysqld/mysqld.sock

и всё сработало. Надеюсь, это окончательно :))

paa66
() автор топика