我正在使用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_ID
,AZURE_SECRET
,AZURE_SUBSCRIPTION_ID
,AZURE_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:
# ...
答案 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:
}