Шеф-повар выполняет блок

Во-первых, я очень новичок в кодировании и в Chef, поэтому, пожалуйста, потерпите меня, если я буду задавать глупые вопросы.

Есть ли способ, чтобы мой блок выполнения в рецепте запускался только в том случае, если пользователь не соответствует. Это просто однострочный оператор: chown -R aaa:aaa файл/путь. Поэтому, если владельцем файла/пути уже является aaa, не запускайте это.

Если я не ясно выразился в вопросе, прошу прощения, постараюсь прояснить.

Любая помощь будет принята с благодарностью. Спасибо за ваше время.


person Treadstone    schedule 10.03.2016    source источник


Ответы (2)


Вы можете использовать not_if, например:

require 'etc'

execute "chown file/path" do
  command "chown -R aaa:aaa file/path"
  not_if { Etc.getpwuid(File.stat("file/path").uid).name == "aaa" }
end

Если вы хотите также проверить группу, просто добавьте это к условию.

Обратите внимание, что ваш подход на самом деле не является идемпотентным, поскольку каталог может принадлежать aaa, но включать файлы других. Кажется, лучше всегда запускать chown без каких-либо условий, чтобы все содержимое было переведено в aaa:aaa. Если файлов уже aaa:aaa, то ничего не происходит.

person Paul A Jungwirth    schedule 10.03.2016
comment
Не совсем ничего не происходит при вызове chown/chmod без изменений в файле, время изменения файла обновляется, что может иметь побочные эффекты для систем резервного копирования, позволяя им думать, что файл на самом деле изменился. - person Tensibai; 11.03.2016

Таким образом, другой ответ технически правильный, но реальный способ сделать это — использовать ресурс file:

file 'file/path' do
  owner 'aaa'
  group 'aaa'
end

Это уже идемпотент (причудливое слово для «не меняйте то, что и так хорошо») внутри.

person coderanger    schedule 10.03.2016
comment
Я бы добавил, что если это каталог, а не файл, вы можете использовать ресурс каталога. однако -R может быть проблемой. Я не знаю, как заставить ресурс каталога рекурсивно применять chown. - person Tejay Cardon; 11.03.2016
comment
Я согласен, что file (или directory) обычно было бы лучше, но спрашивающий хочет рекурсивно изменить все (chmod -R). Как вы это делаете с file или directory? - person Paul A Jungwirth; 11.03.2016
comment
Что-то, чего следует остерегаться с ресурсом directory: даже если вы используете атрибут recursive (который указывает, что вы хотите создать полную структуру каталогов, если она еще не существует), это не означает, что атрибуты owner, group и mode будут применяются ко всей структуре каталогов. На самом деле: For the owner, group, and mode properties, the value of this attribute applies only to the leaf directory. - person gsaslis; 11.03.2016