2017-02-24 1 views
0

J'ai deux recettes de chef que je veux exécuter dans un ordre défini. La première est la recette d'installation, puis c'est la config.Ruby Block ne pas exécuter de code, seulement imprimer sortie

Voici le code invoquant les recettes:

ruby_block "bowbridge_config" do 
    block do 
     run_context.include_recipe "ids::bowbridge_config" 
    end 
    action :nothing 
    end 

    ruby_block "bowbridge_install" do 
    block do 
     run_context.include_recipe "sap-bowbridge::default" 
    end 
    notifies :run, 'ruby_block[bowbridge_config]', :delayed 
    end 

J'exécute avec succès la recette avant la recette d'installation de config mais quand la recette de configuration exécute uniquement les impressions sont en cours d'impression.

config Code de recette:

mcaf_lib = find_file "/opt/bowbridge/libAVB*_mcaf.so" 
    Chef::Log.info("==> bowbridge_config mcaf_lib is #{mcaf_lib}. Vsi file is #{vsi_file}") 
    bb_cfg = File.basename(find_file "/opt/bowbridge/bbvsa*.cfg") 
    Chef::Log.info("==> bowbridge_config recipe is triggered") 

# Setup bowbridge config file 
    directory "/etc/bowbridge" do 
    end 
    file "/etc/bowbridge/" + bb_cfg do 
    owner 'root' 
    group 'root' 
    mode 0755 
    content ::File.open("/opt/bowbridge/" + bb_cfg).read 
    action :create 
    end 
    Chef::Log.info("==> bowbridge_config before link creation") 
    link "/lib64/libvsa.so" do 
    to "#{mcaf_lib}" 
    end 

Le code ci-dessus montre cette sortie:

[2017-02-24T11:25:36+00:00] INFO: ruby_block[bowbridge_install] sending run action to ruby_block[bowbridge_config] (delayed) 
[2017-02-24T11:25:36+00:00] INFO: Processing ruby_block[bowbridge_config] action run (ids::default line 82) 
[2017-02-24T11:25:37+00:00] INFO: ==> bowbridge_config recipe is triggered 
[2017-02-24T11:25:37+00:00] INFO: ==> bowbridge_config before link creation 
[2017-02-24T11:25:37+00:00] INFO: ruby_block[bowbridge_config] called 

Non/etc/bowbridge est créé et aucun lien à l'intérieur/lib64 est créé. Que pourrais-je faire de mal?

+0

Si vous n'allez pas ajouter d'options spécifiques à une ressource, comme le répertoire '/ etc/bowbridge', vous n'avez pas besoin d'ajouter le bloc do/end, gardez juste quelque chose comme: 'directory '/ etc/bowbridge'' – Navarro

Répondre

1

Je ne recommanderais pas d'utiliser des blocs de rubis de cette façon, il suffit d'ajouter les recettes dans l'ordre dans lequel vous voulez que Chef les exécute. Dans ce cas:

include_recipe 'sap-bowbridge::default' 
include_recipe 'ids::bowbridge_config' 

Maintenant, si vous avez besoin des valeurs à obtenir lors de l'exécution du chef-client, vous pouvez utiliser une évaluation paresseuse. Il y a plenty of information dans le site Web de Chef.

À titre d'exemple, vérifier:

link '/lib64/libvsa.so' do 
    to lazy { find_file '/opt/bowbridge/libAVB*_mcaf.so' } 
end 

Enfin, essayez d'utiliser des guillemets simples ' ' plutôt que le double " " s'il n'y a pas besoin d'interpolation ou d'ajouter des variables au texte, également lié à cela, s'il vous plaît utilisation:

"/etc/bowbridge/#{bb_cfg}" 

plutôt que

"/etc/bowbridge/" + bb_cfg 
+0

Cela ressemble à une approche soignée, mais j'ai besoin d'utiliser # {mcaf_lib} plus tard dans un modèle de bash. Puis-je utiliser "paresseux" pour assigner des variables? Par exemple quelque chose comme, mcaf_lib paresseux {find_file '/opt/bowbridge/libAVB*_mcaf.so'} – Vladimir

+0

C'est l'un des exemples dans le lien que j'ai collé dans mon commentaire. template ' '' /tmp/canvey_island.txt faire la source 'canvey_island.txt.erb' variables ( paresseux {{ : canvey_island => node.run_state [ 'sea_power']}} ) end' – Navarro

+0

Merci @Navarro. Désolé pour la mauvaise mise en forme: bash Extrait vsi.properties 'do DWD "# {vsi_tmp}" variables ( paresseux {{ : mcaf_lib => Dir [ '/ opt/bowbridge/libAVB * _mcaf.so'] [0]}} ) Code << - EOH pot -xvf # {} vsi_file cfg/linux/vsi.properties java jar # {} vsi_file d'info -V # {} mcaf_lib -cfg cfg/linux/vsi.properties> /tmp/vsi.out EOH end' Le problème auquel je fais maintenant face est que les variables ne sont pas une méthode reconnue. Je vois que cela ne fait pas partie du modèle de bash acceptable. – Vladimir

1

Déplacer de votre bloc réelle deux rubis à ceci:

include_recipe "sap-bowbridge::default" 
include_recipe "ids::bowbridge_config" 

Vous aurez le même effet, chef honneur de l'ordre de runlist, et l'ordre d'inclusion il n'y a donc pas besoin de la plus complexe de vos deux ruby_block.

Votre code actuel s'exécutera au moment de la convergence, la recette de configuration s'exécutant tard dans la course en raison de la notification retardée. Si c'est votre besoin, écrivez un custom_resource au lieu de peaufiner autour de la liste de diffusion.

+0

Il honore l'ordre de runlist mais la phase de compilation de la recette bowbridge_config assignera des valeurs telles que "bb_cfg" qui n'existent pas à ce moment. Ce problème est défini ici https://coderanger.net/two-pass/. Le code échoue maintenant car bb_cfg n'existe pas et mcaf_lib est vide. – Vladimir

+0

Bien sûr, il n'existe pas dans le contexte ruby_block ... Comme dit dans la réponse, si vous avez besoin de variables de la recette précédente, utilisez une ressource personnalisée (et peut-être paresseuse sur ses propriétés pour remplir les valeurs). Voir le lien dans la réponse. – Tensibai

+1

(Et s'il vous plaît, ne faites pas l'ajout de texte, l'interpolation de texte entre guillemets est là pour cela: '" texte # {variable} "') – Tensibai