创建自动化作业以使用 REST API 执行 azure runbook

Create an automation job to execute azure runbook using REST API

在此 link () I'd asked about how to create an automation account in order to create runbook. Now, that I've created an automation account and also a runbook which is published, I want to execute(start) the runbook. In order to do so I am following this link (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);
   }

我猜这个错误是由于您没有传递正确的 GUID 作为要创建的作业的作业 ID。您传递的是 8c3e715-9b27,但 GUID 的格式是 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

@Joe 猜对了

参考linkhttps://msdn.microsoft.com/en-us/library/azure/mt163849.aspx。如文件所示,

In Windows PowerShell, you can use the this command to create the job ID:[GUID]::NewGuid().ToString().

C#/.NET 中的 GUID 由函数 "System.Guid.NewGuid()" 生成。在Java 中,UUID 与GUID 相同。参考UUIDClasslinkhttp://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);
    }

如果您已正确创建 运行 图书并在请求正文中设置了正确的 运行 图书名称,代码将 运行 作为预期并响应 StatusCode 201。

但是我在你的帖子 , the element " properties/publishContentLink/uri" is required in the request body of create runbook(refer to https://msdn.microsoft.com/en-us/library/azure/mt163812.aspx) 中发现了函数 "createRunbook" 的另一个问题。

所以如果create job的response body包含信息{"code":"NotFound","message":"Runbook not found."},我建议你检查你的代码和查看 Azure 门户上的 Runbook 页面。