nas-storage.yml 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. ---
  2. - hosts: nas
  3. gather_facts: true
  4. become: true
  5. roles:
  6. - snapraid
  7. - mergerfs
  8. - linux-system-roles.firewall
  9. - linux-system-roles.selinux
  10. - vladgh.samba.server
  11. vars_files:
  12. - "{{ inventory_dir }}/vars/vault.yaml"
  13. vars:
  14. # don't allow playbook to auto reboot server when changes are made to mountpoints
  15. ALLOW_REBOOT_ON_STORAGE_CHANGE: False
  16. samba_guest_account: "{{ vaulted_media_user }}"
  17. samba_map_to_guest: bad user
  18. samba_netbios_name: "{{ ansible_hostname }}"
  19. samba_load_printers: false
  20. samba_mitigate_cve_2017_7494: false # enabling this breaks share browsing plus this is already mitigated by SELinux
  21. samba_shares_root: /mergerfs
  22. samba_users:
  23. - name: "{{ vaulted_media_user }}"
  24. password: "{{ vaulted_media_password }}"
  25. samba_shares:
  26. - name: Data
  27. path: /mergerfs/public
  28. force_create_mode: '0664'
  29. force_directory_mode: '0775'
  30. guest_ok: "yes"
  31. writable: "yes"
  32. public: "yes"
  33. owner: "{{ vaulted_media_user }}"
  34. group: "{{ vaulted_media_group }}"
  35. - name: private
  36. path: /mergerfs/private
  37. force_create_mode: '0664'
  38. force_directory_mode: '0775'
  39. valid_users: "{{ vaulted_media_user }}"
  40. write_list: "{{ vaulted_media_user }}"
  41. owner: "{{ vaulted_media_user }}"
  42. group: "{{ vaulted_media_group }}"
  43. snapraid_parity_disks:
  44. - path: /mnt/parity1
  45. parity: parity
  46. disk: /dev/mapper/luks-parity1
  47. crypted_disk: /dev/disk/by-id/ata-WDC_WD140EFGX-68B0GN0_9LJB0KBG
  48. opts: _netdev
  49. - path: /mnt/parity2
  50. parity: 2-parity
  51. disk: /dev/mapper/luks-parity2
  52. crypted_disk: /dev/disk/by-id/ata-WDC_WD161KFGX-68AFPN0_3HH7TZHN
  53. opts: _netdev
  54. snapraid_data_disks:
  55. - path: /mnt/disk1
  56. disk: /dev/mapper/luks-disk1
  57. crypted_disk: /dev/disk/by-id/ata-WDC_WD101EFBX-68B0AN0_VCJW0TDP
  58. opts: _netdev
  59. owner: "{{ vaulted_media_user }}"
  60. group: "{{ vaulted_media_group }}"
  61. - path: /mnt/disk2
  62. disk: /dev/mapper/luks-disk2
  63. crypted_disk: /dev/disk/by-id/ata-WDC_WD101EFAX-68LDBN0_VCG6YNSN
  64. opts: _netdev
  65. owner: "{{ vaulted_media_user }}"
  66. group: "{{ vaulted_media_group }}"
  67. - path: /mnt/disk3
  68. disk: /dev/mapper/luks-disk3
  69. crypted_disk: /dev/disk/by-id/ata-WDC_WD101EFAX-68LDBN0_VCG6VGPN
  70. opts: _netdev
  71. owner: "{{ vaulted_media_user }}"
  72. group: "{{ vaulted_media_group }}"
  73. - path: /mnt/disk4
  74. disk: /dev/mapper/luks-disk4
  75. crypted_disk: /dev/disk/by-id/ata-WDC_WD140EFGX-68B0GN0_9LJ4N5JG
  76. opts: _netdev
  77. owner: "{{ vaulted_media_user }}"
  78. group: "{{ vaulted_media_group }}"
  79. - path: /mnt/disk5
  80. disk: /dev/mapper/luks-disk5
  81. crypted_disk: /dev/disk/by-id/ata-WDC_WD101EFAX-68LDBN0_VCG7HUBN
  82. opts: _netdev
  83. owner: "{{ vaulted_media_user }}"
  84. group: "{{ vaulted_media_group }}"
  85. - path: /mnt/disk6
  86. disk: /dev/mapper/luks-disk6
  87. crypted_disk: /dev/disk/by-id/ata-WDC_WD101EFAX-68LDBN0_VCG6YXAN
  88. opts: _netdev
  89. owner: "{{ vaulted_media_user }}"
  90. group: "{{ vaulted_media_group }}"
  91. mergerfs_disks: "{{ snapraid_data_disks }}"
  92. mergerfs_fstab:
  93. - path: /mergerfs
  94. owner: "{{ vaulted_media_user }}"
  95. group: "{{ vaulted_media_group }}"
  96. source: /mnt/disk*
  97. opts:
  98. - allow_other
  99. - minfreespace=10G
  100. - category.create=mfs
  101. - use_ino
  102. - func.getattr=newest
  103. - fsname=mergerfs
  104. - _netdev
  105. - nonempty
  106. selinux_booleans:
  107. - name: samba_share_fusefs
  108. state: on
  109. persistent: yes
  110. firewall:
  111. - service: samba
  112. state: enabled
  113. - service: netbios-ns
  114. state: enabled
  115. server_notifications_topic: "{{ vaulted_server_notifications_topic }}"
  116. pre_tasks:
  117. - name: Create Media Group
  118. group:
  119. name: "{{ vaulted_media_group }}"
  120. gid: "{{ vaulted_media_gid }}"
  121. - name: Create Media User
  122. user:
  123. name: "{{ vaulted_media_user }}"
  124. uid: "{{ vaulted_media_uid }}"
  125. groups: "{{ vaulted_media_group }}"
  126. append: yes
  127. shell: /bin/bash
  128. - name: Ensure disks are configured in /etc/crypttab
  129. lineinfile:
  130. path: /etc/crypttab
  131. regexp: '^{{ item.disk | split("/") | last }}'
  132. line: '{{ item.disk | split("/") | last }} {{ item.crypted_disk }} none {{ item.opts }}'
  133. with_items:
  134. - "{{ snapraid_parity_disks }}"
  135. - "{{ snapraid_data_disks }}"
  136. notify:
  137. - Reboot
  138. - name: Ensure disks are configured in /etc/fstab
  139. mount:
  140. path: "{{ item.path }}"
  141. src: "{{ item.disk }}"
  142. fstype: xfs
  143. opts: "{{ item.opts }}"
  144. state: present
  145. with_items:
  146. - "{{ snapraid_parity_disks }}"
  147. - "{{ snapraid_data_disks }}"
  148. notify:
  149. - Reboot
  150. - name: Ensure mountpoints exist
  151. file:
  152. path: "{{ item.path }}"
  153. state: directory
  154. with_items:
  155. - "{{ snapraid_parity_disks }}"
  156. - "{{ snapraid_data_disks }}"
  157. notify:
  158. - Reboot
  159. - meta: flush_handlers
  160. handlers:
  161. - name: Reboot
  162. reboot:
  163. post_reboot_delay: 120 # wait 2 minutes for disks to fully decrypt and mount themselves
  164. when:
  165. - ALLOW_REBOOT_ON_STORAGE_CHANGE == True