deploy-pg.yml 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. ---
  2. - name: ensure a postgresql server is running and correctly configured
  3. hosts: dbservers
  4. gather_facts: no
  5. vars:
  6. pg_admin_pass: verysecret
  7. tasks:
  8. - name: check whether package is installed
  9. command: rpm -q postgresql-server
  10. ignore_errors: yes
  11. changed_when: false
  12. register: pg_is_there
  13. tags:
  14. - install
  15. - name: check whether PG_VERSION exists in datadir
  16. become: yes
  17. stat:
  18. path: /var/lib/pgsql/data/PG_VERSION
  19. register: pg_version_is_there
  20. tags:
  21. - install
  22. - name: ensure the server is at latest version
  23. become: true
  24. yum:
  25. name:
  26. - postgresql-server
  27. - python3-psycopg2
  28. state: latest
  29. register: install_status
  30. tags:
  31. - install
  32. - name: stop the server if this was an upgrade
  33. become: true
  34. service:
  35. name: postgresql
  36. state: stopped
  37. when:
  38. - not pg_is_there.failed
  39. - pg_version_is_there.stat.exists
  40. - install_status.changed
  41. tags:
  42. - install
  43. - name: decide what option to use for postgresql-setup
  44. set_fact:
  45. pgsetup: --initdb
  46. when: >
  47. (install_status.changed and pg_is_there.failed)
  48. or
  49. not pg_version_is_there.stat.exists
  50. tags:
  51. - install
  52. - name: decide what option to use for postgresql-setup
  53. set_fact:
  54. pgsetup: --upgrade
  55. when:
  56. - install_status.changed
  57. - not pg_is_there.failed
  58. tags:
  59. - install
  60. - name: initialise or upgrade the database
  61. become: yes
  62. command: postgresql-setup {{ pgsetup }}
  63. when: pgsetup is defined
  64. tags:
  65. - install
  66. - name: ensure the service is started
  67. become: yes
  68. service:
  69. name: postgresql
  70. state: started
  71. tags:
  72. - config
  73. - name: open ports if necessary
  74. become: yes
  75. firewalld:
  76. service: postgresql
  77. state: enabled
  78. immediate: yes
  79. permanent: yes
  80. tags:
  81. - config
  82. - name: ensure md5 authentication is configured for remote users (ipv4)
  83. become: yes
  84. become_user: postgres
  85. lineinfile:
  86. path: /var/lib/pgsql/data/pg_hba.conf
  87. regex: '^host\s+all\s+all\s+0\.0\.0\.0/0\s+'
  88. line: "host all all 0.0.0.0/0 md5"
  89. notify: reload postgres
  90. tags:
  91. - config
  92. - name: ensure md5 authentication is configured for remote users (ipv6)
  93. become: yes
  94. become_user: postgres
  95. lineinfile:
  96. path: /var/lib/pgsql/data/pg_hba.conf
  97. regex: '^host\s+all\s+all\s+::/0\s+'
  98. line: "host all all ::/0 md5"
  99. notify: reload postgres
  100. tags:
  101. - config
  102. - name: ensure the server is listening on all interfaces
  103. become: yes
  104. become_user: postgres
  105. lineinfile:
  106. path: /var/lib/pgsql/data/postgresql.conf
  107. regex: '^#?listen_addresses\s.*'
  108. line: "listen_addresses '*'"
  109. notify: restart postgres
  110. tags:
  111. - config
  112. - name: flush handlers
  113. meta: flush_handlers
  114. - name: ensure an admin user exists
  115. become: yes
  116. become_user: postgres
  117. postgresql_user:
  118. name: admin
  119. password: "{{ pg_admin_pass }}"
  120. state: present
  121. login_unix_socket: "/var/run/postgresql"
  122. role_attr_flags: SUPERUSER
  123. tags:
  124. - config
  125. - name: ensure the driver is installed on client machine
  126. become: true
  127. delegate_to: workstation.lab.example.com
  128. yum:
  129. name:
  130. - python3-psycopg2
  131. state: latest
  132. tags:
  133. - test
  134. - never
  135. - name: test the connection works
  136. delegate_to: workstation.lab.example.com
  137. postgresql_ping:
  138. login_host: "{{ inventory_hostname }}"
  139. login_user: admin
  140. login_password: "{{ pg_admin_pass }}"
  141. db: postgres
  142. register: ping_result
  143. tags:
  144. - test
  145. - never
  146. - assert:
  147. that: ping_result.is_available
  148. tags:
  149. - test
  150. - never
  151. handlers:
  152. - name: reload postgres
  153. become: yes
  154. service:
  155. name: postgresql
  156. state: reloaded
  157. - name: restart postgres
  158. become: yes
  159. service:
  160. name: postgresql
  161. state: restarted
  162. ...