Как изменить порядок выполнения Chef? - PullRequest
0 голосов
/ 21 мая 2018

Я использую рецепт шеф-повара, но он, кажется, работает не по порядку.

#
# Cookbook:: monit
# Recipe:: default
#
# Copyright:: 2017, The Authors, All Rights Reserved.


yum_package 'install Requirements' do
    package_name ['libtool', 'automake', 'autoconf', 'bison', 'flex', 'zlib-devel', 'git']
    action :install
end

script 'install monit' do
    interpreter "bash"
    code <<-EOH
        git clone https://tildeslash@bitbucket.org/tildeslash/monit.git monit
        cd monit/
        ./bootstrap
        ./configure --without-pam --without-ssl --sysconfdir=/etc --prefix=/usr
        make && make install
    EOH
end

iptables_rule 'monit_web' do
    action :enable
end

template '/etc/monitrc' do
    owner 'root'
    mode '0700'
    source 'monitrc.erb'
end

execute 'monit reload' do
    require 'mixlib/shellout'
    cmnd = Mixlib::ShellOut.new('monit start all')
    cmnd.run_command
    if cmnd.error?
        cmndd = Mixlib::ShellOut.new('monit reload')
        cmndd.run_command
    else
        puts cmnd.stdout
    end
end

script 'start service' do
    interpreter "bash"
    code <<-EOF
        monit
        monit start all
    EOF
end

Насколько я понимаю, ресурс сценария 'install monit' должен запускаться до выполнения ресурса 'monit'перезагрузить.Это не похоже на случай;Я получаю следующую ошибку:

================================================================================
Recipe Compile Error in /var/chef/cache/cookbooks/monit/recipes/default.rb
================================================================================

Errno::ENOENT
-------------
No such file or directory - monit

Cookbook Trace:
---------------
  /var/chef/cache/cookbooks/monit/recipes/default.rb:38:in `block in from_file'
  /var/chef/cache/cookbooks/monit/recipes/default.rb:35:in `from_file'

Relevant File Content:
----------------------
/var/chef/cache/cookbooks/monit/recipes/default.rb:

 31:    mode '0700'
 32:    source 'monitrc.erb'
 33:  end
 34:
 35:  execute 'monit reload' do
 36:    require 'mixlib/shellout'
 37:    cmnd = Mixlib::ShellOut.new('monit start all')
 38>>   cmnd.run_command
 39:    if cmnd.error?
 40:            cmndd = Mixlib::ShellOut.new('monit reload')
 41:            cmndd.run_command
 42:    else
 43:            puts cmnd.stdout
 44:    end
 45:  end
 46:
 47:  script 'start service' do

System Info:
------------
chef_version=13.9.1
platform=centos
platform_version=7.5.1804
ruby=ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-linux]
program_name=chef-client worker: ppid=14633;start=14:44:25;
executable=/opt/chef/bin/chef-client

Я подтвердил, что программа 'monit' не установлена.Почему шеф-повар пропускает сценарий и пытается выполнить?В какой-то момент это работало нормально, я не уверен, почему он вдруг перестал работать.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вам следует ознакомиться с Обзором клиента Chef .В частности, порядок Скомпилируйте фазу сбора ресурсов и Сходимость узла Фаза.

Как правило;ресурсы запускаются во время конвергенции, но любой код ruby, которого нет в ресурсе ruby_block, запускается во время компиляции.Таким образом, в этом случае код ruby, который вы используете для monit reload, фактически выполняется на этапе компиляции.Вам нужно изменить этот ресурс, чтобы он был ruby_block.Как это:

ruby_block 'monit reload' do
  block do
    require 'mixlib/shellout'
    cmnd = Mixlib::ShellOut.new('monit start all')
    cmnd.run_command
    if cmnd.error?
        cmndd = Mixlib::ShellOut.new('monit reload')
        cmndd.run_command
    else
        puts cmnd.stdout
    end
  end
  action :run
end
0 голосов
/ 21 мая 2018

Прочитайте coderanger.net/two-pass, но в основном вы просто спрятали некоторый код Ruby времени компиляции внутри исполняемого ресурса.Это не работаетВы можете использовать ресурс как обычно или использовать ruby_block.

...