如何在Ansible中获取Azure RM存储帐户密钥?

时间:2017-03-26 10:13:37

标签: azure ansible

我正在使用Ansible创建Azure RM存储帐户,我想获取访问密钥的值,以便以后在模板中使用。这些值是在Azure端生成的。例如,我可以使用PowerShell Get-AzureStorageKey cmdlet获取它们。

但是,azure_rm_storageaccount module的返回值和使用azure_rm_storageaccount_facts module收集的事实都不包含这些键。

我想我可以使用REST API调用来获取它们(每this answer),但我必须为此任务创建一个OAuth2令牌。使用REST API,可能无法使用为Ansible定义的凭证集(即环境变量AZURE_CLIENT_IDAZURE_SECRETAZURE_SUBSCRIPTION_IDAZURE_TENANT)。

有没有办法获取这些密钥(使用已提供给Ansible的凭据)?

事实上,Ansible库似乎包含the code for fetching these keys,但它似乎也只在内部使用。

我的剧本:

---
- hosts: localhost
  connection: local

  vars:
    resource_group_name: fetchtest01
    resource_group_location: southcentralus
    storage_account: fdsahf343u2s
    storage_account_type: Standard_LRS

  tasks:
    - name: Ensure resource group "{{ resource_group_name }}" exists
      azure_rm_resourcegroup:
        name: "{{ resource_group_name }}"
        location: "{{ resource_group_location }}"

    - name: Ensure storage account "{{ storage_account }}" exists in "{{ resource_group_name }}" resource group
      azure_rm_storageaccount:
        resource_group: "{{ resource_group_name }}"
        name: "{{ storage_account }}"
        account_type: "{{ storage_account_type }}"

   - name: Fetch storage account keys
     # fetch storage_account_keys

   - name: Use the storage_account_keys.primary in a template 
     template:
       # ...

5 个答案:

答案 0 :(得分:1)

由于我没有与Ansible合作,因此我没有直接回答您的问题,因此我将解释为什么您无法使用azure_rm_storageaccount_facts模块获取存储帐户密钥。

基本上在Azure资源管理器中,您需要某些类型的权限才能执行操作。由于您可能会更新存储帐户中的数据,因此该团队在两个单独的操作中分离了获取存储帐户属性和密钥的操作。要获取属性,您将执行不会返回密钥的Get Properties操作。要获得密钥,您需要执行List Keys

我相信azure_rm_storageaccount_facts只会执行第一项操作(即获取属性),这就是您无法获取密钥的原因。我查看了所有Azure相关操作here,但找不到返回密钥的操作。

如果使用PowerShell是一个选项,那么您要使用的Cmdlet是Get-AzureRmStorageAccountKey而不是Get-AzureStorageKey,因为这是Classic存储帐户。

答案 1 :(得分:1)

这是一个bash片段,它会为您提供一个KEY。该命令返回2个键,这将为您提供其中一个键。假设你安装了jq和azure cli。

KEY=$(az storage account keys list --resource-group ${RG_NAME} --account-name ${STORAGE_NAME} | jq -r '.[].value' | head -1)

答案 2 :(得分:1)

这周,我遇到了完全相同的问题。我想要一种检索这些密钥的方法,最后最终使用了Azure服务原理和Azure REST API。如凭证https://docs.ansible.com/ansible/2.6/scenario_guides/guide_azure.html#storing-in-a-file

中所述,我将凭据存储在〜/ .azure / credentials 中。

我还使用了具有多个服务主体的azure凭据配置文件,并在命令行中指定了 AZURE_PROFILE 环境变量,如下所示:

ansible-playbook -e AZURE_PROFILE="profile-dev" -i inventories/local playbooks/azure_sas_token.yml -vvv

azure_sas_token.yml 剧本

---
- name: get sas token and storage account keys
  hosts: 127.0.0.1
  become: no

  vars:
    az_subscription_id: "{{ lookup('ini',  'subscription_id section={{ AZURE_PROFILE }}  file={{ ansible_env.HOME }}/.azure/credentials') }}"
    az_client_id: "{{ lookup('ini',  'client_id section={{ AZURE_PROFILE }}  file={{ ansible_env.HOME }}/.azure/credentials') }}"
    az_tenant_id: "{{ lookup('ini',  'tenant section={{ AZURE_PROFILE }}  file={{ ansible_env.HOME }}/.azure/credentials') }}"
    az_secret: "{{ lookup('ini',  'secret section={{ AZURE_PROFILE }}  file={{ ansible_env.HOME }}/.azure/credentials') }}"

  tasks:
    - name: get sas token through oauth2
      uri:
        url: "https://login.windows.net/{{ az_tenant_id }}/oauth2/token"
        method: POST
        body: "resource=https://management.core.windows.net&client_id={{ az_client_id }}&grant_type=client_credentials&client_secret={{ az_secret }}"
        return_content: yes
      register: sas_token_info
      no_log: true

    - name: get the storage account keys
      uri:
        url: "https://management.azure.com/subscriptions/{{ az_subscription_id }}/resourceGroups/{{ resource_group }}/providers/Microsoft.Storage/storageAccounts/{{ storage_account }}/listKeys?api-version=2016-12-01"
        method: POST
        headers:
          Authorization: "Bearer {{ sas_token_info.json.access_token }}"
        return_content: yes
      register: storage_account_keys

    - debug:
        msg: "{{ storage_account_keys.json['keys'].0.value }}"

    - debug:
        msg: "{{ storage_account_keys.json['keys'].1.value }}"

使用这两个任务,我能够获取存储帐户的密钥,然后能够自动创建文件共享并挂载CIF驱动器。

希望它可以帮助某人。

答案 3 :(得分:1)

将Azure Cli包装在任务中,

  tasks:
    - name: Retrieve storage access key
      shell: az storage account keys list --account-name {{ storage_account.name }} --resource-group {{ azure.resource_group }} --query "[0].value" --output tsv
      register: storage_access_key

现在,storage_access_key将包含所需的结果。

答案 4 :(得分:0)

现在,azure_rm_storageaccount_facts模块已支持显示该帐户的访问密钥。实际上,它可以通过在之前设置show_connection_string: true来显示连接字符串。为了方便使用,现在,通过设置show_connection_string: true,它还将包含一个名为key的字段,其中包含访问密钥。

示例可能类似于以下示例

- name: Get facts for one account
  azure_rm_storageaccount_facts:
    resource_group: myResourceGroup
    name: clh0002
    show_connection_string: true

,返回的字典将包含密钥

primary_endpoints:
{
blob:
table:
queue:
key:
}