aboutsummaryrefslogtreecommitdiff
path: root/roles/kolla-ansible-test-ovn-vpnaas/tasks/main.yml
blob: ee5a718e0f52d50b37241b9ed1c4da5b5177e262 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
---
- name: VPNaaS | Init ENV
  ansible.builtin.include_tasks: init_env.yml

- name: VPNaaS | Check if VPN agents are alive and reporting
  ansible.builtin.shell: |
    set -o pipefail
    {{ ovn_vpnaas_activate }}
    openstack network agent list -f value -c Binary -c Alive | grep "vpn-agent" | awk '{print $2}'
  args:
    executable: /bin/bash
  register: vpn_agents_alive
  until:
    - vpn_agents_alive.stdout != ""
    - "'False' not in vpn_agents_alive.stdout"
  retries: 10
  delay: 5
  environment: "{{ os_auth_env }}"
  changed_when: false

- name: VPNaaS | Create IKE and IPsec Policies
  ansible.builtin.shell: |
    {{ ovn_vpnaas_activate }}
    openstack vpn ike policy create ikepolicy --ike-version v2 --auth-algorithm sha256 --encryption-algorithm aes-256 --pfs group14 || true
    openstack vpn ipsec policy create ipsecpolicy --auth-algorithm sha256 --encryption-algorithm aes-256 --pfs group14 || true
  environment: "{{ os_auth_env }}"
  changed_when: false

- name: VPNaaS | Setup Network Infrastructure
  ansible.builtin.include_tasks: setup_site.yml
  vars:
    site_name: "{{ item.name }}"
    site_cidr: "{{ item.cidr }}"
    peer_cidr: "{{ item.peer }}"
  loop:
    - { name: 'west', cidr: "{{ ovn_vpnaas_west_cidr }}", peer: "{{ ovn_vpnaas_east_cidr }}" }
    - { name: 'east', cidr: "{{ ovn_vpnaas_east_cidr }}", peer: "{{ ovn_vpnaas_west_cidr }}" }

- name: VPNaaS | Wait for OVN Agent to settle
  ansible.builtin.pause:
    minutes: 2

- name: VPNaaS | Check if VPN service west exists
  ansible.builtin.shell: |
    set -o pipefail
    {{ ovn_vpnaas_activate }}
    openstack vpn service list -f value -c ID -c Name | awk '$2=="vpn_west" {print $1}' | head -n 1
  args:
    executable: /bin/bash
  environment: "{{ os_auth_env }}"
  register: check_vpn_west
  changed_when: false

- name: VPNaaS | Create VPN service | west
  ansible.builtin.shell: |
    {{ ovn_vpnaas_activate }}
    openstack vpn service create --router "router_west" "vpn_west"
  environment: "{{ os_auth_env }}"
  when: check_vpn_west.stdout | trim == ""
  failed_when: false
  changed_when: false

- name: VPNaaS | Settle database consistency before next service
  ansible.builtin.pause:
    seconds: 20

- name: VPNaaS | Ensure VPN service west exists and get ID
  ansible.builtin.shell: |
    set -o pipefail
    {{ ovn_vpnaas_activate }}
    openstack vpn service list -f value -c ID -c Name | awk '$2=="vpn_west" {print $1}' | head -n 1
  args:
    executable: /bin/bash
  register: vpn_svc_west_out
  until:
    - vpn_svc_west_out.rc == 0
    - vpn_svc_west_out.stdout | trim != ""
  retries: 20
  delay: 10
  environment: "{{ os_auth_env }}"
  changed_when: false

- name: VPNaaS | Check if VPN service east exists
  ansible.builtin.shell: |
    set -o pipefail
    {{ ovn_vpnaas_activate }}
    openstack vpn service list -f value -c ID -c Name | awk '$2=="vpn_east" {print $1}' | head -n 1
  args:
    executable: /bin/bash
  environment: "{{ os_auth_env }}"
  register: check_vpn_east
  changed_when: false

- name: VPNaaS | Create VPN service | east
  ansible.builtin.shell: |
    {{ ovn_vpnaas_activate }}
    openstack vpn service create --router "router_east" "vpn_east"
  environment: "{{ os_auth_env }}"
  when: check_vpn_east.stdout | trim == ""
  failed_when: false
  changed_when: false

- name: VPNaaS | Settle database consistency before next service
  ansible.builtin.pause:
    seconds: 20

- name: VPNaaS | Ensure VPN service east exists in DB
  ansible.builtin.shell: |
    set -o pipefail
    {{ ovn_vpnaas_activate }}
    openstack vpn service list -f value -c ID -c Name | awk '$2=="vpn_east" {print $1}' | head -n 1
  args:
    executable: /bin/bash
  register: vpn_svc_east_out
  until:
    - vpn_svc_east_out.rc == 0
    - vpn_svc_east_out.stdout | trim != ""
  retries: 20
  delay: 10
  environment: "{{ os_auth_env }}"
  changed_when: false

- name: VPNaaS | Create Endpoint Groups
  ansible.builtin.shell: |
    {{ ovn_vpnaas_activate }}
    openstack vpn endpoint group create --type subnet --value "subnet_{{ item.name }}" "{{ item.name }}-local-epg" || true
    openstack vpn endpoint group create --type cidr --value "{{ item.peer }}" "{{ item.name }}-peer-epg" || true
  loop:
    - { name: 'west', peer: "{{ ovn_vpnaas_east_cidr }}" }
    - { name: 'east', peer: "{{ ovn_vpnaas_west_cidr }}" }
  environment: "{{ os_auth_env }}"
  changed_when: false

- name: VPNaaS | Get Public IPs
  ansible.builtin.shell: |
    {{ ovn_vpnaas_activate }}
    openstack vpn service show "{{ item }}" -f value -c ext_v4_ip
  register: vpn_ips
  until:
    - vpn_ips.stdout | trim != ""
    - vpn_ips.stdout | trim != "None"
  retries: 24
  delay: 10
  loop:
    - "{{ vpn_svc_west_out.stdout.strip() }}"
    - "{{ vpn_svc_east_out.stdout.strip() }}"
  environment: "{{ os_auth_env }}"
  changed_when: false

- name: VPNaaS | Establish Connections
  ansible.builtin.shell: |
    {{ ovn_vpnaas_activate }}
    openstack vpn ipsec site connection create "conn_east" --vpnservice "{{ vpn_svc_east_out.stdout.strip() }}" --ikepolicy ikepolicy \
        --ipsecpolicy ipsecpolicy --local-endpoint-group east-local-epg --peer-address "{{ vpn_ips.results[0].stdout.strip() }}" \
        --peer-id "{{ vpn_ips.results[0].stdout.strip() }}" --peer-endpoint-group east-peer-epg --psk {{ ovn_vpnaas_psk }} || true

    openstack vpn ipsec site connection create "conn_west" --vpnservice "{{ vpn_svc_west_out.stdout.strip() }}" --ikepolicy ikepolicy \
        --ipsecpolicy ipsecpolicy --local-endpoint-group west-local-epg --peer-address "{{ vpn_ips.results[1].stdout.strip() }}" \
        --peer-id "{{ vpn_ips.results[1].stdout.strip() }}" --peer-endpoint-group west-peer-epg --psk {{ ovn_vpnaas_psk }} || true
  environment: "{{ os_auth_env }}"
  changed_when: false

- name: VPNaaS | Wait for Tunnel to be ACTIVE
  ansible.builtin.shell: |
    {{ ovn_vpnaas_activate }}
    openstack vpn ipsec site connection show "conn_{{ item }}" -f value -c status
  register: tunnel_status
  until: tunnel_status.stdout == "ACTIVE"
  retries: "{{ ovn_vpnaas_tunnel_retries }}"
  delay: "{{ ovn_vpnaas_tunnel_delay }}"
  loop: ["west", "east"]
  environment: "{{ os_auth_env }}"
  changed_when: false

- name: VPNaaS | SHOW TUNNEL STATUS RESULT
  ansible.builtin.debug:
    msg:
      - "************************************************************"
      - "CONNECTION: conn_{{ item.item }}"
      - "STATUS:     {{ item.stdout }}"
      - "RESULT:     TUNNEL ESTABLISHED SUCCESSFULLY!"
      - "************************************************************"
  loop: "{{ tunnel_status.results }}"
  loop_control:
    label: "{{ item.item }}"

- name: VPNaaS | Show Full Connection Details
  ansible.builtin.shell: |
    {{ ovn_vpnaas_activate }}
    openstack vpn ipsec site connection list
  environment: "{{ os_auth_env }}"
  register: final_list
  changed_when: false

- name: VPNaaS | Print Connection List Table
  ansible.builtin.debug:
    var: final_list.stdout_lines

- name: VPNaaS | Final Cleanup
  ansible.builtin.include_tasks: cleanup_site.yml
  loop: ["west", "east"]
  loop_control:
    loop_var: site_to_clean

- name: VPNaaS | Cleanup | Global Policies
  ansible.builtin.shell: |
    {{ ovn_vpnaas_activate }}
    openstack vpn ipsec policy delete ipsecpolicy || true
    openstack vpn ike policy delete ikepolicy || true
  environment: "{{ os_auth_env }}"
  changed_when: false