Files
openstack-api-simulator/examples/ansible/playbook.yml
T
inecs 6033967e6a Initial commit: stateful OpenStack API laboratory simulator.
Ship Keystone auth, multi-service handlers (Yoga→Dalmatian), Compose/Helm
packaging, API contract packs, and pytest/Pulumi coverage labs.
2026-07-18 04:26:48 +03:00

177 lines
5.1 KiB
YAML

---
# OpenStack lab cookbook against openstack-api-simulator (Keystone :5000).
# Uses ansible.builtin.uri so no galaxy collections are required.
# ansible-playbook -i inventory.ini playbook.yml
- name: OpenStack API simulator cookbook
hosts: local
gather_facts: false
vars:
os_auth_url: "http://127.0.0.1:5000/v3"
os_nova: "http://127.0.0.1:8774"
os_neutron: "http://127.0.0.1:9696"
os_glance: "http://127.0.0.1:9292"
os_username: admin
os_password: secret
os_project: demo
os_domain: Default
server_name: "ansible-cookbook-vm"
tasks:
- name: Authenticate to Keystone
ansible.builtin.uri:
url: "{{ os_auth_url }}/auth/tokens"
method: POST
body_format: json
status_code: [201]
body:
auth:
identity:
methods: [password]
password:
user:
name: "{{ os_username }}"
domain: { name: "{{ os_domain }}" }
password: "{{ os_password }}"
scope:
project:
name: "{{ os_project }}"
domain: { name: "{{ os_domain }}" }
return_content: true
register: auth
- name: Set token facts
ansible.builtin.set_fact:
os_token: "{{ auth.x_subject_token }}"
os_project_id: "{{ auth.json.token.project.id }}"
- name: List images
ansible.builtin.uri:
url: "{{ os_glance }}/v2/images"
headers:
X-Auth-Token: "{{ os_token }}"
return_content: true
register: images
- name: Pick boot image
ansible.builtin.set_fact:
image_id: "{{ (images.json.images | selectattr('name', 'search', 'cirros') | list | first).id }}"
- name: List networks
ansible.builtin.uri:
url: "{{ os_neutron }}/v2.0/networks"
headers:
X-Auth-Token: "{{ os_token }}"
return_content: true
register: networks
- name: Pick demo network
ansible.builtin.set_fact:
network_id: "{{ (networks.json.networks | selectattr('name', 'equalto', 'demo-net') | list | first).id }}"
- name: Create network (ansible-managed)
ansible.builtin.uri:
url: "{{ os_neutron }}/v2.0/networks"
method: POST
headers:
X-Auth-Token: "{{ os_token }}"
body_format: json
status_code: [201, 200]
body:
network:
name: "ansible-app-net"
admin_state_up: true
return_content: true
register: net_create
- name: Create server
ansible.builtin.uri:
url: "{{ os_nova }}/v2.1/servers"
method: POST
headers:
X-Auth-Token: "{{ os_token }}"
OpenStack-API-Version: "compute 2.79"
body_format: json
status_code: [202, 200, 201]
body:
server:
name: "{{ server_name }}"
flavorRef: "1"
imageRef: "{{ image_id }}"
networks:
- uuid: "{{ network_id }}"
metadata:
managed_by: ansible
return_content: true
register: server_create
- name: Set server id
ansible.builtin.set_fact:
server_id: "{{ server_create.json.server.id }}"
- name: Show server
ansible.builtin.uri:
url: "{{ os_nova }}/v2.1/servers/{{ server_id }}"
headers:
X-Auth-Token: "{{ os_token }}"
return_content: true
register: server_show
- name: Write server metadata
ansible.builtin.uri:
url: "{{ os_nova }}/v2.1/servers/{{ server_id }}/metadata"
method: POST
headers:
X-Auth-Token: "{{ os_token }}"
body_format: json
status_code: [200, 201]
body:
metadata:
playbook: openstack-cookbook
env: lab
return_content: true
- name: Read metadata
ansible.builtin.uri:
url: "{{ os_nova }}/v2.1/servers/{{ server_id }}/metadata"
headers:
X-Auth-Token: "{{ os_token }}"
return_content: true
register: meta
- name: Stop server
ansible.builtin.uri:
url: "{{ os_nova }}/v2.1/servers/{{ server_id }}/action"
method: POST
headers:
X-Auth-Token: "{{ os_token }}"
body_format: json
status_code: [202, 200, 204]
body:
"os-stop": null
- name: Delete server
ansible.builtin.uri:
url: "{{ os_nova }}/v2.1/servers/{{ server_id }}"
method: DELETE
headers:
X-Auth-Token: "{{ os_token }}"
status_code: [204, 202, 200]
- name: Delete ansible network
ansible.builtin.uri:
url: "{{ os_neutron }}/v2.0/networks/{{ net_create.json.network.id }}"
method: DELETE
headers:
X-Auth-Token: "{{ os_token }}"
status_code: [204, 200]
- name: Summary
ansible.builtin.debug:
msg:
project_id: "{{ os_project_id }}"
server_was: "{{ server_id }}"
server_name: "{{ server_show.json.server.name }}"
metadata: "{{ meta.json.metadata }}"
images: "{{ images.json.images | length }}"