So stellen Sie Alibaba Cloud-Ressourcen mit Ansible bereit

Von Philip Choi, Lösungsarchitekt

In diesem Artikel erfahren Sie, wie Sie mit Ansible über das Ansible Alicloud-Modul Alibaba Cloud-Ressourcen erstellen.

Einführung

Ansible ist eines der DevOps-Tools, die auf dem Markt erhältlich sind und bei Entwicklern und Betreibern weit verbreitet sind. In diesem Dokument wird beschrieben, wie Sie mithilfe von Ansible Alibaba Cloud-Ressourcen bereitstellen können, z. B. mithilfe eines Ansible-Wiedergabebuchs eine Elastic Compute Service (ECS) -Instanz erstellen.

Vergleich der Bereitstellungsmethoden

Im Allgemeinen bietet Alicloud 4 Möglichkeiten, mit denen Benutzer ihre Cloud-Ressourcen verwalten können, nämlich Webkonsole, CLI, sprachspezifisches SDK und RawAPI. Jede Methode hat ihre eigenen Vor- und Nachteile in Bezug auf Benutzerfreundlichkeit oder Automatisierungsfähigkeit. In der folgenden Matrix werden die Vor- und Nachteile der einzelnen Methoden beschrieben. Ansible ist etwas zwischen CLI und SDK in Bezug auf Benutzerfreundlichkeit sowie Automatisierungsfähigkeit.

MittelBenutzerfreundlichkeitAutomatisierungsfähigkeitProduktabdeckungKonsoleAlle, auf keinen Fall intuitivAlle, wahrscheinlich in Ordnung, für erfahrene SysadminWorks, aber nicht perfektECS / VPC / RDS / SLB / StorageAnsibleWahrscheinlich in Ordnung, für erfahrene Sysadmin, die in der Lage sind, Besseres als CLI und verwaltbareECS / SLDKB / VPC-Entwickler in Ordnung / R , aber ziemlich viel AufwandAllRaw APINicht benutzerfreundlich bei allSehr fähig, aber umfangreicher AufwandAll

Was ist einsehbar und wie unterstützt es IaaS und die Cloud?

Wie bereits erwähnt, ist Ansible eines der DevOps-Tools, die im Bereich der IaaS-Automatisierung weit verbreitet sind. Damit können Systemadministratoren oder Entwickler ihre Infrastruktur als Code verwalten und IaaS von herkömmlichen Anbietern wie VMware bis hin zu modernen Cloud-Anbietern wie Alibaba Cloud unterstützen. Nachfolgend finden Sie eine Vergleichsmatrix zu den Möglichkeiten von Ansible, andere Cloud-Anbieter auf dem Markt zu unterstützen.

Einrichten der Testumgebung

Hier ist die Übersicht über das Einrichten der Umgebung. Danach können wir das Beispiel ausführen, um eine ECS-Instanz über ansible zu erstellen.

  1. Ansible installiert haben
  2. Habe Alicloud Ansible-Provider installiert

Installieren Sie Ansible

Einzelheiten entnehmen Sie bitte der offiziellen Dokumentation. In meinem Fall verwende ich einen CentOS 7-Server, um den Ansible zu installieren. Sie können dies mit dem folgenden Befehl tun.

yum -y install \ https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 
yum -y install ansible

Installieren Sie das Alicloud Ansible-Modul

Standardmäßig wird Ansible nicht mit dem Alicloud-Modul ausgeliefert. Um Alicloud-Ressourcen bereitzustellen, benötigen wir dieses Modul. Befolgen Sie zum Installieren des Moduls die unter https://github.com/alibaba/ansible-provider beschriebenen Schritte

Führen Sie den folgenden Befehl aus, um das Modul auf einem CentOS 7-Computer zu installieren.

 yum -y install python2-pip 
pip install ansible_alicloud

Führen Sie ein Bereitstellungsbeispiel durch

Definiere das Playbook

Playbook ist die Vorlage, die die Ressourcen enthält, die wir erstellen möchten. Die Beispielvorlage finden Sie unter folgender URL: http://philipchoi-test.oss-cn-hongkong.aliyuncs.com/example.yml

Führen Sie die Ergebnisse aus

Verwenden Sie den folgenden Befehl, um das Playbook auszuführen

 ansible-playbook $FILENAME.yml 

Hier ist ein Simulationslauf.

Über die Webkonsole können wir sehen, dass die Instanz erstellt wurde.

Da wir in unserem Playbook die Installation des Webservers und die Erstellung der Webseite definiert haben, können wir jetzt auch die Seite abrufen.

Befehlsfehler während der Ausführung des Playbooks

NTP-Zeitverzögerung

Wenn der Knoten, auf dem das Ansible-Playbook ausgeführt wird, eine erhebliche Zeitverzögerung aufweist, kann der folgende Fehler auftreten. Um das Problem zu beheben, synchronisieren Sie die Uhr mit dem ntp-Server, um Verzögerungen zu vermeiden.

 TASK [make sure ingress port 22 and 80 are allowed] ****************************************************************************************************************************************************** 
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Error in get_all_security_groups: ECSResponseError: , HTTP Status: 400 Error:IllegalTimestamp The input parameter \"Timestamp\" that is mandatory for processing this request is not supplied. RequestID: 9FAC5E19-46E3-4A72-A879-422A691585BC,\nNone"}
to retry, use: --limit @/root/test.retry

Blinddarm

Beispiel Playbook

In diesem Beispiel wird eine ECS-Instanz erstellt (oder es werden mehrere Instanzen erstellt, je nachdem, wie viel Nummer Sie in die Variable “count” im Playbook eingegeben haben). Sie müssen jedoch Ihre eigenen Daten eingeben:

  1. Zugriffsschlüssel und geheimes Schlüsselpaar
  2. Erstellen Sie die Sicherheitsgruppe im Voraus und geben Sie die Sicherheitsgruppen-ID an
  3. Erstellen Sie das SSH-Schlüsselpaar im Voraus und geben Sie die SSH-Schlüsselpaar-ID an
  4. Erstellen Sie die VPC im Voraus und geben Sie die vswitch-ID an
 - name: basic provisioning example 
hosts: localhost
vars:
alicloud_access_key: YOUR_ACCESS_KEY_HERE # replace it with your Alicloud Access Key
alicloud_secret_key: YOUR_SECRET_KEY_HERE # replace it with your Alicloud Secret Key
alicloud_region: cn-hongkong # replace it with the region you plan to use
image: centos_7_02_64_20G_alibase_20170818.vhd # replace it with the image to use
instance_type: ecs.n4.small # replace it with the flavor type
vswitch_id: vsw-YOUR_VSWITCH_ID_HERE # replace it with the Vswitch ID
assign_public_ip: True # set to false in case you dont need public ip
max_bandwidth_out: 10
host_name: PREFERRED_HOSTNAME # hostname
system_disk_category: cloud_efficiency
system_disk_size: 50
internet_charge_type: PayByTraffic
group_id: sg-YOUR_SG_ID_HERE # replace with the security-group-id
sg_action: join
key_name: SSH_KEY_NAME # replace with the ssh key
count: 2 # number of instances to create
user_data: |
#!/bin/sh
yum -y install httpd
systemctl start httpd
echo "Server Up at $(date -R)!" | tee /var/www/html/index.html
  tasks: 
- name: make sure ingress port 22 and 80 are allowed
alicloud_security_group:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
group_id: '{{ group_id }}'
alicloud_region: '{{ alicloud_region }}'
rules:
- ip_protocol: tcp
port_range: 22/22
source_cidr_ip: '0.0.0.0/0'
policy: accept
- ip_protocol: tcp
port_range: 80/80
source_cidr_ip: '0.0.0.0/0'
policy: accept
  - name: launch ECS instance in VPC network 
alicloud_instance:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
image: '{{ image }}'
system_disk_category: '{{ system_disk_category }}'
system_disk_size: '{{ system_disk_size }}'
instance_type: '{{ instance_type }}'
vswitch_id: '{{ vswitch_id }}'
assign_public_ip: '{{ assign_public_ip }}'
internet_charge_type: '{{ internet_charge_type }}'
max_bandwidth_out: '{{ max_bandwidth_out }}'
group_id: '{{ group_id }}'
key_name: '{{ key_name }}'
host_name: '{{ host_name }}'
#password: '{{ password }}'
user_data: '{{ user_data }}'
count: '{{ count }}'
instance_tags:
Name: created_through_ansible
register: status
  - name: Poll instance information 
alicloud_instance_facts:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
instance_ids: '{{ status.instance_ids }}'
register: all_instances
  - set_fact: 
instances_info: []
  - set_fact: 
instances_info: "{{ instances_info + [ { 'id': item.id, 'host_name': item.host_name, 'public_ip': item.public_ip }] }}"
with_items: "{{ all_instances.instances }}"
no_log: true

- name: print instance information
debug:
msg: "ECS instance {{ item.host_name }} created, id: {{ item.id }}. IP: {{ item.public_ip }} . URL http://{{ item.public_ip }}/"
with_items: "{{ instances_info }}

Beispielaufgabendefinition zum Erstellen einer VPC

Diese Beispielaufgabe erstellt eine VPC.

 - name: create vpc 
hosts: localhost
connection: local
vars:
alicloud_access_key: YOUR_ACCESS_KEY_HERE # replace it with your Alicloud Access Key
alicloud_secret_key: YOUR_SECRET_KEY_HERE # replace it with your Alicloud Secret Key
alicloud_region: cn-hongkong
state: present
cidr_block: 192.168.0.0/16
vpc_name: Demo_VPC
description: Demo VPC
tasks:
- name: create vpc
alicloud_vpc:
alicloud_region: '{{ alicloud_region }}'
state: '{{ state }}'
cidr_block: '{{ cidr_block }}'
vpc_name: '{{ vpc_name }}'
description: '{{ description }}'

Beispielaufgabendefinition zum Erstellen von RDS

Diese Beispielaufgabe erstellt ein RDS.

 - name: create rds instance 
hosts: localhost
vars:
alicloud_access_key:
alicloud_secret_key:
alicloud_region: cn-beijing
tasks:
- name: create instance
alicloud_rds_instance:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
state: present
engine: MySQL
engine_version: 5.6
instance_class: rds.mysql.t1.small
instance_storage: 30
instance_net_type: Internet
security_ips: 10.23.12.24/24
instance_charge_type: Postpaid

Beispiel Aufgabendefinition zum Erstellen eines SLB

Diese Beispielaufgabe erstellt einen SLB.

 - name: create server load balancer 
hosts: localhost
connection: local
vars:
alicloud_region: cn-beijing
alicloud_access_key:
alicloud_secret_key:
load_balancer_name: demo_slb
internet_charge_type: paybytraffic
state: present
tasks:
- name: create server load balancer
alicloud_slb_lb:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
load_balancer_name: '{{ load_balancer_name }}'
internet_charge_type: '{{ internet_charge_type }}'
state: '{{ state }}'

Beispielskelett zum Erstellen von VPC, RDS und ECS

Ein Beispielskelett zum Erstellen von VPC, RDS und ECS in einem Wiedergabebuch

 - name: create server stack 
hosts: localhost
connection: local
vars:
alicloud_region: cn-beijing
alicloud_access_key:
alicloud_secret_key:
.. line skipped ..
tasks:
- name: create VPC
alicloud_vpc:
.. line skipped ..
  - name: create RDS 
alicloud_rds_instance:
.. line skipped ..
  - name: create ECS 
alicloud_instances:
.. line skipped ..

Referenz: https://www.alibabacloud.com/blog/how-to-provision-alibaba-cloud-resources-with-ansible_594449? Spm = a2c41.12559950.0.0