Tutorial: Configure apps in Azure App Service using Ansible
Important
Ansible 2.7 (or later) is required to run the sample playbooks in this article.
Azure App Service enables you to build and host code. This code can be in the form of web apps, mobile backends, and RESTful APIs. Using App Service, you can develop you code using the programming language of your choice without managing infrastructure. App Service supports both Windows and Linux. Automated deployments from any Git repo are supported, including GitHub and Azure DevOps.
In this article, you learn how to:
- Create an app in Azure App Service with Java 8 and the Tomcat container runtime
- Create an Azure Traffic Manager profile
- Define a Traffic Manager endpoint using the created app
Prerequisites
- Azure subscription: If you don't have an Azure subscription, create a free account before you begin.
Install Ansible: Do one of the following options:
- Install and configure Ansible on a Linux virtual machine
- Configure Azure Cloud Shell and - if you don't have access to a Linux virtual machine - create a virtual machine with Ansible.
Create a basic app service
The playbook code in this section defines the following resources:
- Azure resource group within which the App Service plan and app are deployed
- App service on Linux with Java 8 and the Tomcat container runtime
Save the following playbook as firstwebapp.yml
:
- hosts: localhost
connection: local
vars:
resource_group: myResourceGroup
webapp_name: myfirstWebApp
plan_name: myAppServicePlan
location: eastus
tasks:
- name: Create a resource group
azure_rm_resourcegroup:
name: "{{ resource_group }}"
location: "{{ location }}"
- name: Create App Service on Linux with Java Runtime
azure_rm_webapp:
resource_group: "{{ resource_group }}"
name: "{{ webapp_name }}"
plan:
resource_group: "{{ resource_group }}"
name: "{{ plan_name }}"
is_linux: true
sku: S1
number_of_workers: 1
frameworks:
- name: "java"
version: "8"
settings:
java_container: tomcat
java_container_version: 8.5
Run the playbook using ansible-playbook
ansible-playbook firstwebapp.yml
After running the playbook, you see output similar to the following results:
PLAY [localhost]
TASK [Gathering Facts]
ok: [localhost]
TASK [Create a resource group]
changed: [localhost]
TASK [Create App Service on Linux with Java Runtime]
[WARNING]: Azure API profile latest does not define an entry for WebSiteManagementClient
changed: [localhost]
PLAY RECAP
localhost : ok=3 changed=2 unreachable=0 failed=0
Create an app and use Azure Traffic Manager
Azure Traffic Manager enables you to control how requests from web clients are distributed to apps in Azure App Service. When App Service endpoints are added to an Azure Traffic Manager profile, Traffic Manager tracks the status of your App Service apps. Statuses include running, stopped, and deleted. Traffic Manager is used to decide which endpoints should receive the traffic.
In App Service, an app runs in an App Service plan. An App Service plan defines a set of compute resources for an app to run. You can manage your App Service plan and web app in different groups.
The playbook code in this section defines the following resources:
- Azure resource group within which the App Service plan is deployed
- App Service plan
- Azure resource group within which the app is deployed
- App service on Linux with Java 8 and the Tomcat container runtime
- Traffic Manager profile
- Traffic Manager endpoint using the created app
Save the following playbook as webapp.yml
:
- hosts: localhost
connection: local
vars:
resource_group_webapp: myResourceGroupWebapp
resource_group: myResourceGroup
webapp_name: myLinuxWebApp
plan_name: myAppServicePlan
location: eastus
traffic_manager_profile_name: myTrafficManagerProfile
traffic_manager_endpoint_name: myTrafficManagerEndpoint
tasks:
- name: Create resource group
azure_rm_resourcegroup:
name: "{{ resource_group_webapp }}"
location: "{{ location }}"
- name: Create secondary resource group
azure_rm_resourcegroup:
name: "{{ resource_group }}"
location: "{{ location }}"
- name: Create App Service Plan
azure_rm_appserviceplan:
resource_group: "{{ resource_group }}"
name: "{{ plan_name }}"
location: "{{ location }}"
is_linux: true
sku: S1
number_of_workers: 1
- name: Create App Service on Linux with Java Runtime
azure_rm_webapp:
resource_group: "{{ resource_group_webapp }}"
name: "{{ webapp_name }}"
plan:
resource_group: "{{ resource_group }}"
name: "{{ plan_name }}"
is_linux: true
sku: S1
number_of_workers: 1
app_settings:
testkey: "testvalue"
frameworks:
- name: java
version: 8
settings:
java_container: "Tomcat"
java_container_version: "8.5"
- name: Get web app facts
azure_rm_webapp_facts:
resource_group: "{{ resource_group_webapp }}"
name: "{{ webapp_name }}"
register: webapp
- name: Create Traffic Manager Profile
azure_rm_trafficmanagerprofile:
resource_group: "{{ resource_group_webapp }}"
name: "{{ traffic_manager_profile_name }}"
location: global
routing_method: performance
dns_config:
relative_name: "{{ traffic_manager_profile_name }}"
ttl: 60
monitor_config:
protocol: HTTPS
port: 80
path: '/'
- name: Add endpoint to traffic manager profile, using created web site
azure_rm_trafficmanagerendpoint:
resource_group: "{{ resource_group_webapp }}"
profile_name: "{{ traffic_manager_profile_name }}"
name: "{{ traffic_manager_endpoint_name }}"
type: azure_endpoints
location: "{{ location }}"
target_resource_id: "{{ webapp.webapps[0].id }}"
Run the playbook using ansible-playbook
ansible-playbook webapp.yml
After running the playbook, you see output similar to the following results:
PLAY [localhost]
TASK [Gathering Facts]
ok: [localhost]
TASK [Create resource group]
changed: [localhost]
TASK [Create resource group for app service plan]
changed: [localhost]
TASK [Create App Service Plan]
[WARNING]: Azure API profile latest does not define an entry for WebSiteManagementClient
changed: [localhost]
TASK [Create App Service on Linux with Java Runtime]
changed: [localhost]
TASK [Get web app facts]
ok: [localhost]
TASK [Create Traffic Manager Profile]
[WARNING]: Azure API profile latest does not define an entry for TrafficManagerManagementClient
changed: [localhost]
TASK [Add endpoint to traffic manager profile, using the web site created above]
changed: [localhost]
TASK [Get Traffic Manager Profile facts]
ok: [localhost]
PLAY RECAP
localhost : ok=9 changed=6 unreachable=0 failed=0