Как развернуть экземпляр Azure SQL S0 с доступной базой данных azure_rm_sql?

На этой или на прошлой неделе MS изменила параметры развертывания Azure DB по умолчанию. Наш сценарий развертывания начал создавать экземпляры Vcores общего назначения 2 вместо экземпляров S0. Я пытаюсь это исправить, но похоже, что либо документация неверна, либо я что-то делаю не так.

Наш первоначальный сценарий был таким:

  azure_rm_sqldatabase:
    resource_group: "{{ resource_group }}"
    server_name: "{{ db_server }}"
    name: "{{ item }}"
    location: "{{ location }}"
  with_items:
    - "{{ database_list }}"
  register: async_result
  async: 7200
  poll: 0

Согласно документации, это должно быть решено путем добавления 2 параметров.

  1. издание: стандартное

  2. max_size_bytes: 268435456000

но оказалось, что этого недостаточно.

Я пытался использовать create_mode или уменьшить max_size_bytes, но безуспешно.

- name: Create SQL Database for "{{ stack_name }}"
  azure_rm_sqldatabase:
    resource_group: "{{ resource_group }}"
    server_name: "{{ db_server }}"
    name: "{{ item }}"
    location: "{{ location }}"
    create_mode: default
    edition: standard
    max_size_bytes: 268435456000‬ 

Во всех случаях я получаю сообщение об ошибке:

failed: [127.0.0.1] (item = {'_ansible_parsed': True, '_ansible_item_result': True, '_ansible_item_label': u'authentication', 
u'ansible_job_id': u'701489864709.12193', 'failed': False, u'started': 1, 'changed': True, 'item': u'authentication', u'finished': 0, 
u'results_file': u'/home/vb/.ansible_async/701489864709.12193', '_ansible_ignore_errors': None, '_ansible_no_log': False}) => 
{"ansible_job_id": "701489864709.12193", "attempts": 2, "changed": false, "finished": 1, 
"item": {"ansible_job_id": "701489864709.12193", "changed": true, "failed": false, "finished": 0, "item": "authentication", 
"results_file": "/home/vb/.ansible_async/701489864709.12193", "started": 1}, "msg": 
"Error creating the SQL Database instance: 400 Client Error: 
Bad Request for url: https://management.azure.com/subscriptions/1bbba5c5-fbdb-18d7-8128-b4d403d7c6c5/resourceGroups/test_rg/providers/Microsoft.Sql/servers/testserver/databases/authentication?api-version=2014-04-01"}

Пожалуйста, дайте мне знать, что я делаю неправильно.

Обновлять: После обновления до последней версии у меня появилась еще одна ошибка:

DeserializationError: Unable to deserialize response data. Data: 268435456000‬, long, ValueError: invalid literal for long() with base 10: '268435456000\\xe2\\x80\\xac'"

Я уменьшил размер базы данных, база данных была создана, но вместо S0 она была создана как 2vcore.

Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
0
0
614
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Мне не удалось решить проблему с помощью azure_rm_sqldatabase, поэтому мне пришлось обойти ее с помощью команды bash. Если я найду лучшее решение, я обновлю этот ответ. В случае, если кто-то столкнется с такой же проблемой, вот пример кода:

- name: Create SQL Database for "{{ stack_name }}"
  command: bash -c "az sql db create --name {{ item }} --resource-group {{ resource_group }} --server {{ db_server }} --capacity 10 --edition Standard --service-objective S0"  
  with_items:
    - "{{ database_list }}"
  register: async_result
  async: 7200
  poll: 0

Как и вы, мы также испытали это. В моем случае: при создании базы данных azure sql server по умолчанию использовались вычисления общего назначения 4 (что действительно дорого). По моему опыту, мы создавали нашу базу данных, используя код t-sql:

CREATE DATABASE 'dbName'

и это создает дорогостоящие вычисления поколения 4 в Azure. Поэтому я искал некоторые документы, и, согласно документации для t-sql azure создать базу данных, у него есть аргументы для создания определенных ценовых уровней: SERVICE_OBJECTIVE, например, для вычислений S2 мы теперь используем следующий t-sql:

CREATE DATABASE 'dbName' ( EDITION = 'standard', SERVICE_OBJECTIVE = 'S2' ) ;

Теперь это работает на нас. Хотя я не знаю, как эти параметры могут быть вызваны из сценариев или командных строк, должна быть возможность отправить SERVICE_OBJECTIVE, так как это может быть отсутствующий ключ.

Ответ принят как подходящий

Мне удалось создать экземпляры S0 с помощью задачи azure_rm_resource. С помощью этой задачи вы можете делать практически все, что предлагает azure API.

Здесь операция API для создания базы данных.

На основе вашего исходного сценария он должен стать:

azure_rm_resource:
  resource_group: "{{ resource_group }}"
  resource_name: "{{ db_server }}"
  provider: SQL
  resource_type: servers
  subresource:
    - type: databases
      name: "{{item}}"
  body:
    location: "{{ location }}"
    sku:
      tier: "Standard"
      name: "S0"
      capacity: 10
    properties:
      maxSizeBytes: 2147483648
with_items:
  - "{{ database_list }}"
register: async_result
async: 7200
poll: 0

Другие вопросы по теме