Назад | Перейти на главную страницу

Проверить каталог перед созданием файла в марионетке?

Я пытаюсь создать функцию, каталог / файл которой будет создан только тогда, когда существует первый каталог, а не его нужно пропустить из-за неудачной зависимости.

я пробовал это обходное решение "только если", но, к сожалению, это не работает с моей функцией.

$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? Или какой-то параметр? Спасибо.

Вы должны просто использовать 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"],
}

Это гарантирует, что каталог будет создан перед файлом.

Идея ответа @Sven абсолютно верна: вы настраиваете зависимости ресурсов в Puppet, используя before, require, 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 файловый ресурс в переменной $a. Если вы решите изучить это, я бы переписал приведенный выше пример, чтобы использовать if defined(File['/tmp/foo']) and File['/tmp/foo']['ensure'] == 'directory' (НЕПРОВЕРЕНО).

  • Если вы передаете эти элементы в качестве параметров классу, есть хитрый способ получить доступ к значениям параметров класса через in-puppet-how-can-i-access-a-переменная-атрибут-внутри-определенного-типа.