この記事は更新から24ヶ月以上経過しているため、最新の情報を別途確認することを推奨いたします。
こんにちはDXソリューション統括部の村松です。
今回はAnsibleでAzureリソースのデプロイを行ってみようと思います。
Ansibleとはオープンソースの構成管理ツールで”Infrastructure as Code(コードによるインフラ構成)”を実装する上でよく利用されるツールです。
例えば、OS、ミドルウェアおよびネットワークの設定変更の内容をコードとして定義しておき、複数のサーバやネットワーク機器にその内容を一括で反映させることができます。
Ansibleでは、PlaybookというYAML形式のテキストファイルに定型業務をタスクとして記述し、それをAnsibleに実行させることにより、様々な処理を実現できます。
Azureを使い込んでいる人に”Infrastructure as Code(コードによるインフラ)”の話をすると、JSON形式のARMテンプレートによるリソースのデプロイを想像されるかと思います。
AnsibleにもAzure向けのモジュールが用意されていて、AzureリソースをAnsibleのPlaybookからデプロイすることができます。
今回はAnsibleの実行環境を構成し、そこから仮想マシン,仮想ネットワークといったAzureリソースをデプロイしてみましょう。
1.SPN(サービスプリンシパル)の登録
1-1.サブスクリプションが紐ついているAzure ADテナントにSPNを登録します。
1-2.以下の情報を控えておきます。
サブスクリプションID
アプリケーションID
テナントID
1-3.SPN用アプリケーションキーの発行し、以下の情報を控えておきます。
アプリケーションキー
1-4.登録したSPNに対してサブスクリプションの”共同作成者ロール”を割り当てます。
2.Ansible環境のデプロイ
2-1.AnsibleをインストールするLinuxサーバ(今回はCentOS7.4を利用)を用意します。
2-2.Linuxサーバ(CentOS7.4)にログインして、以下のコマンドを実行します。
>>sudo yum check-update; sudo yum install -y gcc libffi-devel python-devel openssl-devel epel-release
>>sudo yum install -y python-pip python-wheel
>>sudo pip install ansible[azure]
2-3.ホームディレクトリに配下に.azureというディレクトリを作成します。
>>mkdir ~/.azure
2-4.credentialsというファイルを作成します。
>>vi ~/.azure/credentials
2-5.そのファイルに次の行を挿入します。 プレースホルダーをサービス プリンシパルの値に置き換えます。
[default]
subscription_id=<1-2で控えておいたサブスクリプションID>
client_id=<1-2で控えておいたアプリケーションID>
secret=<1-3で控えておいたアプリケーションキー>
tenant=<1-2で控えておいたテナントID>
3.AnsibleからAzureリソースのデプロイ(仮想ネットワーク)
3-1.仮想ネットワーク構成用のymlファイルを作成します。
>>vi network-deploy.yml
3-2.以下のようにymlファイルにコードを記載します。
———————————————————————————————————–
- name: Create Azure Virtual Network
hosts: localhost
connection: local
vars:
rg_name: network-rg
vnet_name: vnet01
nsg_name: web-nsg
subnet_name: web-subnet
tasks:
- name: Create resource group
azure_rm_resourcegroup:
name: “{{ rg_name }}”
location: eastus
- name: Create virtual network
azure_rm_virtualnetwork:
resource_group: “{{ rg_name }}”
name: “{{ vnet_name }}”
address_prefixes: “10.6.0.0/16”
- name: Create Network Security Group
azure_rm_securitygroup:
resource_group: “{{ rg_name }}”
name: “{{ nsg_name }}”
rules:
- name: WEB
protocol: Tcp
destination_port_range: 80
access: Allow
priority: 1001
direction: Inbound
- name: Add subnet
azure_rm_subnet:
resource_group: “{{ rg_name }}”
name: “{{ subnet_name }}”
address_prefix: “10.6.1.0/24”
virtual_network: “{{ vnet_name }}”
security_group: “{{ nsg_name }}”
3-3.保存します。(:wp)
3-4.以下のコマンドを実行して、プレイブックを実行します。
>>ansible-playbook network-deploy.yml
3-5.実行すると下記のように仮想ネットワークおよび関連リソースがデプロイされます。
4.AnsibleからAzureリソースのデプロイ(仮想マシン)
4-1.仮想マシン構成用のymlファイルを作成します
>>vi vm-deploy.yml
4-2.以下のようにymlファイルにコードを記載します。
———————————————————————————————————–
- name: Create Azure Virtual Machine
hosts: localhost
connection: local
vars:
vnet_name: vnet01
nsg_name: web-nsg
subnet_name: web-subnet
rg_name: vm-rg
vm_name: WEB01
- name: Create resource group
azure_rm_resourcegroup:
name: “{{ rg_name }}”
location: eastus
- name: Create public IP address
azure_rm_publicipaddress:
resource_group: “{{ rg_name }}”
allocation_method: Static
name: “{{ vm_name }}_pip”
- name: Create virtual network interface card
azure_rm_networkinterface:
resource_group: “{{ rg_name }}”
name: “{{ vm_name }}_nic”
virtual_network: “{{ vnet_name }}”
subnet: “{{ subnet_name }}”
public_ip_name: “{{ vm_name }}_pip“
- name: Create VM
azure_rm_virtualmachine:
resource_group: “{{ rg_name }}”
name: “{{ vm_name }}”
vm_size: Standard_DS1_v2
admin_username: azureuser
admin_password: P@ssw0rd20200104
network_interfaces: “{{ vm_name }}_nic”
image:
offer: CentOS
publisher: OpenLogic
sku: ‘7.5’
version: latest
managed_disk_type: Standard_LRS
4-3.保存します。(:wp)
4-4.以下のコマンドを実行して、プレイブックを実行します。
>>ansible-playbook vm-deploy.yml
4-5.実行すると下記のように仮想マシンおよび関連リソースがデプロイされます。
これで、Ansibleから仮想マシンと仮想ネットワークがデプロイできました。
AnsibleによるAzureリソースの管理の詳細についてはは以下のドキュメントを参考にしていただければと思います。
<Azure 上の Ansible のドキュメント>
https://docs.microsoft.com/ja-jp/azure/developer/ansible/
<Azure 上の Ansible のドキュメント>
https://docs.ansible.com/ansible/latest/index.html
<Microsoft Azure Guide(AnsibleのAzure向けモジュールについてはこちら)>
以上 またの機会にお会いしましょう!