我正在试着替换django设置行 'NAME': os.path.join(BASE_DIR , 'db.sqlite3'),
通过 'NAME': os.path.join(BASE_DIR , 'db.mysql'),
但它找不到。
另一行与发动机参数正常工作。问题一定是“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'],
}
然后我将用“mynewdb”替换name参数?我理解得对吗?
1条答案
按热度按时间fkvaft9z1#
你要记住
match
参数到file_line
资源传递的是正则表达式,而不是普通字符串。puppet使用正则表达式的ruby风格。在那个方言里,像其他方言一样,括号(()
)是元字符,表示分组。如果要将它们解释为文字,则必须对其进行转义。此外,由于ruby regex使用与puppet字符串相同的转义字符,因此还必须转义转义字符,以便将其通过puppet传递到底层regex引擎。另一方面,您不需要在双引号字符串中转义单引号,反之亦然,尽管这样做不应该有害。例子:
但这是一个有点糟糕的设计。如果您试图确保您想要的数据库被正确命名(不管实际名称应该是什么),那么在最大程度上,您应该以一种不依赖于当前数据库名称的方式匹配您想要管理的行。
我不知道django的具体情况,但如果你只能依靠一个
NAME
属性,则可以改为执行以下操作:那里的匹配表达式匹配具有任意数量前导空格的行,后跟文字字符
'NAME':
,然后是任何东西。但你也应该考虑
file_line
是这项工作的正确工具。只有当您需要容纳在puppet外部管理的文件的某些部分时,这才真正有意义,这是一种令人不舒服的情况,尽管有时我们会遇到这种情况。不过,如果可能,最好允许puppet管理整个文件,包括其完整内容。