puppet:file\u line计算os.path.join

xlpyo6sf  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(335)

我正在试着替换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参数?我理解得对吗?

fkvaft9z

fkvaft9z1#

你要记住 match 参数到 file_line 资源传递的是正则表达式,而不是普通字符串。puppet使用正则表达式的ruby风格。在那个方言里,像其他方言一样,括号( () )是元字符,表示分组。如果要将它们解释为文字,则必须对其进行转义。此外,由于ruby regex使用与puppet字符串相同的转义字符,因此还必须转义转义字符,以便将其通过puppet传递到底层regex引擎。另一方面,您不需要在双引号字符串中转义单引号,反之亦然,尽管这样做不应该有害。
例子:

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管理整个文件,包括其完整内容。

相关问题