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

Настройка удаленного доступа к mysql через марионетку

Проблема: я хочу подключиться к mysql с другого хоста

У меня есть экземпляр mysql, который я настраиваю с помощью марионетки. Я хочу иметь доступ к экземпляру с хоста 1.2.3.4.

Часть 1: начинаю с рук

В `/etc/mysql/my.cnf 'у меня есть

[mysqld]
bind-address = 0.0.0.0

[mine]
database = my-database-name
host = localhost

Я перезапускаю mysqld, затем предоставить разрешение

GRANT select,insert,delete,update \
  ON my-database-name.* \
  TO 'my-user-name'@'1.2.3.4'     \
  IDENTIFIED BY 'user-password';

и это работает.

Часть 2: Я действительно хочу сделать это с марионеткой ...

У меня есть следующий код марионетки:

mysql_grant {'my-user-name@1.2.3.4/my-database-name.*':
  ensure     => 'ensure',
  options    => ['GRANT'],
  privileges => ['SELECT', 'INSERT', 'DELETE', 'UPDATE'],
  table      => 'my-database-name.*',
  user       => 'my-user-name@1.2.3.4',
}

и это дает разрешения, которые я ожидаю, но если я передумаю и скажу это

mysql_grant {'my-user-name@1.2.3.4/my-database-name.*':
  ensure     => 'absent',
  options    => ['GRANT'],
  privileges => ['SELECT', 'INSERT', 'DELETE', 'UPDATE'],
  table      => 'my-database-name.*',
  user       => 'my-user-name@1.2.3.4',
}

Замечу, что это не безответственное разрешение. Изменение GRANT на REVOKE также не дает желаемого эффекта. Любые указатели очень ценятся.

(Связанный вопрос о марионетке: предположим, я хочу разрешить доступ с нескольких хостов. Моя puppet-fu не дает мне понять, как не повторять блокировку.)

Что касается повторяющейся части, я могу думать о двух способах:

  1. puppetDB
  2. Иера

PuppetDB

Если вы хотите, чтобы узел выполнял какие-либо действия на втором узле, используйте puppetDB. Это называется экспортированными ресурсами. Это также объясняется в документация puppet-mysql.

Пример 1: Добавьте SSH Hostkeys всех машин к known_keys всех других машин.

Пример 2: добавить все машины для мониторинга, создав их собственное определение хоста.

Пример 3: разрешите им подключаться к MySQL на компьютере определенного класса.

В каждом случае вы сначала устанавливаете puppetDB через модуль puppet-puppetdb. Для этого вам понадобится puppet4. PuppetDB запустится, только если у вас 8+ ГБ памяти.

Затем вам нужно написать экспорт ресурсов и импорт ресурсов. На всех узлах, у которых есть нужный вам факт (например, ip / fqdn), вы пишете экспорт:

@@mysql_grant {"my-user-name@${::ipaddress}/**my-database-name.*":
  ensure     => 'absent',
  options    => ['GRANT'],
  privileges => ['SELECT', 'INSERT', 'DELETE', 'UPDATE'],
  table      => 'my-database-name.*',
  user       => "my-user-name@${::ipaddress}",
}

'@@' создает экспорт. Обратите внимание, что экспортированный ресурс нижний регистр. Также обратите внимание на двойные кавычки вместо одинарных кавычек всякий раз, когда используется переменная.

Что произойдет, когда узел увидит это, так это то, что он заполнит этот экспортированный ресурс своим фактом (в данном случае :: ipaddress) и отправит его в puppetDB. Вы можете добавить эту часть ко всем узлам, которым вы хотите предоставить доступ, частично нарушив ее назначение, или вы можете иметь манифест, который применяется к все узлов и выполните следующие действия:

if $::fqdn include? 'app'{
  @@mysql_grant {"my-user-name@${::ipaddress}/**my-database-name.*":
    ensure     => 'absent',
    options    => ['GRANT'],
    privileges => ['SELECT', 'INSERT', 'DELETE', 'UPDATE'],
    table      => 'my-database-name.*',
    user       => "my-user-name@${::ipaddress}",
  }
}

Тогда вам нужно написать Импортировать оператор на узле, который должен это применить.

Mysql_grant <<| |>>

Обратите внимание на верхний регистр.

Еще один быстрый пример, который мы применим ко всем нашим узлам Linux:

  # collect all the public host RSA keys for known hosts
  @@sshkey { $hostname:
    ensure       => present,
    type         => 'rsa',
    host_aliases => [$::ipaddress, $::fqdn],
    key          => $sshrsakey,
  }
  # and populate known_hosts
  Sshkey <<| |>>
  #https://projects.puppetlabs.com/issues/21811
  file { '/etc/ssh/ssh_known_hosts':
    ensure => present,
    path   => '/etc/ssh/ssh_known_hosts',
    mode   => '0644',
  }

Hiera

Hiera создана именно для этой цели, чтобы отделить код от данных. Пожалуйста, обратитесь к документации hiera, чтобы узнать, как его настроить.

В итоге вы создадите yaml-файл, в котором будут храниться все ваши данные:

mysql::grants:
  db1:
    username: my-user-name
    database: my-database-name
    ip: 1.2.3.4
    ensure: present
    options:
      - GRANT
    privileges:
      - SELECT
      - INSERT
      - DELETE
      - UPDATE
    table: my-database-name.*
  db2:
    username: my-user-name
    database: my-database-name
    ip: 1.2.3.5
    ensure: present
    options:
      - GRANT
    privileges:
      - SELECT
      - INSERT
      - DELETE
      - UPDATE
    table: my-database-name.*

Затем вы просто помещаете это в свой узел mysql (хотя создание небольшого модуля было бы чище):

$grants = hiera('mysql::grants', undef)
create_resources('mysql::grant', $grants) 

Puppet проанализирует всю hiera, а затем создаст грант для каждого найденного db.