Марионетка: file_line оценивает os.path.join

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

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

от

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

но не находит.

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

  # 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»? Я правильно понял?

Зачем тебе это нужно? db.mysql не был бы файлом; MySQL не использует файл для хранения своих данных, в отличие от sqlite. Это не похоже на то, что вы хотели бы делать. В любом случае вам следует лучше структурировать свои файлы настроек, чтобы в первую очередь брать такие специфичные для среды данные из env vars, а не заставлять Puppet заменять строки.

Daniel Roseman 11.12.2018 10:55

Здравствуйте, спасибо, что разъяснили это. Я новичок в django и puppet, но мне нужно узнать, как установить MySQL в качестве базы данных по умолчанию в Django. Я подумал, это будет просто замена sqlite3 на mysql .. Есть ли какое-то имя или другие параметры, которые нужно задать? Я читал это (digitalocean.com/community/tutorials/…). Часть, в которой settings.py изменен для mysql, просто отображается с «Engine» и «options». В любом случае мне нужно будет заменить строку «имя», не так ли?

Nin4ikP 11.12.2018 11:05

Нет, вам нужно установить NAME на фактическое имя вашей базы данных в MySQL, которое не имеет ничего общего с именем файла. Вы создали базу данных? По какой-то причине этот учебник поместил имя / пользователя / пароль в отдельный файл, который читается, что немного странно, но не важно; если вы это делаете, вы вообще не хотите, чтобы NAME здесь. Я бы предпочел указать эти параметры непосредственно в настройках.

Daniel Roseman 11.12.2018 11:09

Я отредактировал пост - подскажите пожалуйста, правильно ли я вас понял?

Nin4ikP 11.12.2018 11:44
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
4
249
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны иметь в виду, что параметр 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 управлять всем файлом, включая его полное содержимое.

Большое тебе спасибо! Это прекрасное объяснение!

Nin4ikP 13.12.2018 13:18

Другие вопросы по теме