0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Ansibleを使ってアリババクラウドリソースを作成する方法

Posted at

この記事では、Ansibleを使ってAnsible Alicloudモジュールを使ってAlibaba Cloudのリソースを作成する方法を紹介します。

本ブログは英語版からの翻訳です。オリジナルはこちらからご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。

ソリューションアーキテクト、フィリップ・チョイ著

はじめに

Ansibleは、市場に出回っているDevOpsツールの1つであり、開発者や運用者の間で広く採用されています。本ドキュメントでは、Ansibleのプレイブックを利用してElastic Compute Service (ECS)インスタンスを作成するなど、Ansibleを利用してAlibaba Cloud Resourcesをプロビジョニングする方法を解説します。

プロビジョニング方法の比較

一般的に、Alicloudはユーザーがクラウドリソースを管理するために、Web Console、CLI、言語固有のSDK、RawAPIの4つの方法を提供しています。それぞれの方法には、使いやすさや自動化機能の面で長所と短所があります。以下のマトリックスでは、それぞれの長所と短所を説明しています。AnsibleはCLIとSDKの中間のようなもので、使いやすさや自動化機能の面でも優れています。

Medium User friendliness Automation Capability Product Coverage
Console Anyone, intuitive No way All
CLI Probably OK, for experienced sysadmin Works, but not perfect ECS/VPC/RDS/SLB/Storage
Ansible Probably OK, for experienced sysadmin who can script Better than CLI and more manageable ECS/VPC/RDS/SLB/Storage
SDK Probably OK, for experienced developer Flexible, but quite a bit of effort All
Raw API Not user friendly at all Very capable, but extensive effort All

Ansibleとは何か、そしてどのようにIaaSとクラウドをサポートしているのか?

AnsibleはIaaSの自動化の分野で広く使われているDevOpsツールの一つです。Ansible を使うことで、システム管理者や開発者はインフラをコードとして維持することができ、VMware のような伝統的なベンダーから Alibaba Cloud のような最新のクラウドベンダーまで、IaaS をサポートしています。以下に、市場における他のクラウドベンダーのサポートにおける Ansible の能力を比較したマトリックスを示します。

image.png

テスト環境の設定

環境設定の概要を説明します。それが終わったら、次に例題を実行してansibleでECSインスタンスを作成します。

1、Ansibleをインストール
2、Alicloud ansible-providerをインストール

Ansible のインストール

詳しくは公式ドキュメントを参照してください。私の場合は、CentOS 7のサーバーを使ってAnsibleをインストールしています。以下のコマンドで行うことができます。

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

Alicloud Ansibleモジュールのインストール

デフォルトでは Ansible には Alicloud モジュールが搭載されていないため、Alicloud リソースをプロビジョニングするにはこのモジュールが必要になります。モジュールをインストールするには、https://github.com/alibaba/ansible-provider で説明されている手順に従ってください。

次のコマンドを実行して、CentOS 7マシンにモジュールをインストールします。

yum -y install python2-pip
pip install ansible_alicloud

例を見てみましょう

プレイブックの定義

プレイブックは、我々が作成したいリソースを含むテンプレートです。以下のURLからテンプレートの例を見つけることができます: http://philipchoi-test.oss-cn-hongkong.aliyuncs.com/example.yml

結果の実行

プレイブックを実行するには、次のコマンドを使用します。

ansible-playbook $FILENAME.yml

ここでシミュレーションをしてみました。

image.png

そして、ウェブコンソールからは、インスタンスが作成されていることがわかります。

image.png

また、プレイブックにあるように、WebサーバのインストールとWebページの作成を定義したので、ページの取得もできるようになりました。

image.png

プレイブック実行中のコマンドエラー

NTPタイムラグ

Ansibleのプレイブックを実行しているノードに大きなタイムラグが発生した場合、以下のようなエラーが発生することがあります。この問題を解決するには、タイムラグが発生しないようにntpサーバと時計を同期させてください。

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

付録

プレイブックの例

この例では、ECSインスタンスを1つ作成します(または複数のインスタンスを作成します。プレイブックの "count "変数にどれだけの数を入れたかによります)。ただし、自分で入力する必要があります。

1、アクセスキーとシークレットキーのペア
2、あらかじめセキュリティグループを作成し、セキュリティグループIDを指定する
3、事前に ssh-keypair を作成し、ssh-keypair ID を指定します。
4、あらかじめVPCを作成し、vswitch IDを指定します。

- 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 }}

VPCを作成するタスク定義例

この例のタスクでは、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 }}'

RDSを作成するタスク定義の例

この例のタスクでは、RDSを作成します。

- name: create rds instance
  hosts: localhost
  vars:
    alicloud_access_key: <your-alicloud-access-key-id>
    alicloud_secret_key: <your-alicloud-access-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

SLBを作成するタスク定義の例

この例のタスクはSLBを作成します。

- name: create server load balancer
  hosts: localhost
  connection: local
  vars:
    alicloud_region: cn-beijing
    alicloud_access_key: <your-alicloud-access-key-id>
    alicloud_secret_key: <your-alicloud-access-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 }}'

VPC、RDS、ECSを作成するためのスケルトンの例

1つのプレイブックでVPC、RDS、ECSを作成するためのスケルトンの例(注意:上記の各例を接着剤で接着して1つのプレイブックを作成する必要があります。)

- name: create server stack
  hosts: localhost
  connection: local
  vars:
    alicloud_region: cn-beijing
    alicloud_access_key: <your-alicloud-access-key-id>
    alicloud_secret_key: <your-alicloud-access-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 ..

アリババクラウドは日本に2つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
アリババクラウドジャパン公式ページ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?