{{tag>microsoft azure api}}
====== Updateing Azure database firewall via Azure API ======
Via bash script. (Install "jq" tool)
#!/bin/bash
json=$(curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'client_id=xxxxxx&scope=https%3A%2F%2Fmanagement.azure.com%2F.default&client_secret=xxxxxxx&grant_type=client_credentials' 'https://login.microsoftonline.com/xxxxxxxxxxxxxxxx/oauth2/v2.0/token')
token=$(echo ${json} | jq -r '.access_token')
curl --location --request PUT 'https://management.azure.com/subscriptions/xxxxxxxxx/resourceGroups/Default-SQL-WestEurope/providers/Microsoft.Sql/servers//firewallRules/?api-version=2021-02-01-preview' --header "Authorization: Bearer ${token}" --header 'Content-Type: application/json' --data-raw '{
  "properties": {
    "startIpAddress": "",
    "endIpAddress": ""
  }
}'
Replace the "xxxxxxxx" with **client_id**, **client_secret** and **tennantId** in the first curl request. See [[wiki:connect_azure_rest_api|this]] on how to obtain them (client_id is the app_id).
In the second curl PUT request first "xxxxx" is the subscription id. Don't forget to put the correct server db name, firewall rule name and the IP range to whitelist.
To use in rundeck check this job definition:
- defaultTab: nodes
  description: 'Update or create Azure firewall whitelist rule for IP to access the
    database'
  executionEnabled: true
  id: d63d774f-1302-4ed7-aa50-cdcf1bc96810
  loglevel: INFO
  name: Azure IP whitelist
  nodeFilterEditable: false
  options:
  - label: IP address
    name: IP
    regex: ^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$
    required: true
  - description: Rule name
    label: firewallRuleName
    name: firewallRuleName
    required: true
  plugins:
    ExecutionLifecycle: null
  scheduleEnabled: true
  sequence:
    commands:
    - script: |+
        #!/bin/bash
        
        json=$(curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'client_id=xxxxxxxxxx&scope=https%3A%2F%2Fmanagement.azure.com%2F.default&client_secret=xxxxxxxxxxxxxxxxxxxxxx&grant_type=client_credentials' 'https://login.microsoftonline.com/xxxxxxxxxxxxxxxxxxxxxxx/oauth2/v2.0/token')
        token=$(echo ${json} | jq -r '.access_token')
        curl --location --request PUT 'https://management.azure.com/subscriptions/xxxxxxxxxxxxxxxxx/resourceGroups/Default-SQL-WestEurope/providers/Microsoft.Sql/servers/xxxxxxxxxxxxx/firewallRules/@option.firewallRuleName@?api-version=2021-02-01-preview' --header "Authorization: Bearer ${token}" --header 'Content-Type: application/json' --data-raw '{
          "properties": {
            "startIpAddress": "@option.IP@",
            "endIpAddress": "@option.IP@"
          }
        }'
    keepgoing: true
    strategy: node-first
  uuid: d63d774f-1302-4ed7-aa50-cdcf1bc96810
Here is an alternative to the script above using the Rundecks "HTTP Request Node Step" ([[https://docs.rundeck.com/docs/learning/howto/calling-apis.html#community-version-prerequisite|Install]] the plugin **Rundeck HTTP Workflow Step Plugin** and [[wiki:install_json_log_filter_parser_plugin_rundeck|jq filter plugin]])
- defaultTab: nodes
  description: 'Update or create Azure firewall whitelist rule for IP to access the
    database'
  executionEnabled: true
  id: c1354a3d-c0f9-4b56-a30c-ddac083d99ec
  loglevel: INFO
  name: Azure IP whitelist
  nodeFilterEditable: false
  options:
  - label: IP address
    name: IP
    regex: ^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$
    required: true
  - description: Rule name
    enforced: true
    label: firewallRuleName
    name: firewallRuleName
    required: true
    values:
    - aaa
    - bbb
    - cccc
    valuesListDelimiter: ','
  plugins:
    ExecutionLifecycle: null
  scheduleEnabled: true
  sequence:
    commands:
    - configuration:
        authentication: None
        body: client_id=xxxxxxxxxxxxxx&scope=https%3A%2F%2Fmanagement.azure.com%2F.default&client_secret=xxxxxxxxxxxxx&grant_type=client_credentials
        checkResponseCode: 'true'
        headers: |
          Content-Type: application/x-www-form-urlencoded"
        method: POST
        printResponse: 'true'
        printResponseToFile: 'false'
        proxySettings: 'false'
        remoteUrl: https://login.microsoftonline.com/xxxxxxxxxxxxxxx/oauth2/v2.0/token
        responseCode: '200'
        sslVerify: 'true'
        timeout: '30000'
      nodeStep: true
      type: edu.ohio.ais.rundeck.HttpWorkflowNodeStepPlugin
    - configuration:
        authentication: None
        body: |-
          {
            "properties": {
              "startIpAddress": "${option.IP}",
              "endIpAddress": "${option.IP}"
            }
          }'
        checkResponseCode: 'false'
        headers: |-
          Authorization: Bearer ${data.access_token}
          Content-Type: application/json
        method: PUT
        printResponse: 'true'
        printResponseToFile: 'false'
        proxySettings: 'false'
        remoteUrl: https://management.azure.com/subscriptions/xxxxxxxxxxxxxxx/resourceGroups/Default-SQL-WestEurope/providers/Microsoft.Sql/servers/xxxxxxxxxxx/firewallRules/${option.firewallRuleName}?api-version=2021-02-01-preview
        sslVerify: 'true'
        timeout: '30000'
      nodeStep: true
      type: edu.ohio.ais.rundeck.HttpWorkflowNodeStepPlugin
    keepgoing: true
    pluginConfig:
      LogFilter:
      - config:
          filter: .access_token
          logData: 'false'
          prefix: access_token
        type: json-mapper
    strategy: node-first
  uuid: c1354a3d-c0f9-4b56-a30c-ddac083d99ec
Replace the "xxxxxxxxxxx" with your values.
====== Tested on ======
  * Azure API 2022-09-02
  * Rundeck 4.5.0 
====== See also ======
  * [[wiki:connect_azure_rest_api|Connect to Azure REST API]]
  * [[wiki:connect_azure_database|Connect to Azure database]]
====== References ======