Matrix Docker Ansible eploy
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

320 lines
14 KiB

  1. - name: Ensure dateutils and curl is installed in AWX
  2. delegate_to: 127.0.0.1
  3. yum:
  4. name: dateutils
  5. state: latest
  6. - name: Include vars in matrix_vars.yml
  7. include_vars:
  8. file: '/var/lib/awx/projects/clients/{{ member_id }}/{{ subscription_id }}/matrix_vars.yml'
  9. no_log: True
  10. - name: Ensure curl and jq intalled on target machine
  11. apt:
  12. pkg:
  13. - curl
  14. - jq
  15. state: present
  16. - name: Collect before shrink size of Synapse database
  17. shell: du -sh /matrix/postgres/data
  18. register: db_size_before_stat
  19. when: (purge_mode.find("Perform final shrink") != -1)
  20. no_log: True
  21. - name: Collect the internal IP of the matrix-synapse container
  22. shell: "/usr/bin/docker inspect --format '{''{range.NetworkSettings.Networks}''}{''{.IPAddress}''}{''{end}''}' matrix-synapse"
  23. when: (purge_mode.find("No local users [recommended]") != -1) or (purge_mode.find("Number of users [slower]") != -1) or (purge_mode.find("Number of events [slower]") != -1)
  24. register: synapse_container_ip
  25. - name: Collect access token for janitor user
  26. shell: |
  27. curl -X POST -d '{"type":"m.login.password", "user":"janitor", "password":"{{ matrix_awx_janitor_user_password }}"}' "{{ synapse_container_ip.stdout }}:8008/_matrix/client/r0/login" | jq '.access_token'
  28. when: (purge_mode.find("No local users [recommended]") != -1) or (purge_mode.find("Number of users [slower]") != -1) or (purge_mode.find("Number of events [slower]") != -1)
  29. register: janitors_token
  30. no_log: True
  31. - name: Copy build_room_list.py script to target machine
  32. copy:
  33. src: ./roles/matrix-awx/scripts/matrix_build_room_list.py
  34. dest: /usr/local/bin/matrix_build_room_list.py
  35. owner: matrix
  36. group: matrix
  37. mode: '0755'
  38. when: (purge_mode.find("No local users [recommended]") != -1) or (purge_mode.find("Number of users [slower]") != -1) or (purge_mode.find("Number of events [slower]") != -1)
  39. - name: Run build_room_list.py script
  40. shell: |
  41. runuser -u matrix -- python3 /usr/local/bin/matrix_build_room_list.py {{ janitors_token.stdout[1:-1] }} {{ synapse_container_ip.stdout }}
  42. register: rooms_total
  43. when: (purge_mode.find("No local users [recommended]") != -1) or (purge_mode.find("Number of users [slower]") != -1) or (purge_mode.find("Number of events [slower]") != -1)
  44. - name: Fetch complete room list from target machine
  45. fetch:
  46. src: /tmp/room_list_complete.json
  47. dest: "/tmp/{{ subscription_id }}_room_list_complete.json"
  48. flat: yes
  49. when: (purge_mode.find("No local users [recommended]") != -1) or (purge_mode.find("Number of users [slower]") != -1) or (purge_mode.find("Number of events [slower]") != -1)
  50. - name: Remove complete room list from target machine
  51. file:
  52. path: /tmp/room_list_complete.json
  53. state: absent
  54. when: (purge_mode.find("No local users [recommended]") != -1) or (purge_mode.find("Number of users [slower]") != -1) or (purge_mode.find("Number of events [slower]") != -1)
  55. - name: Generate list of rooms with no local users
  56. delegate_to: 127.0.0.1
  57. shell: |
  58. jq 'try .rooms[] | select(.joined_local_members == 0) | .room_id' < /tmp/{{ subscription_id }}_room_list_complete.json > /tmp/{{ subscription_id }}_room_list_no_local_users.txt
  59. when: (purge_mode.find("No local users [recommended]") != -1) or (purge_mode.find("Number of users [slower]") != -1) or (purge_mode.find("Number of events [slower]") != -1)
  60. - name: Count number of rooms with no local users
  61. delegate_to: 127.0.0.1
  62. shell: |
  63. wc -l /tmp/{{ subscription_id }}_room_list_no_local_users.txt | awk '{ print $1 }'
  64. register: rooms_no_local_total
  65. when: (purge_mode.find("No local users [recommended]") != -1) or (purge_mode.find("Number of users [slower]") != -1) or (purge_mode.find("Number of events [slower]") != -1)
  66. - name: Setting host fact room_list_no_local_users
  67. set_fact:
  68. room_list_no_local_users: "{{ lookup('file', '/tmp/{{ subscription_id }}_room_list_no_local_users.txt') }}"
  69. no_log: True
  70. when: (purge_mode.find("No local users [recommended]") != -1) or (purge_mode.find("Number of users [slower]") != -1) or (purge_mode.find("Number of events [slower]") != -1)
  71. - name: Purge all rooms with no local users
  72. include_tasks: purge_database_no_local.yml
  73. loop: "{{ room_list_no_local_users.splitlines() | flatten(levels=1) }}"
  74. when: (purge_mode.find("No local users [recommended]") != -1) or (purge_mode.find("Number of users [slower]") != -1) or (purge_mode.find("Number of events [slower]") != -1)
  75. - name: Collect epoche time from date
  76. delegate_to: 127.0.0.1
  77. shell: |
  78. date -d '{{ purge_date }}' +"%s"
  79. when: (purge_mode.find("Number of users [slower]") != -1) or (purge_mode.find("Number of events [slower]") != -1)
  80. register: purge_epoche_time
  81. - name: Generate list of rooms with more then N users
  82. delegate_to: 127.0.0.1
  83. shell: |
  84. jq 'try .rooms[] | select(.joined_members > {{ purge_metric_value }}) | .room_id' < /tmp/{{ subscription_id }}_room_list_complete.json > /tmp/{{ subscription_id }}_room_list_joined_members.txt
  85. when: purge_mode.find("Number of users [slower]") != -1
  86. - name: Count number of rooms with more then N users
  87. delegate_to: 127.0.0.1
  88. shell: |
  89. wc -l /tmp/{{ subscription_id }}_room_list_joined_members.txt | awk '{ print $1 }'
  90. register: rooms_join_members_total
  91. when: purge_mode.find("Number of users [slower]") != -1
  92. - name: Setting host fact room_list_joined_members
  93. delegate_to: 127.0.0.1
  94. set_fact:
  95. room_list_joined_members: "{{ lookup('file', '/tmp/{{ subscription_id }}_room_list_joined_members.txt') }}"
  96. when: purge_mode.find("Number of users [slower]") != -1
  97. no_log: True
  98. - name: Purge all rooms with more then N users
  99. include_tasks: purge_database_users.yml
  100. loop: "{{ room_list_joined_members.splitlines() | flatten(levels=1) }}"
  101. when: purge_mode.find("Number of users [slower]") != -1
  102. - name: Generate list of rooms with more then N events
  103. delegate_to: 127.0.0.1
  104. shell: |
  105. jq 'try .rooms[] | select(.state_events > {{ purge_metric_value }}) | .room_id' < /tmp/{{ subscription_id }}_room_list_complete.json > /tmp/{{ subscription_id }}_room_list_state_events.txt
  106. when: purge_mode.find("Number of events [slower]") != -1
  107. - name: Count number of rooms with more then N events
  108. delegate_to: 127.0.0.1
  109. shell: |
  110. wc -l /tmp/{{ subscription_id }}_room_list_state_events.txt | awk '{ print $1 }'
  111. register: rooms_state_events_total
  112. when: purge_mode.find("Number of events [slower]") != -1
  113. - name: Setting host fact room_list_state_events
  114. delegate_to: 127.0.0.1
  115. set_fact:
  116. room_list_state_events: "{{ lookup('file', '/tmp/{{ subscription_id }}_room_list_state_events.txt') }}"
  117. when: purge_mode.find("Number of events [slower]") != -1
  118. no_log: True
  119. - name: Purge all rooms with more then N events
  120. include_tasks: purge_database_events.yml
  121. loop: "{{ room_list_state_events.splitlines() | flatten(levels=1) }}"
  122. when: purge_mode.find("Number of events [slower]") != -1
  123. - name: Adjust 'Deploy/Update a Server' job template
  124. delegate_to: 127.0.0.1
  125. awx.awx.tower_job_template:
  126. name: "{{ matrix_domain }} - 0 - Deploy/Update a Server"
  127. description: "Creates a new matrix service with Spantaleev's playbooks"
  128. extra_vars: "{{ lookup('file', '/var/lib/awx/projects/clients/{{ member_id }}/{{ subscription_id }}/extra_vars.json') }}"
  129. job_type: run
  130. job_tags: "rust-synapse-compress-state"
  131. inventory: "{{ member_id }}"
  132. project: "{{ member_id }} - Matrix Docker Ansible Deploy"
  133. playbook: setup.yml
  134. credential: "{{ member_id }} - AWX SSH Key"
  135. state: present
  136. verbosity: 1
  137. tower_host: "https://{{ awx_host }}"
  138. tower_oauthtoken: "{{ awx_session_token.ansible_facts.tower_token.token }}"
  139. validate_certs: yes
  140. when: (purge_mode.find("No local users [recommended]") != -1) or (purge_mode.find("Number of users [slower]") != -1) or (purge_mode.find("Number of events [slower]") != -1) or (purge_mode.find("Skip purging rooms [faster]") != -1)
  141. - name: Execute rust-synapse-compress-state job template
  142. delegate_to: 127.0.0.1
  143. awx.awx.tower_job_launch:
  144. job_template: "{{ matrix_domain }} - 0 - Deploy/Update a Server"
  145. wait: yes
  146. tower_host: "https://{{ awx_host }}"
  147. tower_oauthtoken: "{{ awx_session_token.ansible_facts.tower_token.token }}"
  148. validate_certs: yes
  149. when: (purge_mode.find("No local users [recommended]") != -1) or (purge_mode.find("Number of users [slower]") != -1) or (purge_mode.find("Number of events [slower]") != -1) or (purge_mode.find("Skip purging rooms [faster]") != -1)
  150. - name: Revert 'Deploy/Update a Server' job template
  151. delegate_to: 127.0.0.1
  152. awx.awx.tower_job_template:
  153. name: "{{ matrix_domain }} - 0 - Deploy/Update a Server"
  154. description: "Creates a new matrix service with Spantaleev's playbooks"
  155. extra_vars: "{{ lookup('file', '/var/lib/awx/projects/clients/{{ member_id }}/{{ subscription_id }}/extra_vars.json') }}"
  156. job_type: run
  157. job_tags: "setup-all,start"
  158. inventory: "{{ member_id }}"
  159. project: "{{ member_id }} - Matrix Docker Ansible Deploy"
  160. playbook: setup.yml
  161. credential: "{{ member_id }} - AWX SSH Key"
  162. state: present
  163. verbosity: 1
  164. tower_host: "https://{{ awx_host }}"
  165. tower_oauthtoken: "{{ awx_session_token.ansible_facts.tower_token.token }}"
  166. validate_certs: yes
  167. when: (purge_mode.find("No local users [recommended]") != -1) or (purge_mode.find("Number of users [slower]") != -1) or (purge_mode.find("Number of events [slower]") != -1) or (purge_mode.find("Skip purging rooms [faster]") != -1)
  168. - name: Ensure matrix-synapse is stopped
  169. service:
  170. name: matrix-synapse
  171. state: stopped
  172. daemon_reload: yes
  173. when: (purge_mode.find("Perform final shrink") != -1)
  174. - name: Re-index Synapse database
  175. shell: docker exec -i matrix-postgres psql "host=127.0.0.1 port=5432 dbname=synapse user=synapse password={{ matrix_synapse_connection_password }}" -c 'REINDEX (VERBOSE) DATABASE synapse'
  176. when: (purge_mode.find("Perform final shrink") != -1)
  177. - name: Ensure matrix-synapse is started
  178. service:
  179. name: matrix-synapse
  180. state: started
  181. daemon_reload: yes
  182. when: (purge_mode.find("Perform final shrink") != -1)
  183. - name: Adjust 'Deploy/Update a Server' job template
  184. delegate_to: 127.0.0.1
  185. awx.awx.tower_job_template:
  186. name: "{{ matrix_domain }} - 0 - Deploy/Update a Server"
  187. description: "Creates a new matrix service with Spantaleev's playbooks"
  188. extra_vars: "{{ lookup('file', '/var/lib/awx/projects/clients/{{ member_id }}/{{ subscription_id }}/extra_vars.json') }}"
  189. job_type: run
  190. job_tags: "run-postgres-vacuum,start"
  191. inventory: "{{ member_id }}"
  192. project: "{{ member_id }} - Matrix Docker Ansible Deploy"
  193. playbook: setup.yml
  194. credential: "{{ member_id }} - AWX SSH Key"
  195. state: present
  196. verbosity: 1
  197. tower_host: "https://{{ awx_host }}"
  198. tower_oauthtoken: "{{ awx_session_token.ansible_facts.tower_token.token }}"
  199. validate_certs: yes
  200. when: (purge_mode.find("Perform final shrink") != -1)
  201. - name: Execute run-postgres-vacuum job template
  202. delegate_to: 127.0.0.1
  203. awx.awx.tower_job_launch:
  204. job_template: "{{ matrix_domain }} - 0 - Deploy/Update a Server"
  205. wait: yes
  206. tower_host: "https://{{ awx_host }}"
  207. tower_oauthtoken: "{{ awx_session_token.ansible_facts.tower_token.token }}"
  208. validate_certs: yes
  209. when: (purge_mode.find("Perform final shrink") != -1)
  210. - name: Revert 'Deploy/Update a Server' job template
  211. delegate_to: 127.0.0.1
  212. awx.awx.tower_job_template:
  213. name: "{{ matrix_domain }} - 0 - Deploy/Update a Server"
  214. description: "Creates a new matrix service with Spantaleev's playbooks"
  215. extra_vars: "{{ lookup('file', '/var/lib/awx/projects/clients/{{ member_id }}/{{ subscription_id }}/extra_vars.json') }}"
  216. job_type: run
  217. job_tags: "setup-all,start"
  218. inventory: "{{ member_id }}"
  219. project: "{{ member_id }} - Matrix Docker Ansible Deploy"
  220. playbook: setup.yml
  221. credential: "{{ member_id }} - AWX SSH Key"
  222. state: present
  223. verbosity: 1
  224. tower_host: "https://{{ awx_host }}"
  225. tower_oauthtoken: "{{ awx_session_token.ansible_facts.tower_token.token }}"
  226. validate_certs: yes
  227. when: (purge_mode.find("Perform final shrink") != -1)
  228. - name: Cleanup room_list files
  229. delegate_to: 127.0.0.1
  230. shell: |
  231. rm /tmp/{{ subscription_id }}_room_list*
  232. when: (purge_mode.find("No local users [recommended]") != -1) or (purge_mode.find("Number of users [slower]") != -1) or (purge_mode.find("Number of events [slower]") != -1)
  233. ignore_errors: yes
  234. - name: Collect after shrink size of Synapse database
  235. shell: du -sh /matrix/postgres/data
  236. register: db_size_after_stat
  237. when: (purge_mode.find("Perform final shrink") != -1)
  238. no_log: True
  239. - name: Print total number of rooms processed
  240. debug:
  241. msg: '{{ rooms_total.stdout }}'
  242. when: (purge_mode.find("No local users [recommended]") != -1) or (purge_mode.find("Number of users [slower]") != -1) or (purge_mode.find("Number of events [slower]") != -1)
  243. - name: Print the number of rooms purged with no local users
  244. debug:
  245. msg: '{{ rooms_no_local_total.stdout }}'
  246. when: (purge_mode.find("No local users [recommended]") != -1) or (purge_mode.find("Number of users [slower]") != -1) or (purge_mode.find("Number of events [slower]") != -1)
  247. - name: Print the number of rooms purged with more then N users
  248. debug:
  249. msg: '{{ rooms_join_members_total.stdout }}'
  250. when: purge_mode.find("Number of users") != -1
  251. - name: Print the number of rooms purged with more then N events
  252. debug:
  253. msg: '{{ rooms_state_events_total.stdout }}'
  254. when: purge_mode.find("Number of events") != -1
  255. - name: Print before purge size of Synapse database
  256. debug:
  257. msg: "{{ db_size_before_stat.stdout.split('\n') }}"
  258. when: (db_size_before_stat is defined) and (purge_mode.find("Perform final shrink") != -1)
  259. - name: Print after purge size of Synapse database
  260. debug:
  261. msg: "{{ db_size_after_stat.stdout.split('\n') }}"
  262. when: (db_size_after_stat is defined) and (purge_mode.find("Perform final shrink") != -1)
  263. - name: Delete the AWX session token for executing modules
  264. awx.awx.tower_token:
  265. description: 'AWX Session Token'
  266. scope: "write"
  267. state: absent
  268. existing_token_id: "{{ awx_session_token.ansible_facts.tower_token.id }}"
  269. tower_host: "https://{{ awx_host }}"
  270. tower_oauthtoken: "{{ awx_session_token.ansible_facts.tower_token.token }}"
  271. - name: Set boolean value to exit playbook
  272. set_fact:
  273. end_playbook: true
  274. - name: End playbook early if this task is called.
  275. meta: end_play
  276. when: end_playbook is defined and end_playbook|bool