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






Вы должны иметь в виду, что параметр 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 управлять всем файлом, включая его полное содержимое.
Большое тебе спасибо! Это прекрасное объяснение!
Зачем тебе это нужно?
db.mysqlне был бы файлом; MySQL не использует файл для хранения своих данных, в отличие от sqlite. Это не похоже на то, что вы хотели бы делать. В любом случае вам следует лучше структурировать свои файлы настроек, чтобы в первую очередь брать такие специфичные для среды данные из env vars, а не заставлять Puppet заменять строки.