Кукольный: file_line оценивает os.path.join - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь заменить строку Django-Settings

'NAME': os.path.join(BASE_DIR , 'db.sqlite3'),

на

'NAME': os.path.join(BASE_DIR , 'db.mysql'),

, но это не такнайдите его.

Другая строка с параметром ENGINE работает нормально.Проблема должна быть в "os.path.join" -part.

  # replace sqlite3 db with mysql
    file { '/var/www/mysite/mysite/settings.py':
      ensure => present,
    }
    file_line { 'replace db engine':
      path                => '/var/www/mysite/mysite/settings.py',
      replace             => true,
      line                => "'ENGINE': 'django.db.backends.mysql',",
      match               => "'ENGINE': 'django.db.backends.sqlite3',",
      append_on_no_match  => false,
    }

    file_line { 'replace db name':
      path                => '/var/www/mysite/mysite/settings.py',
      replace             => true,
      line                => "\'NAME\': os.path.join(BASE_DIR , \'db.mysql\'),",
      match               => "\'NAME\': os.path.join(BASE_DIR , \'db.sqlite3\'),",
      append_on_no_match  => false,
    }

Я пробовал с \ 'и без \.

Может кто-нибудь помочь, пожалуйста?

РЕДАКТИРОВАТЬ: Итак, если я добавлю что-то вроде этого заранее:

  class { '::mysql::server':
    root_password    => 'strongpassword',
    override_options => { 'mysqld' => { 'max_connections' => '1024' } }
  }

  mysql::db { 'mynewDB':
    user     => 'admin',
    password => 'secret',
    host     => 'master.puppetlabs.vm',
    sql        => '/tmp/states.sql',
    require => File['/tmp/states.sql'],
  }

Тогда я бы заменил параметр NAME на "mynewDB"?Правильно ли я понял?

1 Ответ

0 голосов
/ 11 декабря 2018

Необходимо иметь в виду, что параметр match для ресурса file_line содержит регулярное выражение , а не простую строку.Puppet использует аромат регулярных выражений Ruby.На этом диалекте, как и во многих других, круглые скобки (()) являются метасимволами, обозначающими группировку.Вы должны избегать их, если хотите, чтобы они интерпретировались как литералы.Более того, поскольку регулярные выражения Ruby используют тот же escape-символ, что и строки Puppet, вы также должны экранировать escape-символ, чтобы передать его через Puppet в базовый движок регулярных выражений.С другой стороны, вам не нужно экранировать одинарные кавычки внутри строки в двойных кавычках, или наоборот, хотя это не должно быть вредным.

Пример:

file_line { 'replace db name':
  path                => '/var/www/mysite/mysite/settings.py',
  replace             => true,
  line                => "'NAME': os.path.join(BASE_DIR , 'db.mysql'),",
  match               => "'NAME': os.path.join\\(BASE_DIR , 'db.sqlite3'\\),",
  append_on_no_match  => false,
}

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

Я не осведомлен о специфике Django, но если вы можете полагаться только на одно свойство NAME, указанное в файле настроек, вы можете вместо этого сделать следующее:

file_line { 'replace db name':
  path                => '/var/www/mysite/mysite/settings.py',
  replace             => true,
  line                => 'Whatever the line should really be',
  match               => "\\s*'NAME':.*",
  append_on_no_match  => false,
}

Выражение соответствия там соответствует строке с произвольным количеством начальных пробелов, за которыми следуют буквенные символы 'NAME':, за которыми следует что-нибудь .

Но вы должны также рассмотреть вопрос о том,file_line - это правильный инструмент для работы.Это действительно имеет смысл, только если вам нужно разместить некоторые части файла, управляемые за пределами Puppet, что является неудобной ситуацией, хотя иногда она застревает.Однако, если это возможно, лучше разрешить Puppet управлять всем файлом, включая его полное содержимое.

...