2014-03-01 60 views
2

所以,我试图编写脚本在Rackspace Cloud上创建服务器。我已经能够让脚本成功创建一个服务器。虽然在创建服务器之后,我需要从输出中获取几条数据,并将它们存储在一个变量中,以便以后在同一个脚本中使用(在创建后将在新服务器上执行一些操作)。Bash存储输出变量,解析并存储一些值供以后使用

这里是我使用创建服务器脚本:

#!/bin/bash 

# Ask user to continue or not 
read -p "You are about to setup a new Rackspace cloud server. Would you like to continue (y/n)? " cont 
if [ "$cont" == "y" ]; then 
    echo "Starting server setup script..." 

    # Ask questions to get login creds 
    read -p "Rackspace Username? " username 
    read -p "Rackspace API Key? " apikey 

    # Get Rackspace token 
    echo "Getting token..." 
    token=$(curl -s -X POST https://auth.api.rackspacecloud.com/v2.0/tokens \ 
     -d '{ "auth":{ "RAX-KSKEY:apiKeyCredentials":{ "username":"'"$username"'", "apiKey":"'"$apikey"'" } } }' \ 
     -H "Content-type: application/json" \ 
     | python -m json.tool \ 
     | python -c 'import sys, json; print json.load(sys.stdin)["access"]["token"]["id"]') 
    echo "...done!" 

    # Get Rackspace account id 
    echo "Getting account id..." 
    account=$(curl -s -X POST https://auth.api.rackspacecloud.com/v2.0/tokens \ 
     -d '{ "auth":{ "RAX-KSKEY:apiKeyCredentials":{ "username":"'"$username"'", "apiKey":"'"$apikey"'" } } }' \ 
     -H "Content-type: application/json" \ 
     | python -m json.tool \ 
     | python -c 'import sys, json; print json.load(sys.stdin)["access"]["token"]["tenant"]["id"]') 
    echo "...done!" 

    # Create a new Rackspace cloud server 
    echo "Creating a new Rackspace cloud server..." 
    serverpassword=$(curl -s -X POST https://dfw.servers.api.rackspacecloud.com/v2/$account/servers \ 
     -H "Content-Type: application/json" \ 
     -H "X-Auth-Token: $token" \ 
     -H "X-Auth-Project-Id: test-project" \ 
     -T server_build.json \ 
     | python -m json.tool \ 
     | python -c 'import sys, json; print json.load(sys.stdin)["server"]["adminPass"]') 
    echo "...done!" 

    echo "Your new server has been created!" 

    read -p "Would you like to continue on to setting up your new server (y/n)? " cont2 
    if [ "$cont2" == "y" ]; then 
     exit 
    else 
     echo "Here is your root password for this server (you must write this down now): $serverpassword" 
     exit 
    fi 
else 
    echo "You have chosen not to setup a new Rackspace server." 
    exit 
fi 

你可以看到,权杖和帐户变量被设置,并在创建curl命令使用。最后curl命令的输出是这样的:(去掉实际值)

{ 
    "server": { 
     "OS-DCF:diskConfig": "AUTO", 
     "adminPass": "************", 
     "id": "************", 
     "links": [ 
      { 
       "href": "https://dfw.servers.api.rackspacecloud.com/v2/...", 
       "rel": "self" 
      }, 
      { 
       "href": "https://dfw.servers.api.rackspacecloud.com/...", 
       "rel": "bookmark" 
      } 
     ] 
    } 
} 

我希望能够既adminPassid存储在两个不同的变量。我怎样才能做到这一点?我也知道通过解决这个问题,我将能够通过使用一个curl命令而不是两个不同的值来获得tokenaccount值时重构脚本。

感谢您的帮助!

+0

从提示读取'adminpass'和'id'吗? – MLSC

+1

我的问题可能是措辞错误。 'adminPass'和'id'是curl命令输出中的值。我只是在描述他们,因为我不想在这里发布信息。我想要做的就是获取该输出并将这两个值存储在两个单独的变量中。类似于'python -c'import sys,json;打印json.load(sys.stdin)[“access”] [“token”] [“id”]''获得上述'token'的行。那有意义吗? – ryanpitts1

+0

是的,谢谢你... – MLSC

回答

0

可以抢在新变量输出和存储adminpassid

var1=$(grep "adminPass" output.txt | cut -d: --complement -f1) 
var2=$(grep "id" output.txt | cut -d: --complement -f1) 

echo -e $var1 
echo -e $var2 

这里我假设你重定向到output.txt文件中的第三个命令的输出。

+0

我如何使用这个或类似的东西来消除对第二个curl命令的需要。你可以看到curls获得'[“access”] [“token”] [“id”]'和'[“access”] [“token”] [“tenant”] [“id”]'是相同但只是从json输出获得不同的值。我可以将这些结合起来吗?也许让curl命令在变量中存储'[“access”] [“token”]',然后从该变量中获得'[“id”]'和'[“tenant”] [“id”]'(通过grep或者其他的东西)? – ryanpitts1

1

我欣赏所有的帮助。我能够弄清楚我需要做什么。也许我原来的问题并不是为了得到最好的答案,而是希望这个决议能够更好地解释我正在努力完成的事情。

我结束了使用第三curl命令,这些命令和设置我需要的变量:

serverinfo=$(curl -s https://dfw.servers.api.rackspacecloud.com/v2/731174/servers \ 
    -X POST \ 
    -H "Content-Type: application/json" \ 
    -H "X-Auth-Token: $token" \ 
    -H "X-Auth-Project-Id: test-project" \ 
    -T server_build.json | python -m json.tool) 

serverpass=$(echo $serverinfo | python -c 'import sys, json; print json.load(sys.stdin)["server"]["adminPass"]') 

这让我运行curl命令来设置服务器,然后从输出抢adminPass并将其设置为serverpass变量供以后使用。

使用这个概念我也能够删除第二个curl命令,因为它是一个重复的命令只是为了设置一个变量。我现在可以使用这些命令来一次擦卷曲和设置从它的输出两个变量:

tokensinfo=$(curl -s -X POST https://auth.api.rackspacecloud.com/v2.0/tokens \ 
    -d '{ "auth":{ "RAX-KSKEY:apiKeyCredentials":{ "username":"'"$username"'", "apiKey":"'"$apikey"'" } } }' \ 
    -H "Content-type: application/json") 

token=$(echo $tokensinfo | python -c 'import sys, json; print json.load(sys.stdin)["access"]["token"]["id"]') 
account=$(echo $tokensinfo | python -c 'import sys, json; print json.load(sys.stdin)["access"]["token"]["tenant"]["id"]') 

希望这更好的解释了什么是我要的。感谢您的帮助,它确实帮助我解决了这个问题。