人偶:file_line 评估 os.path.join
Puppet: file_line evaluates 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'],
}
那我要用 "mynewDB" 替换 NAME 参数?
我的理解正确吗?
您需要记住,file_line
资源的 match
参数传达的是 正则表达式 ,而不是纯字符串。 Puppet 使用 Ruby 风格的正则表达式。在该方言中,与许多其他方言一样,括号 (()
) 是元字符,表示分组。如果您希望它们被解释为文字,则必须转义它们。此外,因为 Ruby 正则表达式使用与 Puppet 字符串相同的转义字符,您还必须转义转义字符以通过 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':
,然后是 anything.
但是您还应该考虑 file_line
是否是完成这项工作的正确工具。仅当您需要容纳在 Puppet 外部管理的文件的某些部分时,它才真正有意义,这是一种不舒服的情况,尽管有时我们会遇到这种情况。不过,如果可能,最好让 Puppet 管理整个文件,包括其完整内容。
我正在尝试替换 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'],
}
那我要用 "mynewDB" 替换 NAME 参数? 我的理解正确吗?
您需要记住,file_line
资源的 match
参数传达的是 正则表达式 ,而不是纯字符串。 Puppet 使用 Ruby 风格的正则表达式。在该方言中,与许多其他方言一样,括号 (()
) 是元字符,表示分组。如果您希望它们被解释为文字,则必须转义它们。此外,因为 Ruby 正则表达式使用与 Puppet 字符串相同的转义字符,您还必须转义转义字符以通过 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':
,然后是 anything.
但是您还应该考虑 file_line
是否是完成这项工作的正确工具。仅当您需要容纳在 Puppet 外部管理的文件的某些部分时,它才真正有意义,这是一种不舒服的情况,尽管有时我们会遇到这种情况。不过,如果可能,最好让 Puppet 管理整个文件,包括其完整内容。