使用 REST API 创建自动化作业以执行 azure Runbook
Posted
技术标签:
【中文标题】使用 REST API 创建自动化作业以执行 azure Runbook【英文标题】:Create an automation job to execute azure runbook using REST API 【发布时间】:2015-11-03 15:07:18 【问题描述】:在此链接 (Create azure automation account using REST api from java) 中,我询问了如何创建自动化帐户以创建运行手册。现在,我已经创建了一个自动化帐户以及一个已发布的运行手册,我想执行(启动)运行手册。为此,我正在关注此链接 (https://msdn.microsoft.com/en-us/library/azure/mt163849.aspx),但出现错误:
Server Error</h1></div>
<div id="content">
 <div class="content-container"><fieldset>
 <h2>404 - File or directory not found.</h2>
 <h3>The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable
这是java函数:
private static int processPutRequest(URL url, byte[] data, String contentType, String keyStore, String keyStorePassword)
throws UnrecoverableKeyException, KeyManagementException, KeyStoreException, NoSuchAlgorithmException, IOException
SSLSocketFactory sslFactory = getSSLSocketFactory(keyStore, keyStorePassword);
HttpsURLConnection con = null;
con = (HttpsURLConnection) url.openConnection();
con.setSSLSocketFactory(sslFactory);
con.setDoOutput(true);
con.setRequestMethod("PUT");
con.addRequestProperty("x-ms-version", "2013-08-01");
con.setRequestProperty("Content-Length", String.valueOf(data.length));
con.setRequestProperty("Content-Type", contentType);
DataOutputStream requestStream = new DataOutputStream (con.getOutputStream());
requestStream.write(data);
requestStream.flush();
requestStream.close();
System.out.println(con.getResponseMessage());
InputStream error = ((HttpURLConnection) con).getErrorStream();
BufferedReader br = null;
if (error == null)
InputStream inputstream = con.getInputStream();
br = new BufferedReader(new InputStreamReader(inputstream));
else
br = new BufferedReader(new InputStreamReader(error));
String response = "";
String nachricht;
while ((nachricht = br.readLine()) != null)
response += nachricht;
System.out.println(response);
return con.getResponseCode();
public static void createJobId(String keyStorePath, String keyStorePassword, String subscriptionId)
throws UnrecoverableKeyException, KeyManagementException, KeyStoreException, NoSuchAlgorithmException, IOException
String url = String.format("https://management.core.windows.net/%s/cloudServices/OaaSCSI6EGAZU6F6QTCK5XRVT45FKJC6RC7IQIQW3OPR7SVLE4ZPD4IQQQ-East-US/resources/automation/~/automationAccounts/xdtauto/jobs/8c3e715-9b27?api-version=2014-12-08", subscriptionId);
String requestBody = " \"properties\": \"runbook\": \"name\":\"createVM\" ";
int createResponseCode = processPutRequest(new URL(url), requestBody.getBytes(), "application/json", keyStorePath, keyStorePassword);
System.out.println("JOB created :: " + createResponseCode);
【问题讨论】:
【参考方案1】:@Joe 的猜测是正确的。
参考链接https://msdn.microsoft.com/en-us/library/azure/mt163849.aspx。如文档所示,
在 Windows PowerShell 中,您可以使用此命令来创建作业 ID:[GUID]::NewGuid().ToString().
C#/.NET 中的 GUID 由函数“System.Guid.NewGuid()”生成。在 Java 中,UUID 与 GUID 相同。参考UUID Class链接http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html,由函数“java.util.UUID.randomUUID()”生成。
所以你的代码应该修改如下:
public static void createJobId(String keyStorePath, String keyStorePassword, String subscriptionId)
throws UnrecoverableKeyException, KeyManagementException, KeyStoreException, NoSuchAlgorithmException,
IOException
String automationName = <auto_account_name>;
String jobId=java.util.UUID.randomUUID().toString();
String url = String.format(
"https://management.core.windows.net/%s/cloudServices/ OaaSCSI6EGAZU6F6QTCK5XRVT45FKJC6RC7IQIQW3OPR7SVLE4ZPD4IQQQ-East-US/resources/automation/~/automationAccounts/%s/jobs/%s?api-version=2014-12-08",
subscriptionId, automationName, jobId);
System.out.println("URL: "+url);
String requestBody = " \"properties\": \"runbook\": \"name\":\"<RUNBOOK_NAME>\" ";
int createResponseCode = processPutRequest(new URL(url), requestBody.getBytes(), "application/json",
keyStorePath, keyStorePassword);
System.out.println("JOB created :: " + createResponseCode);
如果您已正确创建 Runbook 并在请求正文中设置了正确的 Runbook 名称,代码将按预期运行并响应 StatusCode 201。
但是我在您的线程Create azure automation account using REST api from java 中发现函数“createRunbook”的另一个问题,创建运行手册的请求正文中需要元素“properties/publishContentLink/uri”(参考https://msdn.microsoft.com/en-us/library/azure/mt163812.aspx)。
因此,如果创建作业的响应正文包含信息 "code":"NotFound","message":"Runbook not found.",我建议您检查您的代码并查看 Azure Portal 上的 Runbook 页面.
【讨论】:
是的,这就像一个魅力。我已更新的运行手册代码。非常感谢您的帮助!【参考方案2】:我的猜测是错误是由于您没有传递正确的 GUID 作为要创建的作业的作业 ID。您正在传递 8c3e715-9b27
,但 GUID 的格式为 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
【讨论】:
是的,我不确定要通过什么。从哪里以及如何获取 GUID?正如我所提到的,我正在运行一个 JAVA 程序。有没有办法从 Java 以编程方式获取或创建它?以上是关于使用 REST API 创建自动化作业以执行 azure Runbook的主要内容,如果未能解决你的问题,请参考以下文章
使用 Jenkins Rest API 安排 Jenkins 作业
Azure自动化| Runbook | Powershell | Get-AzRoleAssignment | Microsoft.Rest.Azure.CloudException