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.
 
 

318 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: Ensure dateutils, curl and jq intalled on target machine
  7. apt:
  8. pkg:
  9. - curl
  10. - jq
  11. state: present
  12. - name: Include vars in matrix_vars.yml
  13. include_vars:
  14. file: '/var/lib/awx/projects/clients/{{ member_id }}/{{ subscription_id }}/matrix_vars.yml'
  15. no_log: True
  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: Collect AWX admin token the hard way!
  124. delegate_to: 127.0.0.1
  125. shell: |
  126. curl -sku {{ tower_username }}:{{ tower_password }} -H "Content-Type: application/json" -X POST -d '{"description":"Tower CLI", "application":null, "scope":"write"}' https://{{ tower_host }}/api/v2/users/1/personal_tokens/ | jq '.token' | sed -r 's/\"//g'
  127. register: tower_token
  128. no_log: True
  129. - name: Adjust 'Deploy/Update a Server' job template
  130. delegate_to: 127.0.0.1
  131. awx.awx.tower_job_template:
  132. name: "{{ matrix_domain }} - 0 - Deploy/Update a Server"
  133. description: "Creates a new matrix service with Spantaleev's playbooks"
  134. extra_vars: "{{ lookup('file', '/var/lib/awx/projects/clients/{{ member_id }}/{{ subscription_id }}/extra_vars.json') }}"
  135. job_type: run
  136. job_tags: "rust-synapse-compress-state"
  137. inventory: "{{ member_id }}"
  138. project: "{{ member_id }} - Matrix Docker Ansible Deploy"
  139. playbook: setup.yml
  140. credential: "{{ member_id }} - AWX SSH Key"
  141. state: present
  142. verbosity: 1
  143. tower_host: "https://{{ tower_host }}"
  144. tower_oauthtoken: "{{ tower_token.stdout }}"
  145. validate_certs: yes
  146. 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)
  147. - name: Execute rust-synapse-compress-state job template
  148. delegate_to: 127.0.0.1
  149. awx.awx.tower_job_launch:
  150. job_template: "{{ matrix_domain }} - 0 - Deploy/Update a Server"
  151. wait: yes
  152. tower_host: "https://{{ tower_host }}"
  153. tower_oauthtoken: "{{ tower_token.stdout }}"
  154. validate_certs: yes
  155. 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)
  156. - name: Revert 'Deploy/Update a Server' job template
  157. delegate_to: 127.0.0.1
  158. awx.awx.tower_job_template:
  159. name: "{{ matrix_domain }} - 0 - Deploy/Update a Server"
  160. description: "Creates a new matrix service with Spantaleev's playbooks"
  161. extra_vars: "{{ lookup('file', '/var/lib/awx/projects/clients/{{ member_id }}/{{ subscription_id }}/extra_vars.json') }}"
  162. job_type: run
  163. job_tags: "setup-all,start"
  164. inventory: "{{ member_id }}"
  165. project: "{{ member_id }} - Matrix Docker Ansible Deploy"
  166. playbook: setup.yml
  167. credential: "{{ member_id }} - AWX SSH Key"
  168. state: present
  169. verbosity: 1
  170. tower_host: "https://{{ tower_host }}"
  171. tower_oauthtoken: "{{ tower_token.stdout }}"
  172. validate_certs: yes
  173. 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)
  174. - name: Ensure matrix-synapse is stopped
  175. service:
  176. name: matrix-synapse
  177. state: stopped
  178. daemon_reload: yes
  179. when: (purge_mode.find("Perform final shrink") != -1)
  180. - name: Re-index Synapse database
  181. 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'
  182. when: (purge_mode.find("Perform final shrink") != -1)
  183. - name: Ensure matrix-synapse is started
  184. service:
  185. name: matrix-synapse
  186. state: started
  187. daemon_reload: yes
  188. when: (purge_mode.find("Perform final shrink") != -1)
  189. - name: Adjust 'Deploy/Update a Server' job template
  190. delegate_to: 127.0.0.1
  191. awx.awx.tower_job_template:
  192. name: "{{ matrix_domain }} - 0 - Deploy/Update a Server"
  193. description: "Creates a new matrix service with Spantaleev's playbooks"
  194. extra_vars: "{{ lookup('file', '/var/lib/awx/projects/clients/{{ member_id }}/{{ subscription_id }}/extra_vars.json') }}"
  195. job_type: run
  196. job_tags: "run-postgres-vacuum,start"
  197. inventory: "{{ member_id }}"
  198. project: "{{ member_id }} - Matrix Docker Ansible Deploy"
  199. playbook: setup.yml
  200. credential: "{{ member_id }} - AWX SSH Key"
  201. state: present
  202. verbosity: 1
  203. tower_host: "https://{{ tower_host }}"
  204. tower_oauthtoken: "{{ tower_token.stdout }}"
  205. validate_certs: yes
  206. when: (purge_mode.find("Perform final shrink") != -1)
  207. - name: Execute run-postgres-vacuum job template
  208. delegate_to: 127.0.0.1
  209. awx.awx.tower_job_launch:
  210. job_template: "{{ matrix_domain }} - 0 - Deploy/Update a Server"
  211. wait: yes
  212. tower_host: "https://{{ tower_host }}"
  213. tower_oauthtoken: "{{ tower_token.stdout }}"
  214. validate_certs: yes
  215. when: (purge_mode.find("Perform final shrink") != -1)
  216. - name: Revert 'Deploy/Update a Server' job template
  217. delegate_to: 127.0.0.1
  218. awx.awx.tower_job_template:
  219. name: "{{ matrix_domain }} - 0 - Deploy/Update a Server"
  220. description: "Creates a new matrix service with Spantaleev's playbooks"
  221. extra_vars: "{{ lookup('file', '/var/lib/awx/projects/clients/{{ member_id }}/{{ subscription_id }}/extra_vars.json') }}"
  222. job_type: run
  223. job_tags: "setup-all,start"
  224. inventory: "{{ member_id }}"
  225. project: "{{ member_id }} - Matrix Docker Ansible Deploy"
  226. playbook: setup.yml
  227. credential: "{{ member_id }} - AWX SSH Key"
  228. state: present
  229. verbosity: 1
  230. tower_host: "https://{{ tower_host }}"
  231. tower_oauthtoken: "{{ tower_token.stdout }}"
  232. validate_certs: yes
  233. when: (purge_mode.find("Perform final shrink") != -1)
  234. - name: Cleanup room_list files
  235. delegate_to: 127.0.0.1
  236. shell: |
  237. rm /tmp/{{ subscription_id }}_room_list*
  238. 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)
  239. ignore_errors: yes
  240. - name: Collect after shrink size of Synapse database
  241. shell: du -sh /matrix/postgres/data
  242. register: db_size_after_stat
  243. when: (purge_mode.find("Perform final shrink") != -1)
  244. no_log: True
  245. - name: Print total number of rooms processed
  246. debug:
  247. msg: '{{ rooms_total.stdout }}'
  248. 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)
  249. - name: Print the number of rooms purged with no local users
  250. debug:
  251. msg: '{{ rooms_no_local_total.stdout }}'
  252. 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)
  253. - name: Print the number of rooms purged with more then N users
  254. debug:
  255. msg: '{{ rooms_join_members_total.stdout }}'
  256. when: purge_mode.find("Number of users") != -1
  257. - name: Print the number of rooms purged with more then N events
  258. debug:
  259. msg: '{{ rooms_state_events_total.stdout }}'
  260. when: purge_mode.find("Number of events") != -1
  261. - name: Print before purge size of Synapse database
  262. debug:
  263. msg: "{{ db_size_before_stat.stdout.split('\n') }}"
  264. when: (db_size_before_stat is defined) and (purge_mode.find("Perform final shrink") != -1)
  265. - name: Print after purge size of Synapse database
  266. debug:
  267. msg: "{{ db_size_after_stat.stdout.split('\n') }}"
  268. when: (db_size_after_stat is defined) and (purge_mode.find("Perform final shrink") != -1)
  269. - name: Set boolean value to exit playbook
  270. set_fact:
  271. end_playbook: true
  272. - name: End playbook early if this task is called.
  273. meta: end_play
  274. when: end_playbook is defined and end_playbook|bool