31-quay-dependencies.yml 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. ---
  2. # Tasks required by 10-quay-deploy.adoc.
  3. - name: Prepare registry VM to run Quay services.
  4. hosts: registry.ocp4.example.com
  5. gather_subset: min
  6. tasks:
  7. - name: Ensure firewall allows HTTP/HTTPS.
  8. become: yes
  9. ansible.posix.firewalld:
  10. immediate: yes
  11. permanent: yes
  12. zone: public
  13. service: "{{ item }}"
  14. state: enabled
  15. loop:
  16. - http
  17. - https
  18. - name: Ensure unpriv users can open ports from 80 onwards.
  19. become: yes
  20. ansible.posix.sysctl:
  21. name: net.ipv4.ip_unprivileged_port_start
  22. value: "80"
  23. state: present
  24. sysctl_file: /etc/sysctl.d/quay-low-ports.conf
  25. reload: yes
  26. - name: Ensure user quay exists.
  27. become: yes
  28. ansible.builtin.user:
  29. name: quay
  30. create_home: yes
  31. state: present
  32. - name: Have the quay user accept student's SSH key.
  33. become: yes
  34. ansible.posix.authorized_key:
  35. key: "{{ lookup('ansible.builtin.file', '/home/student/.ssh/lab_rsa.pub') }}"
  36. user: quay
  37. state: present
  38. - name: Ensure user quay will linger.
  39. become: yes
  40. ansible.builtin.command:
  41. cmd: loginctl enable-linger quay
  42. creates: /var/lib/systemd/linger/quay
  43. - name: Ensure PG data directory is there.
  44. become: yes
  45. ansible.builtin.file:
  46. path: /local/quay-pg
  47. mode: 0770
  48. owner: quay
  49. group: quay
  50. state: directory
  51. - name: Ensure .docker directory is there
  52. become: yes
  53. ansible.builtin.file:
  54. path: "/home/quay/.docker"
  55. mode: 0700
  56. owner: quay
  57. group: quay
  58. state: directory
  59. # TODO: figure out how to customise this with registry host changes
  60. - name: Ensure podman will be able to log into the upstream registry
  61. become: yes
  62. ansible.builtin.copy:
  63. dest: "/home/quay/.docker/config.json"
  64. content: |
  65. {"auths":{"registry.redhat.io":{"auth":"fHVoYy1wb29sLTlmMDA1Mzc2LTM2YTItNDJhMS1hNTQwLTA0NzNkYzg3MzYzMzpleUpoYkdjaU9pSlNVelV4TWlKOS5leUp6ZFdJaU9pSTVPRGc1WVdFeFl6Qm1PV0kwWmpVM1lqazNObUk1WldFeU16SXdaalUwTUNKOS5zWmQ5VE1RbzBXREc2NUc5Qk1ObmtuYlBjRkIzNmhyRFhkMThfdTNLeHFaczdlOG1hQ19QeEFReGpwdVk0YVM2VERIbkxDNWpGYjRRNXFYVEpWbjJCOGE4cDFuY08tM24ySG5QdDg3NmktVUFDU3lldWtpb3k4aHI0V3d1ZkhReFVYMmxxWFhYdjN6blE3am1URUNBc25rWkNRSFU1dFNpRnNUZHhFZGZkeU42Z20xN3VqY2thZG5NbFBZcTZfU1I2bUtLaUpUdFQ3SFlDWXJBVk5zZ0tfNGFkZ2MtRXBlbEtHbGNERWkzNGhYbzFqbEIzRERyUWkxSUxCV0UwZkdXb1czZy1ZUzFGMFlEXzc0bm1XSU5mUE1jM25UOERaQWl0OEw0VlFPTnZnUE51YnVfTVVGUGhqX29VUjF3VUR0a1BRNktJdm82UWYyRkdwMndLM1B6YnRBRFFzRVZTZDlITzQ3a0RKdGFobk95YTFmRmdqZVk1bFNxLW1vT2RqUldCZ3U2XzNIX25lZExJR1lQRHRBZnp5cGJ1eHZ1cEd1M2hYWnVzeWN0aURtR203SkR5RW5KdjF1RFZmYVduU2EzSV9NcFRSVVcyZWU1RF9CanJleTdlU2I0bEpGcmp1eC1nY2JVaHFsWGJZc2l6azdXWHpvRmtrVFlMdXFDQ1FvS1J0OFdSN1UzTmh3c3Q2ckV3eEFOaWJFTlNzUVB3MGg4X0NDRm5qTHFSTl82cWpTc0tpeWRGT2tHVFliT0taTktaSVVhYkZFTjRhYVRVYmlYTVdPS2Eyak1xLUhwazBMNEowUmtOM2JkQVVqWmtERHE0ZFY1ZVFjdXNIeV9LY29nd1VKSjZ4MDNObnM4b0xBdjRJZ3RKeXlxcmE1YUJHSkxReHNjRXVSNzQwWQ=="}}}
  66. mode: 0600
  67. owner: quay
  68. group: quay
  69. - name: Configure containers and their environment on registry VM.
  70. hosts: registry.ocp4.example.com
  71. gather_subset: min
  72. remote_user: quay
  73. tasks:
  74. - name: Create a podman network, if necessary.
  75. containers.podman.podman_network:
  76. name: quay
  77. state: present
  78. - name: Pull all the images if necessary.
  79. containers.podman.podman_image:
  80. name: "{{ registry_host }}/{{ item }}"
  81. pull: yes
  82. state: present
  83. loop:
  84. - rhel9/postgresql-15:latest
  85. - rhel9/redis-7:latest
  86. # TODO: recursive!
  87. - name: Ensure PG datadir is owned by the correct user.
  88. become_method: containers.podman.podman_unshare
  89. become: yes
  90. ansible.builtin.file:
  91. path: /local/quay-pg
  92. state: directory
  93. owner: 26
  94. mode: 0770
  95. - name: Start postgres container if necessary.
  96. containers.podman.podman_container:
  97. name: postgresql
  98. image: "{{ registry_host }}/rhel9/postgresql-15:latest"
  99. rm: yes
  100. detach: yes
  101. env:
  102. POSTGRESQL_USER: quay
  103. POSTGRESQL_PASSWORD: secret
  104. POSTGRESQL_DATABASE: quay
  105. POSTGRESQL_ADMIN_PASSWORD: verysecret
  106. network:
  107. - quay
  108. volumes:
  109. - /local/quay-pg:/var/lib/pgsql/data:Z
  110. state: started
  111. register: pg_started
  112. - name: Wait for the PostgreSQL container to become ready if it was changed in any way.
  113. containers.podman.podman_container_info:
  114. name: postgresql
  115. when: pg_started.changed
  116. register: pg_info
  117. until: pg_info.containers[0].State.Running
  118. retries: 12
  119. delay: 5
  120. - name: Wait for the server inside container to start up.
  121. containers.podman.podman_container_exec:
  122. name: postgresql
  123. command: 'psql -d quay -U postgres -c "SELECT 1"'
  124. when: pg_started.changed
  125. changed_when: no
  126. register: pg_rdy
  127. until: pg_rdy.rc == 0
  128. retries: 10
  129. delay: 3
  130. - name: Create the trigram extension if necessary.
  131. containers.podman.podman_container_exec:
  132. name: postgresql
  133. command: 'psql -d quay -U postgres -c "CREATE EXTENSION IF NOT EXISTS pg_trgm"'
  134. register: pg_ext
  135. changed_when:
  136. - not "already exists" in pg_ext.stderr
  137. - name: If we started the PG container and created the extension, stop the container now.
  138. containers.podman.podman_container:
  139. name: postgresql
  140. state: stopped
  141. when:
  142. - pg_started.changed
  143. - pg_ext.changed
  144. - name: Ensure systemd user dir is there.
  145. ansible.builtin.file:
  146. path: "{{ ansible_facts['user_dir'] }}/.config/systemd/user"
  147. state: directory
  148. - name: Deploy service units.
  149. ansible.builtin.template:
  150. dest: "{{ ansible_facts['user_dir'] }}/.config/systemd/user/{{ item }}"
  151. src: "templates/{{ item }}.j2"
  152. loop:
  153. - quay-pg.service
  154. - quay-redis.service
  155. - name: Reload systemd.
  156. ansible.builtin.systemd_service:
  157. daemon_reload: yes
  158. scope: user
  159. - name: Enable services and start them.
  160. ansible.builtin.systemd_service:
  161. name: "{{ item }}"
  162. scope: user
  163. state: started
  164. enabled: yes
  165. loop:
  166. - quay-pg
  167. - quay-redis
  168. ...