在 Puppet 中创建文件之前检查目录?

在 Puppet 中创建文件之前检查目录?

我正在尝试创建一个函数,仅当第一个目录存在时才会创建目录/文件,否则由于依赖失败而必须跳过它。

我试过了此“onlyif”解决方法,但不幸的是它不适用于我的功能。

$check_directory = file("/path/to/directory")
if($check_directory != '') {
    file{"/path/to/config":
        ensure  =>  directory,
        mode    =>  0755,
    }
    file{"/path/to/config/a.conf":
        ensure  =>  file,
        mode    =>  0755,
        content =>  template("config_template.conf"),
    }
}

我遇到一个错误:

Error: Is a directory - /path/to/directory

有没有办法执行其他 if 语句?或者任何参数?谢谢。

答案1

您应该能够require在文件资源中简单地使用一个语句a.conf

file{"/path/to/directory":
    ensure  =>  directory,
    mode    =>  0755,
}

file{"/path/to/config":
    ensure  =>  directory,
    mode    =>  0755,
}
file{"/path/to/config/a.conf":
    ensure  =>  file,
    mode    =>  0755,
    content =>  template("config_template.conf"),
    require => File["/path/to/directory"],
}

这将确保目录在文件之前创建。

答案2

@Sven 的回答是绝对正确的:你使用、、等在 Puppet 中设置资源依赖关系。beforerequire唯一notify想改变的是,我将使用defined()要测试的功能:

file { '/tmp/foo':
  ensure => 'directory',
  mode   => '0755',
}
if defined(File['/tmp/foo']) {
  notice("/tmp/foo is defined! making /tmp/bar/baz")

  file { '/tmp/bar':
    ensure => 'directory',
    mode   => '0755',
  }

  file { '/tmp/bar/baz':
    ensure  => 'present',
    mode    => '0755',
    require => File['/tmp/bar'],
  }
}

另外两个有用的信息:

  • 如果您启用“未来解析器”在 Puppet 3.2+ 中,您可以像这样访问资源属性: 。这会将文件资源的属性$a = File['/tmp/foo']['ensure']值存储在变量中。如果您决定研究这一点,我会重写上述示例以使用(未​​经测试)。ensure/tmp/foo$aif defined(File['/tmp/foo']) and File['/tmp/foo']['ensure'] == 'directory'

  • 如果你将这些项作为参数传递给类,则可以通过以下方式访问类参数的值:在 Puppet 中如何访问定义类型内的变量属性

答案3

编辑:如果你使用,下面的方法有效puppet apply,但是不是否则,因为find_file函数是在目录编制。 这意味着这种方法会检查用于编译目录的任何服务器上是否存在/path/to/directory/.,而不是实际应用目录的主机。所以这可能不是普通用户想要的。在传统的 puppetmaster/client 架构中,目录不是在使用该目录的主机上编译的。


似乎工作得很好find_file;帽子提示这篇博文这让我走上了正确的方向。

$check_directory = find_file("/path/to/directory/.")
if $check_directory {
    file{"/path/to/config":
        ensure  =>  directory,
        mode    =>  0755,
    }
    file{"/path/to/config/a.conf":
        ensure  =>  file,
        mode    =>  0755,
        content =>  template("config_template.conf"),
    }
}

$check_directoryundef如果目录不存在,则会计算为 false 。

/.请注意,如果/path/to/directory存在但是是文件而不是目录,则添加尾随会导致检查失败(并且代码不会运行)。

相关内容