Skip to content

Commit d8be257

Browse files
authored
Merge pull request #2 from companieshouse/feature/initial-deployment-implementation
Tuxedo deployment script
2 parents b6e8f5e + 2eb8cb3 commit d8be257

File tree

11 files changed

+374
-0
lines changed

11 files changed

+374
-0
lines changed

ansible.cfg

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[defaults]
2+
host_key_checking = False
3+
4+
[inventory]
5+
enable_plugins = aws_ec2
6+
7+
[ssh_connection]
8+
pipelining = True

deploy.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
3+
- hosts: aws_ec2
4+
serial: 1
5+
remote_user: centos
6+
become: yes
7+
roles:
8+
- deploy
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
plugin: aws_ec2
2+
boto_profile: heritage-development-eu-west-2
3+
4+
regions:
5+
- eu-west-2
6+
7+
filters:
8+
tag:Environment: development
9+
tag:Service: tuxedo
10+
tag:ServiceSubType: frontend
11+
12+
hostnames: private-ip-address
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
plugin: aws_ec2
2+
boto_profile: heritage-staging-eu-west-2
3+
4+
regions:
5+
- eu-west-2
6+
7+
filters:
8+
tag:Environment: staging
9+
tag:Service: tuxedo
10+
tag:ServiceSubType: frontend
11+
12+
hostnames: private-ip-address

requirements.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
3+
collections:
4+
- name: amazon.aws
5+
- name: community.hashi_vault

roles/deploy/defaults/main.yml

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
---
2+
3+
tuxedo_service_group: tuxedo
4+
tuxedo_service_users:
5+
- ceu
6+
- chd
7+
- ewf
8+
- xml
9+
10+
tuxedo_service_user_id_minimum: 1010
11+
tuxedo_service_user_id_increment: 10
12+
tuxedo_service_ipc_key_start: 48000
13+
tuxedo_service_ipc_key_increment: 100
14+
tuxedo_service_domain_port_start: 38000
15+
tuxedo_service_domain_port_increment: 100
16+
17+
tuxedo_service_config:
18+
ceu:
19+
gid: "{{ tuxedo_service_user_id_minimum + (0 * tuxedo_service_user_id_increment) | int }}"
20+
uid: "{{ tuxedo_service_user_id_minimum + (0 * tuxedo_service_user_id_increment) | int }}"
21+
ipc_key: "{{ tuxedo_service_ipc_key_start + (0 * tuxedo_service_ipc_key_increment) | int }}"
22+
local_domain_port: "{{ tuxedo_service_domain_port_start + (0 * tuxedo_service_domain_port_increment) | int }}"
23+
shared_memory_id: 5000
24+
required_databases:
25+
- chdata
26+
chd:
27+
gid: "{{ tuxedo_service_user_id_minimum + (1 * tuxedo_service_user_id_increment) | int }}"
28+
uid: "{{ tuxedo_service_user_id_minimum + (1 * tuxedo_service_user_id_increment) | int }}"
29+
ipc_key: "{{ tuxedo_service_ipc_key_start + (1 * tuxedo_service_ipc_key_increment) | int }}"
30+
local_domain_port: "{{ tuxedo_service_domain_port_start + (1 * tuxedo_service_domain_port_increment) | int }}"
31+
shared_memory_id: 4000
32+
required_databases:
33+
- chdata
34+
ewf:
35+
gid: "{{ tuxedo_service_user_id_minimum + (2 * tuxedo_service_user_id_increment) | int }}"
36+
uid: "{{ tuxedo_service_user_id_minimum + (2 * tuxedo_service_user_id_increment) | int }}"
37+
ipc_key: "{{ tuxedo_service_ipc_key_start + (2 * tuxedo_service_ipc_key_increment) | int }}"
38+
local_domain_port: "{{ tuxedo_service_domain_port_start + (2 * tuxedo_service_domain_port_increment) | int }}"
39+
shared_memory_id: 2000
40+
required_databases:
41+
- bcd
42+
- chdata
43+
- ewf
44+
xml:
45+
gid: "{{ tuxedo_service_user_id_minimum + (3 * tuxedo_service_user_id_increment) | int }}"
46+
uid: "{{ tuxedo_service_user_id_minimum + (3 * tuxedo_service_user_id_increment) | int }}"
47+
ipc_key: "{{ tuxedo_service_ipc_key_start + (3 * tuxedo_service_ipc_key_increment) | int }}"
48+
local_domain_port: "{{ tuxedo_service_domain_port_start + (3 * tuxedo_service_domain_port_increment) | int }}"
49+
shared_memory_id: 3000
50+
required_databases:
51+
- bcd
52+
- chdata
53+
- xml
54+
55+
deployment_dir: deployment
56+
rollback_dir: rollback

roles/deploy/tasks/deploy.yml

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
---
2+
3+
- name: Retrieve service-specific database credentials from Hashicorp Vault
4+
set_fact:
5+
"{{ item }}_db_credentials": "{{ lookup('community.hashi_vault.hashi_vault', 'applications/heritage-{{ environment_name }}-eu-west-2/tuxedo/database/{{ item }}') }}"
6+
no_log: True
7+
loop: "{{ tuxedo_service_config[tuxedo_user].required_databases }}"
8+
9+
- name: Set database credential variables for template population
10+
set_fact:
11+
"{{ item }}_database_password": "{{ vars[item + '_db_credentials']['database_password'] }}"
12+
"{{ item }}_database_username": "{{ vars[item + '_db_credentials']['database_username'] }}"
13+
"{{ item }}_database_tns_name": "{{ vars[item + '_db_credentials']['database_tns_name'] }}"
14+
no_log: True
15+
loop: "{{ tuxedo_service_config[tuxedo_user].required_databases }}"
16+
17+
- name: Set additional variables for template population
18+
set_fact:
19+
private_host_address: "{{ inventory_hostname }}"
20+
private_host_local_domain_port: "{{ tuxedo_service_config[tuxedo_user].local_domain_port }}"
21+
service_name: "{{ tuxedo_user }}"
22+
shared_memory_id: "{{ tuxedo_service_config[tuxedo_user].shared_memory_id }}"
23+
tuxedo_domain_id: "{{ tuxedo_user | upper }}_{{ tuxedo_domain_id_suffix }}"
24+
tuxedo_group_id: "{{ tuxedo_service_config[tuxedo_user].gid }}"
25+
tuxedo_ipc_key: "{{ tuxedo_service_config[tuxedo_user].ipc_key }}"
26+
tuxedo_local_domain_id: "{{ tuxedo_user | upper }}_{{ tuxedo_local_domain_suffix }}"
27+
tuxedo_logical_machine_id: "{{ tuxedo_user | upper }}_{{ tuxedo_logical_machine_id_suffix }}"
28+
tuxedo_machine_name: "{{ ansible_facts.hostname }}"
29+
tuxedo_user_id: "{{ tuxedo_service_config[tuxedo_user].uid }}"
30+
no_log: True
31+
32+
- name: "{{ tuxedo_user }} : Create temporary directory for new {{ tuxedo_user }} deployment"
33+
become_user: "{{ tuxedo_user }}"
34+
tempfile:
35+
state: directory
36+
register: new_deployment_files
37+
38+
- name: "{{ tuxedo_user }} : Copy application artefact files to temporary {{ tuxedo_user }} deployment directory"
39+
become_user: "{{ tuxedo_user }}"
40+
command: "cp -r {{ application_artefact_files.path }}/. {{ new_deployment_files.path }}"
41+
42+
- name: "{{ tuxedo_user }} : Create empty log directory"
43+
file:
44+
path: "{{ new_deployment_files.path }}/logdir"
45+
owner: "{{ tuxedo_user }}"
46+
group: "{{ tuxedo_user }}"
47+
mode: 0755
48+
state: directory
49+
50+
- name: "{{ tuxedo_user }} : Populate template config files"
51+
template:
52+
src: "{{ item }}"
53+
dest: "{{ new_deployment_files.path }}/config//{{ item | basename | replace('.j2', '') }}"
54+
owner: "{{ tuxedo_user }}"
55+
group: "{{ tuxedo_user }}"
56+
mode: 0644
57+
with_fileglob:
58+
- "{{ application_configs_path }}/{{ tuxedo_user }}/*.j2"
59+
no_log: True
60+
61+
- name: "{{ tuxedo_user }} : Find idx files for service"
62+
find:
63+
paths: "{{ new_deployment_files.path }}/idx/{{ tuxedo_user }}"
64+
patterns: "*"
65+
register: idx_configs
66+
67+
- name: "{{ tuxedo_user }} : Assert idx files found"
68+
assert:
69+
that:
70+
- idx_configs.files | length > 0
71+
msg: "idx files must exist for service {{ tuxedo_user }} in artefact subdirectory idx/{{ tuxedo_user }}"
72+
73+
- name: "{{ tuxedo_user }} : Copy idx files for service to config directory"
74+
become_user: "{{ tuxedo_user }}"
75+
command: "cp {{ item.path }} {{ new_deployment_files.path }}/config"
76+
loop: "{{ idx_configs.files }}"
77+
78+
- name: "{{ tuxedo_user }} : Set permissions for new deployment files"
79+
file:
80+
path: "{{ new_deployment_files.path }}"
81+
owner: "{{ tuxedo_user }}"
82+
group: "{{ tuxedo_user }}"
83+
recurse: yes
84+
85+
- name: "{{ tuxedo_user }} : Check state of {{ tuxedo_user }} current deployment directory"
86+
stat:
87+
path: "/home/{{ tuxedo_user }}/{{ deployment_dir }}"
88+
register: current_deployment_files
89+
90+
- name: "{{ tuxedo_user }} : Stop ngSrv services"
91+
become_user: "{{ tuxedo_user }}"
92+
shell: "source $HOME/deployment/config/envfile && ngsrv.sh stop"
93+
args:
94+
executable: /bin/bash
95+
ignore_errors: yes
96+
when: current_deployment_files.stat.exists
97+
98+
- name: "{{ tuxedo_user }} : Stop Tuxedo services"
99+
become_user: "{{ tuxedo_user }}"
100+
shell: "source $HOME/deployment/config/envfile && tmshutdown -y"
101+
args:
102+
executable: /bin/bash
103+
ignore_errors: yes
104+
when: current_deployment_files.stat.exists
105+
106+
- name: "{{ tuxedo_user }} : Clear IPC facilities"
107+
become_user: "{{ tuxedo_user }}"
108+
shell: "source $HOME/deployment/config/envfile && zapipc"
109+
args:
110+
executable: /bin/bash
111+
when: current_deployment_files.stat.exists
112+
113+
- name: "{{ tuxedo_user }} : Remove {{ tuxedo_user }} rollback directory if present"
114+
file:
115+
path: "/home/{{ tuxedo_user }}/{{ rollback_dir }}"
116+
state: absent
117+
118+
- name: "{{ tuxedo_user }} : Backup {{ tuxedo_user }} current deployment directory if one exists"
119+
become_user: "{{ tuxedo_user }}"
120+
command: "mv /home/{{ tuxedo_user }}/{{ deployment_dir }} /home/{{ tuxedo_user }}/{{ rollback_dir }}"
121+
when: current_deployment_files.stat.exists
122+
123+
- name: "{{ tuxedo_user }} : Install new deployment files"
124+
become_user: "{{ tuxedo_user }}"
125+
command: "mv {{ new_deployment_files.path }} /home/{{ tuxedo_user }}/{{ deployment_dir }}"
126+
127+
- name: "{{ tuxedo_user }} : Lint Tuxedo ubbconfig file after variable population"
128+
become_user: "{{ tuxedo_user }}"
129+
shell: "source $HOME/deployment/config/envfile && tmloadcf -n ubbconfig"
130+
args:
131+
chdir: "/home/{{ tuxedo_user }}/{{ deployment_dir }}/config"
132+
executable: /bin/bash
133+
register: ubbconfig_lint
134+
135+
- name: "{{ tuxedo_user }} : Assert Tuxedo ubbconfig lint success"
136+
assert:
137+
that:
138+
- ubbconfig_lint.rc == 0
139+
fail_msg: "Tuxedo ubbconfig file failed lint check"
140+
success_msg: "Tuxedo ubbconfig file passed lint check"
141+
142+
- name: "{{ tuxedo_user }} : Generate Tuxedo binary tuxconfig file"
143+
become_user: "{{ tuxedo_user }}"
144+
shell: "source $HOME/deployment/config/envfile && tmloadcf -y ubbconfig"
145+
args:
146+
chdir: "/home/{{ tuxedo_user }}/{{ deployment_dir }}/config"
147+
executable: /bin/bash
148+
149+
- name: "{{ tuxedo_user }} : Lint Tuxedo dmconfig file after variable population"
150+
become_user: "{{ tuxedo_user }}"
151+
shell: "source $HOME/deployment/config/envfile && dmloadcf -n dmconfig"
152+
args:
153+
chdir: "/home/{{ tuxedo_user }}/{{ deployment_dir }}/config"
154+
executable: /bin/bash
155+
register: dmconfig_lint
156+
157+
- name: "{{ tuxedo_user }} : Assert Tuxedo dmconfig lint success"
158+
assert:
159+
that:
160+
- dmconfig_lint.rc == 0
161+
fail_msg: "Tuxedo dmconfig file failed lint check"
162+
success_msg: "Tuxedo dmconfig file passed lint check"
163+
164+
- name: "{{ tuxedo_user }} : Generate Tuxedo binary bdmconfig file"
165+
become_user: "{{ tuxedo_user }}"
166+
shell: "source $HOME/deployment/config/envfile && dmloadcf -y dmconfig"
167+
args:
168+
chdir: "/home/{{ tuxedo_user }}/{{ deployment_dir }}/config"
169+
executable: /bin/bash
170+
171+
- name: "{{ tuxedo_user }} : Start Tuxedo services"
172+
become_user: "{{ tuxedo_user }}"
173+
shell: "source $HOME/deployment/config/envfile && tmboot -y"
174+
args:
175+
executable: /bin/bash
176+
177+
- name: "{{ tuxedo_user }} : Start ngSrv services"
178+
become_user: "{{ tuxedo_user }}"
179+
shell: "source $HOME/deployment/config/envfile && ngsrv.sh start"
180+
args:
181+
executable: /bin/bash

roles/deploy/tasks/main.yml

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
---
2+
3+
- name: Check required variables are set
4+
assert:
5+
that:
6+
- environment_name is defined and environment_name | trim | length > 0
7+
- application_artefact_path is defined and application_artefact_path | trim | length > 0
8+
- application_configs_path is defined and application_configs_path | trim | length > 0
9+
- snmp_host_address is defined and snmp_host_address | trim | length > 0
10+
- alpha_key_url is defined and alpha_key_url | trim | length > 0
11+
- xbrl_validator_url is defined and xbrl_validator_url | trim | length > 0
12+
- tnep_url is defined and tnep_url | trim | length > 0
13+
- xslt_transformer_url is defined and xslt_transformer_url | trim | length > 0
14+
msg: "Required variable(s) empty or undefined"
15+
16+
# The hostname is assumed to be in the format: i<instance-index>-frontend-tuxedo-<environment>
17+
- set_fact:
18+
tuxedo_domain_id_suffix: "{{ ansible_facts.hostname | regex_replace('^i(\\d+)-frontend-tuxedo-([A-Za-z].*)$', 'INSTANCE_\\1_\\2_DOM') | upper }}"
19+
tuxedo_logical_machine_id_suffix: "{{ ansible_facts.hostname | regex_replace('^i(\\d+)-frontend-tuxedo-([A-Za-z].*)$', 'INSTANCE_\\1_\\2_SRV') | upper }}"
20+
tuxedo_local_domain_suffix: "{{ ansible_facts.hostname | regex_replace('^i(\\d+)-frontend-tuxedo-([A-Za-z].*)$', 'INSTANCE_\\1_\\2_LOD') | upper }}"
21+
22+
- name: Using constructed variable suffixes
23+
ansible.builtin.debug:
24+
var: "{{ item }}"
25+
loop:
26+
- tuxedo_domain_id_suffix
27+
- tuxedo_logical_machine_id_suffix
28+
- tuxedo_local_domain_suffix
29+
30+
- name: Create temporary directory for application artefact files
31+
tempfile:
32+
state: directory
33+
register: application_artefact_files
34+
35+
- name: Set permissions to allow service users to read from temporary directory
36+
file:
37+
path: "{{ application_artefact_files.path }}"
38+
owner: root
39+
group: "{{ tuxedo_service_group }}"
40+
mode: 0755
41+
42+
- name: Deploy and extract application arterfact
43+
unarchive:
44+
src: "{{ application_artefact_path }}"
45+
dest: "{{ application_artefact_files.path }}"
46+
remote_src: no
47+
owner: root
48+
group: "{{ tuxedo_service_group }}"
49+
mode: 0755
50+
51+
- include_tasks: deploy.yml
52+
loop: "{{ tuxedo_service_users }}"
53+
loop_control:
54+
loop_var: tuxedo_user
55+
56+
- name: Remove temporary directories
57+
file:
58+
path: "{{ application_artefact_files.path }}"
59+
state: absent

roles/sshkey/tasks/main.yml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
---
2+
3+
- name: Retrieve SSH private key for AWS instance(s) from Hashicorp Vault
4+
set_fact:
5+
aws: "{{ lookup('community.hashi_vault.hashi_vault', 'applications/heritage-{{ environment_name }}-eu-west-2/tuxedo/aws') }}"
6+
no_log: True
7+
8+
- name: Ensure SSH directory exists
9+
file:
10+
path: /root/.ssh
11+
owner: root
12+
group: root
13+
state: directory
14+
mode: '0700'
15+
16+
- name: Write SSH private key to Ansible controller
17+
copy:
18+
content: "{{ aws['ssh_private_key'] }}"
19+
dest: /root/.ssh/ansible_remote
20+
no_log: True
21+
22+
- name: Set SSH private key permissions
23+
file:
24+
path: /root/.ssh/ansible_remote
25+
owner: root
26+
group: root
27+
mode: '0600'

sshkey.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
3+
- hosts: localhost
4+
roles:
5+
- sshkey

0 commit comments

Comments
 (0)