main.yml 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. ---
  2. - name: Create trojan service user
  3. ansible.builtin.user:
  4. name: "{{ trojan_user }}"
  5. system: yes
  6. shell: /usr/sbin/nologin
  7. create_home: no
  8. - name: Create trojan config directory
  9. ansible.builtin.file:
  10. path: "{{ trojan_config_path | dirname }}"
  11. state: directory
  12. owner: "{{ trojan_user }}"
  13. group: "{{ trojan_user }}"
  14. mode: "0750"
  15. - name: Download trojan-go binary
  16. ansible.builtin.get_url:
  17. url: "https://github.com/p4gefau1t/trojan-go/releases/download/v{{ trojan_version }}/trojan-go-linux-amd64.zip"
  18. dest: /tmp/trojan-go.zip
  19. mode: "0644"
  20. - name: Create extraction directory
  21. ansible.builtin.file:
  22. path: /tmp/trojan-go-extract/
  23. state: directory
  24. mode: "0755"
  25. - name: Extract trojan-go binary
  26. ansible.builtin.unarchive:
  27. src: /tmp/trojan-go.zip
  28. dest: /tmp/trojan-go-extract/
  29. remote_src: yes
  30. creates: /tmp/trojan-go-extract/trojan-go
  31. - name: Install trojan-go binary
  32. ansible.builtin.copy:
  33. src: /tmp/trojan-go-extract/trojan-go
  34. dest: "{{ trojan_bin_path }}"
  35. remote_src: yes
  36. owner: root
  37. group: root
  38. mode: "0755"
  39. notify: restart trojan
  40. - name: Grant CAP_NET_BIND_SERVICE to trojan-go
  41. community.general.capabilities:
  42. path: "{{ trojan_bin_path }}"
  43. capability: cap_net_bind_service=+ep
  44. state: present
  45. - name: Clean up downloaded archive
  46. ansible.builtin.file:
  47. path: "{{ item }}"
  48. state: absent
  49. loop:
  50. - /tmp/trojan-go.zip
  51. - /tmp/trojan-go-extract
  52. - name: Install certbot
  53. ansible.builtin.apt:
  54. name:
  55. - certbot
  56. state: present
  57. - name: Obtain Let's Encrypt certificate
  58. ansible.builtin.command:
  59. cmd: >
  60. certbot certonly --standalone
  61. --non-interactive --agree-tos
  62. --email {{ certbot_email }}
  63. -d {{ trojan_domain }}
  64. creates: "/etc/letsencrypt/live/{{ trojan_domain }}/fullchain.pem"
  65. - name: Grant trojan user read access to TLS certificates
  66. ansible.builtin.file:
  67. path: /etc/letsencrypt
  68. state: directory
  69. mode: "0755"
  70. - name: Ensure live directory is accessible
  71. ansible.builtin.file:
  72. path: "/etc/letsencrypt/live/{{ trojan_domain }}"
  73. state: directory
  74. mode: "0755"
  75. - name: Ensure archive directory is accessible
  76. ansible.builtin.file:
  77. path: "/etc/letsencrypt/archive/{{ trojan_domain }}"
  78. state: directory
  79. mode: "0755"
  80. - name: Deploy certbot renewal hook for trojan
  81. ansible.builtin.copy:
  82. dest: /etc/letsencrypt/renewal-hooks/post/trojan-go.sh
  83. content: |
  84. #!/bin/bash
  85. mkdir -p /etc/trojan-go/tls
  86. cp /etc/letsencrypt/live/{{ trojan_domain }}/fullchain.pem /etc/trojan-go/tls/fullchain.pem
  87. cp /etc/letsencrypt/live/{{ trojan_domain }}/privkey.pem /etc/trojan-go/tls/privkey.pem
  88. chown -R {{ trojan_user }}:{{ trojan_user }} /etc/trojan-go/tls
  89. systemctl reload trojan-go
  90. owner: root
  91. group: root
  92. mode: "0755"
  93. - name: Copy initial TLS certificates to trojan-owned directory
  94. ansible.builtin.shell: |
  95. mkdir -p /etc/trojan-go/tls
  96. cp /etc/letsencrypt/live/{{ trojan_domain }}/fullchain.pem /etc/trojan-go/tls/fullchain.pem
  97. cp /etc/letsencrypt/live/{{ trojan_domain }}/privkey.pem /etc/trojan-go/tls/privkey.pem
  98. chown -R {{ trojan_user }}:{{ trojan_user }} /etc/trojan-go/tls
  99. args:
  100. creates: /etc/trojan-go/tls/privkey.pem
  101. notify: restart trojan
  102. - name: Deploy trojan-go configuration
  103. ansible.builtin.template:
  104. src: config.json.j2
  105. dest: "{{ trojan_config_path }}"
  106. owner: "{{ trojan_user }}"
  107. group: "{{ trojan_user }}"
  108. mode: "0640"
  109. notify: restart trojan
  110. - name: Deploy trojan-go systemd unit
  111. ansible.builtin.template:
  112. src: trojan-go.service.j2
  113. dest: /etc/systemd/system/trojan-go.service
  114. owner: root
  115. group: root
  116. mode: "0644"
  117. notify: restart trojan
  118. - name: Install nginx for Trojan fallback
  119. ansible.builtin.apt:
  120. name:
  121. - nginx
  122. state: present
  123. - name: Deploy nginx fallback config
  124. ansible.builtin.template:
  125. src: nginx-fallback.conf.j2
  126. dest: /etc/nginx/conf.d/trojan-fallback.conf
  127. owner: root
  128. group: root
  129. mode: "0644"
  130. notify: restart nginx
  131. - name: Create fallback web root
  132. ansible.builtin.file:
  133. path: /var/www/trojan-fallback
  134. state: directory
  135. owner: www-data
  136. group: www-data
  137. mode: "0755"
  138. - name: Deploy fallback index page
  139. ansible.builtin.copy:
  140. content: |
  141. <!DOCTYPE html>
  142. <html>
  143. <head><title>Welcome</title></head>
  144. <body><h1>Welcome</h1></body>
  145. </html>
  146. dest: /var/www/trojan-fallback/index.html
  147. owner: www-data
  148. group: www-data
  149. mode: "0644"
  150. notify: restart nginx
  151. - name: Remove default nginx site
  152. ansible.builtin.file:
  153. path: /etc/nginx/sites-enabled/default
  154. state: absent
  155. notify: restart nginx
  156. - name: Enable and start nginx
  157. ansible.builtin.systemd:
  158. name: nginx
  159. enabled: yes
  160. state: started
  161. - name: Enable and start trojan-go service
  162. ansible.builtin.systemd:
  163. name: trojan-go
  164. daemon_reload: yes
  165. enabled: yes
  166. state: started
  167. - name: Enable certbot auto-renewal timer
  168. ansible.builtin.systemd:
  169. name: certbot.timer
  170. enabled: yes
  171. state: started
  172. - name: Allow Trojan port through UFW
  173. community.general.ufw:
  174. rule: allow
  175. port: "{{ trojan_port }}"
  176. proto: tcp