使用URL中的node.chef_environment调用Chef Recipe API

时间:2017-04-11 11:01:33

标签: json ruby chef chef-recipe

尝试进行API调用,该调用需要URL中的node.chef_environment

我无法让require 'net/http' require 'json' response = Net::HTTP.get URI('http://1.1.1.1:81/terra/v2/terraform/get/%{node.chef_environment}') octocat = JSON.parse response octocat.keys ip = octocat['terraform']['modules'][0]['outputs']['public_ip_address']['value'][0] log ip 部分在我的厨师食谱中工作,有什么帮助吗?

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$dir = '/home/kevinpirnie/www';

$GLOBALS['I'] = 0; // root folder given index 0

function dirToArray( $dir , $parent) {
    $result = array();
    $cdir = scandir($dir);
    foreach ($cdir as $key => $value) {
        if (!in_array($value, array(".", "..")))  {
            if (is_dir($dir . DIRECTORY_SEPARATOR . $value)){

                $result[$value] = [++$GLOBALS['I']]; // add folder index
                $result[$value][] = $parent; // add parent folder index

                $result[$value][] = dirToArray($dir . DIRECTORY_SEPARATOR . $value, $GLOBALS['I']);
            } else {
                $result[] = $value;
            }
        }
    }
    return $result;
}

$res = dirToArray($dir, $GLOBALS['I']);

echo '<hr />';
echo '<pre>';
print_r($res);
echo '</pre>';
echo '</pre>';

任何帮助或建议都会很棒

问候

2 个答案:

答案 0 :(得分:1)

好的,所以有一些事情,首先是字符串。 Ruby使用#{}进行字符串插值,但它必须在双引号内,而不是单引号。 %{}格式化也是一个东西,但它用于Ruby版本的printf的一些时髦的东西,并不是你想要的。所以我们一起得到"http://1.1.1.1:81/terra/v2/terraform/get/#{node.chef_environment}"字符串。

其次,Chef包含一个HTTP客户端,您通常应使用而不是来自Chef代码中的Net::HTTP。在这种情况下:

octocat = Chef::HTTP::SimpleJSON('http://1.1.1.1:81/').get("/terra/v2/terraform/get/#{node.chef_environment}")

使用更快的JSON库Chef(ffi-yajl)来处理重定向,瞬态失败和JSON解码等问题。

答案 1 :(得分:-2)

简单如

response = Net :: HTTP.get URI(&#34; http://1.1.1.1:81/terra/v2/terraform/get/&#34; + node.chef_environment)