2017-05-03 1 views
0

Cela me rend fou, toute aide est massivement appréciée.Passer des attributs au chef via la ligne de commande

Actuellement en utilisant une recette pour exécuter une commande ssh par laquelle la commande prend en args et l'utilise ensuite.

L'échappement des guillemets string est littéralement m'envoyer un fou; Aidez-moi s'il vous plaît SO, vous êtes ma seule aide. : D

Ceci est la chaîne littérale que j'ai besoin pour mon ssh:

ssh -i /home/ec2-user/.ssh/Test-Key.pem -o StrictHostKeyChecking=no [email protected] echo '{\"attr\":\"value\"}' | sudo chef-client -o solr-restart -j /dev/stdin 

il est enveloppé dans une commande dans la recette comme ceci:

command "ssh -i /home/ec2-user/.ssh/Test-Key.pem -o StrictHostKeyChecking=no [email protected] echo '{\"attr\":\"value\"}' | sudo chef-client -o solr-restart -j /dev/stdin" 

peu importe comment j'essayer et de manipuler la chaîne je ne peux pas obtenir la sortie pour être correcte, elle enlève les caractères échappés dans le json, ou ajoute dans les supplémentaires.

J'ai essayé de echo '#{madness}'

où la folie = madness = '{\"portAttribute\":\"'+"#{portNumber}"+'\"}'

mais toujours pas de chance, merci pour toute aide.

Répondre

1

IMHO votre interpolation de chaîne semble bien, mais que vous voulez exécuter la commande suivante sur la machine distante:

echo '{\"portAttribute\":\"#{portNumber}\"}' | sudo chef-client -o solr-restart -j /dev/stdin 

commande devrait peaufiné un peu plus et être passé dans la recette comme:

command "ssh -i /home/ec2-user/.ssh/Test-Key.pem -o StrictHostKeyChecking=no [email protected] 'echo \'{\\\"portAttribute\\\":\\\"#{portNumber}\\\"}\' | sudo chef-client -o solr-restart -j /dev/stdin' " 
1

Cela fonctionne {\\\"attr\\\":\\\"value\\\"}'

1

Vous reeeeeeally probablement ne pas dire à l'aide -j, qui écrase totalement toutes les données est sur le noeud déjà et est uniquement destiné à bootstrapping inital. Après cela, vous ne transmettez pas de données sur la ligne de commande, cela provient de Chef Server.

+0

ISN 't -j lire à partir de fils via le sdin? Pour mieux expliquer, la valeur que je passe en vient former une collection, cette collection est un sous-ensemble filtré de données prises à partir du serveur chef, je ne crois pas que je peux faire le séjour d'une autre façon, du moins pas que j'ai rencontrer. J'ai beaucoup de noeuds, j'ai besoin de filtrer l'ensemble et puis itérer à travers cet ensemble se connectant à chaque adresse ip à son tour, mais le pointeur est que chaque ip a un service sur un port particulier, qui est ce que je passe aussi . J'utilise une recette pour en exécuter une autre mais cela en soi cause des problèmes avec l'invocation d'une autre comme fichier de verrouillage ... – null

+0

Non, l'option -j prend un chemin d'accès à un fichier. Ceci est généralement utilisé uniquement lors de la première exécution lors de l'utilisation de l'ancien bootstrap d'auto-enregistrement (qui n'est généralement nécessaire que pour les systèmes de mise à l'échelle automatique de nos jours). – coderanger

+0

oh je vois. Auriez-vous une solution alternative pour ce que j'essaie de réaliser? ON est-ce plus élégant et moins destructeur? – null