четверг, 16 января 2020 г.

CloudFormation и установка ПО после настройки инфраструктуры


Все действия производятся в блоке UserData, так или иначе. А теперь по порядку, что там может быть

Обязательно начинаем с док
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-userdata

1) Простой баш скрипт где всё нужное. Быстро, но со своими особенностями вроде сложности обработки ошибок.
https://github.com/hashicorp/consul-ec2-auto-join-example/blob/master/templates/consul.sh.tpl#L5



2) Несколько более сложный вариант, где файлы и ещё некоторые вещи описываются не в баше
https://github.com/netbears/consul-cluster-aws/blob/master/cloudformation-template.yaml#L346
всё прямо в юзердате
!!! Архиважно
The #cloud-config line at the top is required in order to identify the commands as cloud-init directives.
То есть для корректной работы (и чуть иного синтаксиса) тэг #cloud-config обязателен.
Подробнее и примеры в первом линке.

!!! User data is limited to 16 KB.
Возможностей - море
https://cloudinit.readthedocs.io/en/latest/topics/examples.html

3) Также, есть возможность описать многие вещи в отдельном блоке Metadata, но с ним есть особенность - этот блок читает отдельная утилита cfn-init
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-init.html
Тогда появляется такой блок
    Type: "AWS::AutoScaling::LaunchConfiguration"
    Metadata:
        Comment: Create nodes
        AWS::CloudFormation::Init:
          config:
            files:
И далее описание файлов, конфигов и прочего. Но в этом случае в UserData обязательно добавлять cfn-init
            cfn-init -v --stack ${AWS::StackName} --resource ConsulClientLC --configsets cs_install --region ${AWS::Region} || cfn_fail
Подробнее можно увидеть например тут
https://github.com/aws-quickstart/quickstart-hashicorp-consul/blob/develop/templates/quickstart-hashicorp-consul.template#L930
ну и линк выше.
Но, утилита достаточно сомнительна. Для её использования необходимо поставить git, сделать клонирование, поставить питон, подготовить всё... А ещё оно принудительно обновляет все пакеты до последних версий, что не всегда применимо.
А ещё прикол в том, что можно создать симлинк в files, но невозможно - директорию, поэтому нужно разбираться с command и возможно ConfigSets.

4) Взять систему управления конфигурациями (configuration management system, CMS), типа ansible, chef, salt...

Помним, что управление софтом через UserData имеет нюанс, любые изменения там - и машина будет выкачена через delete-create! В этом плане лучше всего совместить с человеческими CMS.

Также можно почитать
http://fbrnc.net/blog/2015/11/how-to-provision-an-ec2-instance

Комментариев нет:

Отправить комментарий