2017-05-03 80 views
0

這使我瘋狂,任何幫助都被大量讚賞。通過命令行將屬性傳遞給廚師

當前使用一個配方來運行一個ssh命令,從而該命令接受參數,然後使用它。

轉義字符串引號的轉義完全是瘋了;請幫助我,所以你是我唯一的幫助。 :d

這是字面上的,我需要爲我的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 

它包裹在一個命令的配方中,像這樣:

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" 

不管我如何努力和操縱字符串我不能得到輸出是正確的,它要麼刪除json中的轉義字符,要麼增加額外的字符。

我試圖echo '#{madness}'

那裏瘋狂= madness = '{\"portAttribute\":\"'+"#{portNumber}"+'\"}'

但仍沒有運氣,感謝您的幫助。

回答

1

恕我直言,你的字符串插值看起來不錯,但只要你想運行遠程計算機上運行以下命令:

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

命令應該扭捏了一點,在配方傳遞爲:

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

這工作 {\\\"attr\\\":\\\"value\\\"}'

1

你reeeeeeally可能不意味着要使用-j,那完全覆蓋任何數據的節點上已經和僅用於inital引導。之後,您不會在命令行傳遞數據,它來自Chef Server。

+0

ISN 't -j通過sdin從兒子讀入?爲了更好地解釋,我傳遞的價值來自一個集合,集合是從廚師服務器獲取的過濾數據子集,我不相信我可以用其他方式來做這件事,至少我沒有遇到。 我有很多節點,我需要過濾集合,然後遍歷該集合依次連接到每個IP地址,但踢球者是每個IP都在特定端口上有服務,這也是我傳遞的。 我正在使用一個配方來運行另一個配方,但這本身導致調用另一個作爲鎖文件的問題...... – null

+0

否-j選項將文件路徑作爲路徑。這通常只在使用舊式自注冊引導程序時(第一次運行時才使用)(通常只有在處理自動縮放系統時才需要)。 – coderanger

+0

哦,我明白了。可能你有我想要實現的另一種解決方案? ONe更優雅,破壞性更小? – null