From 94d4700d760acc70cbadebcb685a313b652837fc Mon Sep 17 00:00:00 2001 From: Daniel Berteaud Date: Mon, 27 Apr 2020 16:00:11 +0200 Subject: [PATCH] Update to 2020-04-27 16:00 --- roles/seafile/defaults/.main.yml.swp | Bin 0 -> 16384 bytes roles/seafile/tasks/.install.yml.swp | Bin 0 -> 20480 bytes roles/seafile/tasks/archive_post.yml | 15 + roles/seafile/tasks/archive_pre.yml | 38 +++ roles/seafile/tasks/cleanup.yml | 11 + roles/seafile/tasks/conf.yml | 45 +++ roles/seafile/tasks/directories.yml | 37 +++ roles/seafile/tasks/facts.yml | 81 +++++ roles/seafile/tasks/install.yml | 212 +++++++++++++ roles/seafile/tasks/iptables.yml | 10 + roles/seafile/tasks/main.yml | 540 +--------------------------------- roles/seafile/tasks/services.yml | 10 + roles/seafile/tasks/user.yml | 6 + roles/seafile/tasks/write_version.yml | 6 + 14 files changed, 482 insertions(+), 529 deletions(-) create mode 100644 roles/seafile/defaults/.main.yml.swp create mode 100644 roles/seafile/tasks/.install.yml.swp create mode 100644 roles/seafile/tasks/archive_post.yml create mode 100644 roles/seafile/tasks/archive_pre.yml create mode 100644 roles/seafile/tasks/cleanup.yml create mode 100644 roles/seafile/tasks/conf.yml create mode 100644 roles/seafile/tasks/directories.yml create mode 100644 roles/seafile/tasks/facts.yml create mode 100644 roles/seafile/tasks/install.yml create mode 100644 roles/seafile/tasks/iptables.yml create mode 100644 roles/seafile/tasks/services.yml create mode 100644 roles/seafile/tasks/user.yml create mode 100644 roles/seafile/tasks/write_version.yml diff --git a/roles/seafile/defaults/.main.yml.swp b/roles/seafile/defaults/.main.yml.swp new file mode 100644 index 0000000000000000000000000000000000000000..be0af9db34a81854607b49961ba5c353e00fd7bc GIT binary patch literal 16384 zcmeHOON<;x8SXdsaZLVLe zZEjzpEYp5{p+hbsQ44r1RUm3g_owCi@==BLuI$&vf(fM^)O#`zrk)s~O`S539PA8wY9@Am{wbvRx(gBFv-9JPP^4?P}=Ow6YS%U>`scy zw~~R9fs%oefs%oefs%oefs%oef&Xg;Y<$Xj1uZ<4w{nm_?>h3lJAeOJ{**`L`D^(o z87LVj87LVj87LVj87LVj87LVj87LVj87LX}A7p_0j`K;_^&8so0YAgx$xngr178EK1D^#R1s(?eh{KmZ06zil0Jnh` zfDK?BmSccM!k`0@a5!-mW>Nths{C zySBmdWM&n+Aw-;(_xYizvYyhgw5z$6!i<|*XuO#y%R8*q7*m&~rAjV6T_vSFj)TMW zA3?y<3ne4d27>!SyF9T27qxl94OCwxw!@y`fe{X43#?*{stg-5ULw}Y3eO7Pjkz6| z&eTl4qH8G~R++9N;-ToU&t18)M1wTL5Iz}_#!L%B+r4Sv6o-2XK(3k8_GU2tUJ$U)eRAyP)VBi zm;|g-AY5C=#JPpk{R?Oo;(BTtw6G&D$&;nuDZ1q-@5I2U&($jR>ak9rElRtA z&ttc*RT8_n7-fa-usJwiuyVRO)STuiq$zEF>i+B{mXE5r)b*=KfQE?c!@0_nbE^9S zJpFvYjaebLsun5SiarMQN{owIDyq)KT81cdiL6-jSI#us)yjNjyg06g*-hQwN()q~ z6CIUWhao5=*hOA;;m;s6=rfO}%Da_w3T4Vov# z)p=G?$;vL>jGL!wh6YZdGSTwnW|JcF=nrapp!S8HPt8L8#~X8myN=`yu== zbCW!74u?@D6XaqYbTl$P^&f&jG0ml!()nkeAr4^N_>5cBY%IbO%Vy&uJdfg07HGg0 z)XQiO(H^7C9VlaI=D^_TKu{FJbC7i1SZNCh8n>0kHMYCG&Qyj7~4Y@3OFQF5vI*RshC10WZS}6Ej`P)=LutIM$L6Fst^-&p>khzeZH5P z(P7Jt<;D?7hfy~`RN|ENjrhVJ9m~X+t}UmJ}J6TgbS9d7NsZOQ+1| zB2-b@^6`~PW{68M9VH4id8)}K0FtaS%_GcSU|Fzz2?s!{`yvu>LO6!(u}E2p4~UjN z8wfqtV`+q+oX#oyO$1U(7)>jv&+}9QmXiq6CfgrKZ;+A$S1?)q;BLfIC_;~W1FUQ^ z20N_TI$LYtPqWi(wwle9H%q-0Q48?&rJ+89^W;TG+WaomPzR+J;W^|vlMtaJV++zC z^E}KI9hN@E=!9e#yx~H`6qca#==YpdlI|<*Phl3UGg^ic$x%8YLSZ?q*O=chw8l-F zByr5H%q`mO#?pB9f+`AC;i0)1 zq{Heew#8NG5#?Na1Gy($GvG}GsHMea(Of*&ZZsF$Ex{YSx9E%IcB|dyi{7&5H@&3> z_xVtLQ9NBY7Au`%b5H{lzJ_+X*(y#Cn8w(K@&#LAGbZU8Ps^Cr)-+QQ(U#IfruVkQPpk$zApk$zApk$zA zpk$zApk$zApk&|!Gf?bc4L(4+d~bN9xJjp$d=KZc>1h-W(&&Vd4hHEkVQYJn316mP z%Vycd^pug|t46r`EF(>kjQVs^N+(hiUmO*EL&LdaaTcPKZ))OzhjI2F-0Rp>@8B~i z4#H5MW@N@@uZImcqmN2R&W<#vpEMh3g=?jyW3b8wj!e8jB|gKql)blKAAL7Wvt=I) wEBV&Gf_l?40XjuVHIVtK3B~3=Jz>Tf!|2>3`v~mvK2^8WV5eF7*K)=AH<*jryZ`_I literal 0 HcmV?d00001 diff --git a/roles/seafile/tasks/.install.yml.swp b/roles/seafile/tasks/.install.yml.swp new file mode 100644 index 0000000000000000000000000000000000000000..5093cd3576a9134ef32fec1ca04d864b937dc1c0 GIT binary patch literal 20480 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 S7%pc*F=OAMA`oP!LjDUqdeI61 literal 0 HcmV?d00001 diff --git a/roles/seafile/tasks/archive_post.yml b/roles/seafile/tasks/archive_post.yml new file mode 100644 index 0000000..f0ccd03 --- /dev/null +++ b/roles/seafile/tasks/archive_post.yml @@ -0,0 +1,15 @@ +--- + +- name: Compress previous version + command: tar cJf {{ seafile_root_dir }}/archives/{{ seafile_current_version.stdout }}.txz ./ + environment: + XZ_OPT: -T0 + args: + chdir: "{{ seafile_root_dir }}/archives/{{ seafile_current_version.stdout }}" + warn: False + tags: seafile + +- name: Remove archive directory + file: path={{ seafile_root_dir }}/archives/{{ seafile_current_version.stdout }} state=absent + tags: seafile + diff --git a/roles/seafile/tasks/archive_pre.yml b/roles/seafile/tasks/archive_pre.yml new file mode 100644 index 0000000..2bb4fef --- /dev/null +++ b/roles/seafile/tasks/archive_pre.yml @@ -0,0 +1,38 @@ +--- + +- name: Create archive directory + file: path={{ seafile_root_dir }}/archives/{{ seafile_current_version.stdout }} state=directory + tags: seafile + +- name: Stop the service during upgrade + service: name={{ item }} state=stopped + with_items: + - seafile + - seahub + tags: seafile + +- name: Backup the databases + mysql_db: + state: dump + name: "{{ item }}" + target: "{{ seafile_root_dir }}/archives/{{ seafile_current_version.stdout }}/{{ item }}.sql" + login_host: "{{ seafile_db_server }}" + login_user: sqladmin + login_password: "{{ mysql_admin_pass }}" + quick: True + single_transaction: True + with_items: + - "{{ seafile_db_seafile }}" + - "{{ seafile_db_ccnet }}" + - "{{ seafile_db_seahub }}" + tags: seafile + +- name: Archive seafile server + synchronize: + src: "{{ seafile_root_dir }}/seafile-server" + dest: "{{ seafile_root_dir }}/archives/{{ seafile_current_version.stdout }}/" + recursive: True + delete: True + delegate_to: "{{ inventory_hostname }}" + tags: seafile + diff --git a/roles/seafile/tasks/cleanup.yml b/roles/seafile/tasks/cleanup.yml new file mode 100644 index 0000000..b4a32cc --- /dev/null +++ b/roles/seafile/tasks/cleanup.yml @@ -0,0 +1,11 @@ +--- + +- name: Remove tmp files + file: path={{ item }} state=absent + with_items: + - "{{ seafile_root_dir }}/tmp/seafile-server_{{ seafile_version }}_x86-64.tar.gz" + - "{{ seafile_root_dir }}/tmp/seafile-server-{{ seafile_version }}" + - "{{ seafile_root_dir }}/tmp/seafile-pro-server_{{ seafile_version }}_x86-64.tar.gz" + - "{{ seafile_root_dir }}/tmp/seafile-pro-server-{{ seafile_version }}" + - "/etc/cron.d/seafil_gc" + tags: seafile diff --git a/roles/seafile/tasks/conf.yml b/roles/seafile/tasks/conf.yml new file mode 100644 index 0000000..725af1d --- /dev/null +++ b/roles/seafile/tasks/conf.yml @@ -0,0 +1,45 @@ +--- + +- name: Generate an RSA private key + command: openssl genrsa -out {{ seafile_root_dir }}/ccnet/mykey.peer 2048 + args: + creates: "{{ seafile_root_dir }}/ccnet/mykey.peer" + tags: seafile + +- name: Deploy seafile configuration + template: src={{ item }}.j2 dest={{ seafile_root_dir }}/conf/{{ item }} group={{ seafile_group }} mode=640 + with_items: + - ccnet.conf + - seafdav.conf + - seafile.conf + - seahub_settings.py + - gunicorn.conf + notify: + - restart seafile + - restart seahub + tags: seafile + +- name: Deploy seafile pro configuration + template: src={{ item }}.j2 dest={{ seafile_root_dir }}/conf/{{ item }} group={{ seafile_group }} mode=640 + with_items: + - seafevents.conf + when: seafile_license is defined + notify: + - restart seafile + - restart seahub + tags: seafile + +- name: Deploy ccnet ini file + copy: + content: | + {{ seafile_data_dir }} + dest: "{{ seafile_root_dir }}/ccnet/seafile.ini" + notify: + - restart seafile + - restart seahub + tags: seafile + +- name: Deploy initial admin info + template: src=admin.txt.j2 dest={{ seafile_root_dir }}/conf/admin.txt group={{ seafile_group }} mode=640 + when: seafile_install_mode == 'install' + tags: seafile diff --git a/roles/seafile/tasks/directories.yml b/roles/seafile/tasks/directories.yml new file mode 100644 index 0000000..161db63 --- /dev/null +++ b/roles/seafile/tasks/directories.yml @@ -0,0 +1,37 @@ +--- + +- name: Create directories + file: path={{ item.dir }} state=directory owner={{ item.owner | default(omit) }} group={{ item.group | default(omit) }} mode={{ item.mode | default(omit) }} + with_items: + - dir: "{{ seafile_root_dir }}/tmp" + mode: 700 + - dir: "{{ seafile_root_dir }}/meta" + mode: 700 + - dir: "{{ seafile_root_dir }}/archives" + mode: 700 + - dir: "{{ seafile_root_dir }}" + - dir: "{{ seafile_root_dir }}/fuse" + - dir: "{{ seafile_root_dir }}/seafile-server" + - dir: "{{ seafile_root_dir }}/conf" + - dir: "{{ seafile_root_dir }}/ccnet" + - dir: "{{ seafile_root_dir }}/logs" + - dir: "{{ seafile_root_dir }}/pids" + - dir: "{{ seafile_data_dir }}" + - dir: "{{ seafile_data_dir }}/thumbnails" + - dir: "{{ seafile_data_dir }}/seahub" + - dir: "{{ seafile_data_dir }}/seahub/custom" + owner: "{{ seafile_user }}" + group: "{{ seafile_user }}" + - dir: "{{ seafile_data_dir }}/seahub/cache" + owner: "{{ seafile_user }}" + group: "{{ seafile_user }}" + - dir: "{{ seafile_data_dir }}/seahub/avatars" + owner: "{{ seafile_user }}" + group: "{{ seafile_user }}" + - dir: "{{ seafile_data_dir }}/pro" + - dir: "{{ seafile_data_dir }}/backup" + mode: 700 + owner: root + group: root + ignore_errors: True # So we can run when the fuse mount point is active + tags: seafile diff --git a/roles/seafile/tasks/facts.yml b/roles/seafile/tasks/facts.yml new file mode 100644 index 0000000..9dc4dd7 --- /dev/null +++ b/roles/seafile/tasks/facts.yml @@ -0,0 +1,81 @@ +--- + +- name: Set default install mode + set_fact: seafile_install_mode='none' + tags: seafile + +# Makes sur we do not have a trailing / on the public url +- set_fact: seafile_public_url={{ seafile_public_url | regex_replace('/$','') }} + tags: seafile + +- name: Check if seafile is installed + stat: path={{ seafile_root_dir }}/meta/ansible_version + register: seafile_version_file + tags: seafile + +- name: Check installed version + command: cat {{ seafile_root_dir }}/meta/ansible_version + register: seafile_current_version + when: seafile_version_file.stat.exists + changed_when: False + tags: seafile + +- name: Set install mode to install + set_fact: seafile_install_mode='install' + when: not seafile_version_file.stat.exists + tags: seafile + +- name: Set install mode to upgrade + set_fact: seafile_install_mode='upgrade' + when: + - seafile_version_file.stat.exists + - seafile_current_version is defined + - seafile_current_version.stdout != seafile_version + tags: seafile + +# Needed to have consistent behaviour with the various components +# which do not all support unix socket +- name: Set DB server to 127.0.0.1 + set_fact: seafile_db_server="127.0.0.1" + when: seafile_db_server == 'localhost' + tags: seafile + +- name: Generate a ID for seahub + shell: date | sha1sum | awk '{ print $1 }' > {{ seafile_root_dir }}/meta/ansible_ccnet_id + args: + creates: "{{ seafile_root_dir }}/meta/ansible_ccnet_id" + when: seafile_ccnet_id is not defined + tags: seafile + +- name: Read seahub ID + command: cat {{ seafile_root_dir }}/meta/ansible_ccnet_id + register: seafile_seahub_rand_id + when: seafile_ccnet_id is not defined + changed_when: False + tags: seafile + +- name: Set seahub ID + set_fact: seafile_ccnet_id={{ seafile_seahub_rand_id.stdout }} + when: seafile_ccnet_id is not defined + tags: seafile + +- name: Generate a password for the database + block: + - import_tasks: ../includes/get_rand_pass.yml + vars: + - pass_file: "{{ seafile_root_dir }}/meta/ansible_dbpass" + - set_fact: seafile_db_pass={{ rand_pass }} + when: seafile_db_pass is not defined + tags: seafile + +- name: Set seafile ports + set_fact: + seafile_ports: "[ {{ seafile_seafile_port }}, {{ seafile_seahub_port }} ]" + tags: seafile + +- name: Add webdav port + set_fact: + seafile_ports: "{{ seafile_ports }} + [ {{ seafile_webdav_port }} ]" + when: seafile_webdav == True + tags: seafile + diff --git a/roles/seafile/tasks/install.yml b/roles/seafile/tasks/install.yml new file mode 100644 index 0000000..d443692 --- /dev/null +++ b/roles/seafile/tasks/install.yml @@ -0,0 +1,212 @@ +--- + +- name: Install RPM dependencies + yum: + name: + - python-imaging + - MySQL-python + - python-memcached + - python-ldap + - python-urllib3 + - python-virtualenv + - ffmpeg + - ffmpeg-devel + - libmemcached-devel + - mysql-devel + - zlib-devel + - gcc + - tar + - mariadb + - fuse + - java-1.8.0-openjdk # For seafile-pro + - poppler-utils # For seafile-pro + - unoconv # For seafile-pro + tags: seafile + +- name: Install or update python modules in the virtualenv + pip: + state: latest + virtualenv: "{{ seafile_root_dir }}" + virtualenv_python: python2.7 + name: + - pip + - virtualenv + - pillow + #- moviepy + - pylibmc + - django-pylibmc + - requests_oauthlib + - MySQL-python + notify: + - restart seafile + - restart seahub + tags: seafile + +- name: Install Seafile pro license + copy: content={{ seafile_license }} dest={{ seafile_root_dir }}/seafile-license.txt + when: seafile_license is defined + tags: seafile + +- name: Download seafile archive + get_url: + url: "{{ seafile_archive_url }}" + dest: "{{ seafile_root_dir }}/tmp/seafile-server_{{ seafile_version }}_x86-64.tar.gz" + checksum: "sha1:{{ seafile_archive_sha1 }}" + when: + - seafile_install_mode != 'none' + - seafile_license is not defined + tags: seafile + +- name: Copy Seafile pro archive + copy: src=seafile-pro-server_{{ seafile_version }}_x86-64.tar.gz dest={{ seafile_root_dir }}/tmp/ + when: + - seafile_install_mode != 'none' + - seafile_license is defined + tags: seafile + +- name: Extract seafile archive + unarchive: + src: "{{ seafile_root_dir }}/tmp/seafile-{{ seafile_license is defined | ternary('pro-','') }}server_{{ seafile_version }}_x86-64.tar.gz" + dest: "{{ seafile_root_dir }}/tmp" + remote_src: yes + when: seafile_install_mode != 'none' + tags: seafile + +- name: Move seafile to the correct location + synchronize: + src: "{{ seafile_root_dir }}/tmp/seafile-{{ seafile_license is defined | ternary('pro-','') }}server-{{ seafile_version }}/" + dest: "{{ seafile_root_dir }}/seafile-server/" + recursive: True + delete: True + delegate_to: "{{ inventory_hostname }}" + when: seafile_install_mode != 'none' + tags: seafile + +- name: Check if avatar is a dir or a link + stat: path={{ seafile_root_dir }}/seafile-server/seahub/media/avatars + register: seafile_avatar + tags: seafile + +- name: Remove default avatar directory + file: path={{ seafile_root_dir }}/seafile-server/seahub/media/avatars state=absent + when: seafile_avatar.stat.isdir is defined and seafile_avatar.stat.isdir + tags: seafile + +- name: Create seahub symlinks + file: src={{ seafile_data_dir }}/seahub/{{ item.src }} dest={{ seafile_root_dir }}/seafile-server/seahub/media/{{ item.dest }} state=link force=True + with_items: + - src: custom + dest: custom + - src: cache + dest: CACHE + - src: avatars + dest: avatars + tags: seafile + +- name: Create pro-data link + file: src={{ seafile_data_dir }}/pro dest={{ seafile_root_dir }}/pro-data state=link force=True + when: seafile_license is defined + tags: seafile + +- name: Set permissions on seahub runtime directory + file: path={{ seafile_root_dir }}/seafile-server/runtime state=directory owner={{ seafile_user }} mode=700 + tags: seafile + +- name: Create library-template + file: path={{ seafile_data_dir }}/library-template state=directory + when: seafile_install_mode == 'install' + tags: seafile + + # Needed since CentOS 7.5 so ldaps can be used +- name: Remove bundled libs + file: path={{ seafile_root_dir }}/seafile-server/seafile/lib/{{ item }} state=absent + with_items: + - libnssutil3.so + notify: restart seafile + tags: seafile + +- name: Copy documentation + copy: src={{ seafile_root_dir }}/tmp/seafile-server-{{ seafile_version }}/seafile/docs/seafile-tutorial.doc dest={{ seafile_data_dir }}/library-template remote_src=True + when: seafile_install_mode == 'install' + tags: seafile + +- name: Generate a secret for seahub + shell: python2.7 {{ seafile_root_dir }}/seafile-server/seahub/tools/secret_key_generator.py > {{ seafile_root_dir }}/meta/ansible_hub_secret + args: + creates: "{{ seafile_root_dir }}/meta/ansible_hub_secret" + when: seafile_seahub_secret is not defined + tags: seafile + +- name: Read seahub secret + command: cat {{ seafile_root_dir }}/meta/ansible_hub_secret + register: seafile_seahub_rand_secret + when: seafile_seahub_secret is not defined + changed_when: False + tags: seafile + +- name: Set seahub secret key + set_fact: seafile_seahub_secret={{ seafile_seahub_rand_secret.stdout }} + when: seafile_seahub_secret is not defined + tags: seafile + +- name: Create the databases + mysql_db: + name: "{{ item }}" + login_host: "{{ seafile_db_server }}" + login_user: sqladmin + login_password: "{{ mysql_admin_pass }}" + state: present + with_items: + - "{{ seafile_db_seafile }}" + - "{{ seafile_db_ccnet }}" + - "{{ seafile_db_seahub }}" + tags: seafile + +- name: Create database user + mysql_user: + name: "{{ seafile_db_user }}" + password: "{{ seafile_db_pass }}" + priv: "{{ seafile_db_seafile }}.*:ALL/{{ seafile_db_ccnet }}.*:ALL/{{ seafile_db_seahub }}.*:ALL" + host: "{{ item }}" + login_host: "{{ seafile_db_server }}" + login_user: sqladmin + login_password: "{{ mysql_admin_pass }}" + state: present + with_items: "{{ (seafile_db_server == '127.0.0.1') | ternary(['127.0.0.1','localhost'],ansible_all_ipv4_addresses) }}" + tags: seafile + +- name: Load database schema schema + mysql_db: + state: import + target: "{{ seafile_root_dir }}/seafile-server/seahub/sql/mysql.sql" + name: "{{ seafile_db_seahub }}" + login_host: "{{ seafile_db_server }}" + login_user: sqladmin + login_password: "{{ mysql_admin_pass }}" + loop: + - db: "{{ seafile_db_seahub }}" + file: "{{ seafile_root_dir }}/seafile-server/seahub/sql/mysql.sql" + - db: "{{ seafile_db_seafile }}" + file: "{{ seafile_root_dir }}/seafile-server/sql/mysql/seafile.sql" + - db: "{{ seafile_db_ccnet }}" + file: "{{ seafile_root_dir }}/seafile-server/sql/mysql/ccnet.sql" + when: seafile_install_mode == 'install' + tags: seafile + +- name: Deploy systemd services + template: src={{ item }}.service.j2 dest=/etc/systemd/system/{{ item }}.service + with_items: + - seafile + - seahub + notify: + - restart seafile + - restart seahub + register: seafile_systemd_unit + tags: seafile + +- name: Reload systemd + command: systemctl daemon-reload + when: seafile_systemd_unit.changed + tags: seafile + + diff --git a/roles/seafile/tasks/iptables.yml b/roles/seafile/tasks/iptables.yml new file mode 100644 index 0000000..bfba389 --- /dev/null +++ b/roles/seafile/tasks/iptables.yml @@ -0,0 +1,10 @@ +--- + +- name: Handle seafile ports + iptables_raw: + name: seafile_ports + state: "{{ (seafile_src_ip | length > 0) | ternary('present','absent') }}" + rules: "-A INPUT -m state --state NEW -p tcp -m multiport --dports {{ seafile_ports | join(',') }} -s {{ seafile_src_ip | join(',') }} -j ACCEPT" + when: iptables_manage | default(True) + tags: seafile + diff --git a/roles/seafile/tasks/main.yml b/roles/seafile/tasks/main.yml index 2d501d6..7fa9725 100644 --- a/roles/seafile/tasks/main.yml +++ b/roles/seafile/tasks/main.yml @@ -1,534 +1,16 @@ --- -- name: Set default install mode - set_fact: seafile_install_mode='none' - tags: seafile - - # Makes sur we do not have a trailing / on the public url -- set_fact: seafile_public_url={{ seafile_public_url | regex_replace('/$','') }} - tags: seafile - -- name: Check if seafile is installed - stat: path={{ seafile_root_dir }}/meta/ansible_version - register: seafile_version_file - tags: seafile - -- name: Check installed version - command: cat {{ seafile_root_dir }}/meta/ansible_version - register: seafile_current_version - when: seafile_version_file.stat.exists - changed_when: False - tags: seafile - -- name: Set install mode to install - set_fact: seafile_install_mode='install' - when: not seafile_version_file.stat.exists - tags: seafile - -- name: Set install mode to upgrade - set_fact: seafile_install_mode='upgrade' - when: - - seafile_version_file.stat.exists - - seafile_current_version is defined - - seafile_current_version.stdout != seafile_version - tags: seafile - - # Needed to have consistent behaviour with the various components - # which do not all support unix socket -- name: Set DB server to 127.0.0.1 - set_fact: seafile_db_server="127.0.0.1" - when: seafile_db_server == 'localhost' - tags: seafile - -- name: Install RPM dependencies - yum: - name: - - python-imaging - - MySQL-python - - python-memcached - - python-ldap - - python-urllib3 - - python-virtualenv - - ffmpeg - - ffmpeg-devel - - libmemcached-devel - - mysql-devel - - zlib-devel - - gcc - - tar - - mariadb - - fuse - - java-1.8.0-openjdk # For seafile-pro - - poppler-utils # For seafile-pro - - unoconv # For seafile-pro - tags: seafile - -- name: Install or update python modules in the virtualenv - pip: - state: latest - virtualenv: "{{ seafile_root_dir }}" - virtualenv_python: python2.7 - name: - - pip - - virtualenv - - pillow - #- moviepy - - pylibmc - - django-pylibmc - - requests_oauthlib - - MySQL-python - notify: - - restart seafile - - restart seahub - tags: seafile - -- name: Create user account - user: name={{ seafile_user }} comment="Seafile user account" system=yes shell=/sbin/nologin - tags: seafile - -- name: Create base directories - file: path={{ item.dir }} state=directory owner={{ item.owner | default(seafile_user) }} group={{ item.group | default(seafile_group) }} mode={{ item.mode | default('0700') }} - with_items: - - dir: "{{ seafile_root_dir }}/tmp" - owner: root - group: root - - dir: "{{ seafile_root_dir }}/meta" - owner: root - group: root - - dir: "{{ seafile_root_dir }}/archives" - owner: root - group: root - tags: seafile - -- name: Install Seafile pro license - copy: content={{ seafile_license }} dest={{ seafile_root_dir }}/seafile-license.txt - when: seafile_license is defined - tags: seafile - -- name: Create archive directory - file: path={{ seafile_root_dir }}/archives/{{ seafile_current_version.stdout }} state=directory - when: seafile_install_mode == 'upgrade' - tags: seafile - -- name: Stop the service during upgrade - service: name={{ item }} state=stopped - with_items: - - seafile - - seahub - when: seafile_install_mode == 'upgrade' - tags: seafile - -- name: Backup the databases - mysql_db: - state: dump - name: "{{ item }}" - target: "{{ seafile_root_dir }}/archives/{{ seafile_current_version.stdout }}/{{ item }}.sql" - login_host: "{{ seafile_db_server }}" - login_user: sqladmin - login_password: "{{ mysql_admin_pass }}" - quick: True - single_transaction: True - with_items: - - "{{ seafile_db_seafile }}" - - "{{ seafile_db_ccnet }}" - - "{{ seafile_db_seahub }}" - when: seafile_install_mode == 'upgrade' - tags: seafile - -- name: Archive seafile server - synchronize: - src: "{{ seafile_root_dir }}/seafile-server" - dest: "{{ seafile_root_dir }}/archives/{{ seafile_current_version.stdout }}/" - recursive: True - delete: True - delegate_to: "{{ inventory_hostname }}" - when: seafile_install_mode == 'upgrade' - tags: seafile - -- name: Download seafile archive - get_url: - url: "{{ seafile_archive_url }}" - dest: "{{ seafile_root_dir }}/tmp/seafile-server_{{ seafile_version }}_x86-64.tar.gz" - checksum: "sha1:{{ seafile_archive_sha1 }}" - when: - - seafile_install_mode != 'none' - - seafile_license is not defined - tags: seafile - -- name: Copy Seafile pro archive - copy: src=seafile-pro-server_{{ seafile_version }}_x86-64.tar.gz dest={{ seafile_root_dir }}/tmp/ - when: - - seafile_install_mode != 'none' - - seafile_license is defined - tags: seafile - -- name: Extract seafile archive - unarchive: - src: "{{ seafile_root_dir }}/tmp/seafile-{{ seafile_license is defined | ternary('pro-','') }}server_{{ seafile_version }}_x86-64.tar.gz" - dest: "{{ seafile_root_dir }}/tmp" - remote_src: yes - when: seafile_install_mode != 'none' - tags: seafile - -- name: Create directories - file: path={{ item.dir }} state=directory owner={{ item.owner | default(seafile_user) }} group={{ item.group | default(seafile_group) }} mode={{ item.mode | default('0770') }} - with_items: - - dir: "{{ seafile_root_dir }}" - mode: 755 - - dir: "{{ seafile_root_dir }}/fuse" - - dir: "{{ seafile_root_dir }}/seafile-server" - mode: 755 - - dir: "{{ seafile_root_dir }}/conf" - - dir: "{{ seafile_root_dir }}/ccnet" - - dir: "{{ seafile_root_dir }}/logs" - - dir: "{{ seafile_root_dir }}/pids" - - dir: "{{ seafile_data_dir }}" - - dir: "{{ seafile_data_dir }}/thumbnails" - - dir: "{{ seafile_data_dir }}/seahub" - mode: 755 - - dir: "{{ seafile_data_dir }}/seahub/custom" - mode: 755 - - dir: "{{ seafile_data_dir }}/seahub/cache" - mode: 755 - - dir: "{{ seafile_data_dir }}/seahub/avatars" - mode: 755 - - dir: "{{ seafile_data_dir }}/pro" - - dir: "{{ seafile_data_dir }}/db_dumps" - owner: root - group: root - ignore_errors: True # So we can run when the fuse mount point is active - tags: seafile - -- name: Move seafile to the correct location - synchronize: - src: "{{ seafile_root_dir }}/tmp/seafile-{{ seafile_license is defined | ternary('pro-','') }}server-{{ seafile_version }}/" - dest: "{{ seafile_root_dir }}/seafile-server/" - recursive: True - delete: True - delegate_to: "{{ inventory_hostname }}" - when: seafile_install_mode != 'none' - tags: seafile - -- name: Check if avatar is a dir or a link - stat: path={{ seafile_root_dir }}/seafile-server/seahub/media/avatars - register: seafile_avatar - tags: seafile - -- name: Remove default avatar directory - file: path={{ seafile_root_dir }}/seafile-server/seahub/media/avatars state=absent - when: seafile_avatar.stat.isdir is defined and seafile_avatar.stat.isdir - tags: seafile - -- name: Create seahub symlinks - file: src={{ seafile_data_dir }}/seahub/{{ item.src }} dest={{ seafile_root_dir }}/seafile-server/seahub/media/{{ item.dest }} state=link force=True - with_items: - - src: custom - dest: custom - - src: cache - dest: CACHE - - src: avatars - dest: avatars - tags: seafile - -- name: Create pro-data link - file: src={{ seafile_data_dir }}/pro dest={{ seafile_root_dir }}/pro-data state=link force=True - when: seafile_license is defined - tags: seafile - -- name: Set permissions on seahub runtime directory - file: path={{ seafile_root_dir }}/seafile-server/runtime state=directory owner={{ seafile_user }} mode=700 - tags: seafile - -- name: Create library-template - file: path={{ seafile_data_dir }}/library-template state=directory - when: seafile_install_mode == 'install' - tags: seafile - - # Needed since CentOS 7.5 so ldaps can be used -- name: Remove bundled libs - file: path={{ seafile_root_dir }}/seafile-server/seafile/lib/{{ item }} state=absent - with_items: - - libnssutil3.so - notify: restart seafile - tags: seafile - -- name: Copy documentation - copy: src={{ seafile_root_dir }}/tmp/seafile-server-{{ seafile_version }}/seafile/docs/seafile-tutorial.doc dest={{ seafile_data_dir }}/library-template remote_src=yes - when: seafile_install_mode == 'install' - tags: seafile - -- name: Generate a secret for seahub - shell: python2.7 {{ seafile_root_dir }}/seafile-server/seahub/tools/secret_key_generator.py > {{ seafile_root_dir }}/meta/ansible_hub_secret - args: - creates: "{{ seafile_root_dir }}/meta/ansible_hub_secret" - when: seafile_seahub_secret is not defined - tags: seafile - -- name: Read seahub secret - command: cat {{ seafile_root_dir }}/meta/ansible_hub_secret - register: seafile_seahub_rand_secret - when: seafile_seahub_secret is not defined - changed_when: False - tags: seafile - -- name: Set seahub secret key - set_fact: seafile_seahub_secret={{ seafile_seahub_rand_secret.stdout }} - when: seafile_seahub_secret is not defined - tags: seafile - -- name: Generate a ID for seahub - shell: date | sha1sum | awk '{ print $1 }' > {{ seafile_root_dir }}/meta/ansible_ccnet_id - args: - creates: "{{ seafile_root_dir }}/meta/ansible_ccnet_id" - when: seafile_ccnet_id is not defined - tags: seafile - -- name: Read seahub ID - command: cat {{ seafile_root_dir }}/meta/ansible_ccnet_id - register: seafile_seahub_rand_id - when: seafile_ccnet_id is not defined - changed_when: False - tags: seafile - -- name: Set seahub ID - set_fact: seafile_ccnet_id={{ seafile_seahub_rand_id.stdout }} - when: seafile_ccnet_id is not defined - tags: seafile - -- name: Generate a random pass for the database - shell: openssl rand -base64 45 > {{ seafile_root_dir }}/meta/ansible_dbpass - args: - creates: "{{ seafile_root_dir }}/meta/ansible_dbpass" - when: seafile_db_pass is not defined - tags: seafile - -- name: Read database password - command: cat {{ seafile_root_dir }}/meta/ansible_dbpass - register: seafile_rand_pass - when: seafile_db_pass is not defined - changed_when: False - tags: seafile - -- name: Set database pass - set_fact: seafile_db_pass={{ seafile_rand_pass.stdout }} - when: seafile_db_pass is not defined - tags: seafile - -- name: Create the databases - mysql_db: - name: "{{ item }}" - login_host: "{{ seafile_db_server }}" - login_user: sqladmin - login_password: "{{ mysql_admin_pass }}" - state: present - with_items: - - "{{ seafile_db_seafile }}" - - "{{ seafile_db_ccnet }}" - - "{{ seafile_db_seahub }}" - tags: seafile - -- name: Create database user - mysql_user: - name: "{{ seafile_db_user }}" - password: "{{ seafile_db_pass }}" - priv: "{{ seafile_db_seafile }}.*:ALL/{{ seafile_db_ccnet }}.*:ALL/{{ seafile_db_seahub }}.*:ALL" - host: "{{ item }}" - login_host: "{{ seafile_db_server }}" - login_user: sqladmin - login_password: "{{ mysql_admin_pass }}" - state: present - with_items: "{{ (seafile_db_server == '127.0.0.1') | ternary(['127.0.0.1','localhost'],ansible_all_ipv4_addresses) }}" - tags: seafile - -- name: Load seahub schema - mysql_db: - state: import - target: "{{ seafile_root_dir }}/seafile-server/seahub/sql/mysql.sql" - name: "{{ seafile_db_seahub }}" - login_host: "{{ seafile_db_server }}" - login_user: sqladmin - login_password: "{{ mysql_admin_pass }}" - when: seafile_install_mode == 'install' - tags: seafile - -- name: Generate an RSA private key - command: openssl genrsa -out {{ seafile_root_dir }}/ccnet/mykey.peer 2048 - args: - creates: "{{ seafile_root_dir }}/ccnet/mykey.peer" - tags: seafile - -- name: Deploy seafile configuration - template: src={{ item }}.j2 dest={{ seafile_root_dir }}/conf/{{ item }} group={{ seafile_group }} mode=640 - with_items: - - ccnet.conf - - seafdav.conf - - seafile.conf - - seahub_settings.py - - gunicorn.conf - notify: - - restart seafile - - restart seahub - tags: seafile - -- name: Deploy seafile pro configuration - template: src={{ item }}.j2 dest={{ seafile_root_dir }}/conf/{{ item }} group={{ seafile_group }} mode=640 - with_items: - - seafevents.conf - when: seafile_license is defined - notify: - - restart seafile - - restart seahub - tags: seafile - -- name: Deploy ccnet ini file - copy: - content: | - {{ seafile_data_dir }} - dest: "{{ seafile_root_dir }}/ccnet/seafile.ini" - notify: - - restart seafile - - restart seahub - tags: seafile - -- name: Deploy initial admin info - template: src=admin.txt.j2 dest={{ seafile_root_dir }}/conf/admin.txt group={{ seafile_group }} mode=640 - when: seafile_install_mode == 'install' - tags: seafile - -- name: Set seafile ports - set_fact: - seafile_ports: "[ {{ seafile_seafile_port }}, {{ seafile_seahub_port }} ]" - tags: seafile - -- name: Add webdav port - set_fact: - seafile_ports: "{{ seafile_ports }} + [ {{ seafile_webdav_port }} ]" - when: seafile_webdav == True - tags: seafile - -- name: Handle seafile ports - iptables_raw: - name: seafile_ports - state: "{{ (seafile_src_ip | length > 0) | ternary('present','absent') }}" - rules: "-A INPUT -m state --state NEW -p tcp -m multiport --dports {{ seafile_ports | join(',') }} -s {{ seafile_src_ip | join(',') }} -j ACCEPT" - when: iptables_manage | default(True) - tags: seafile - -- name: Compress previous version - command: tar cJf {{ seafile_root_dir }}/archives/{{ seafile_current_version.stdout }}.txz ./ - environment: - XZ_OPT: -T0 - args: - chdir: "{{ seafile_root_dir }}/archives/{{ seafile_current_version.stdout }}" - warn: False +- include: user.yml +- include: directories.yml +- include: facts.yml +- include: archive_pre.yml when: seafile_install_mode == 'upgrade' - tags: seafile - -- name: Remove archive directory - file: path={{ seafile_root_dir }}/archives/{{ seafile_current_version.stdout }} state=absent +- include: install.yml +- include: conf.yml +- include: iptables.yml +- include: services.yml +- include: archive_post.yml when: seafile_install_mode == 'upgrade' - tags: seafile - -- name: Remove tmp files - file: path={{ item }} state=absent - with_items: - - "{{ seafile_root_dir }}/tmp/seafile-server_{{ seafile_version }}_x86-64.tar.gz" - - "{{ seafile_root_dir }}/tmp/seafile-server-{{ seafile_version }}" - - "{{ seafile_root_dir }}/tmp/seafile-pro-server_{{ seafile_version }}_x86-64.tar.gz" - - "{{ seafile_root_dir }}/tmp/seafile-pro-server-{{ seafile_version }}" - - "/etc/cron.d/seafil_gc" - tags: seafile - -- name: Write version - copy: content={{ seafile_version }} dest={{ seafile_root_dir }}/meta/ansible_version - when: seafile_install_mode != 'none' - tags: seafile - -- name: Deploy systemd services - template: src={{ item }}.service.j2 dest=/etc/systemd/system/{{ item }}.service - with_items: - - seafile - - seahub - notify: - - restart seafile - - restart seahub - register: seafile_systemd_unit - tags: seafile - -- name: Reload systemd - command: systemctl daemon-reload - when: seafile_systemd_unit.changed - tags: seafile - -- name: Start and enable the services - service: name={{ item }} state=started enabled=yes - with_items: - - seafile - - seahub - when: seafile_install_mode != 'upgrade' # We need to run upgrade script manually - tags: seafile - -- name: Deploy script to run garbage collector - template: src=gc.sh.j2 dest={{ seafile_root_dir }}/seafile-server/gc.sh mode=0755 - tags: seafile - -- name: Add a cron job for garbage collector - cron: - name: seafile_gc - special_time: weekly - user: root - job: '{{ seafile_root_dir }}/seafile-server/gc.sh' - cron_file: seafile_gc - state: present - tags: seafile - -- name: Deploy a clamdscan wrapper script - copy: - content: | - #!/bin/bash -e - /bin/clamdscan -c /etc/clamd.conf $@ - dest: "{{ seafile_root_dir }}/seafile-server/clamdscan.sh" - mode: 0755 - tags: seafile - -- name: Install backup script - template: src={{ item.script }}.j2 dest=/etc/backup/{{ item.type }}.d/{{ item.script }} mode=700 - with_items: - - script: seafile_dump_db.sh - type: pre - - script: seafile_mount_fuse.sh - type: pre - - script: seafile_rm_dumps.sh - type: post - - script: seafile_umount_fuse.sh - type: post - tags: seafile - -- name: Check if there are custom office templates - local_action: stat path=config/{{ inventory_hostname }}/seafile/office-template/empty.{{ item }} - register: seafile_custom_office_template - vars: - ansible_become: False - loop: - - docx - - pptx - - xlsx - tags: seafile - -- name: Override office templates - copy: src={{ item.stat.exists | ternary('config/' + inventory_hostname + '/seafile/office-template/empty.','office-template/empty.' ) }}{{ item.item }} dest={{ seafile_root_dir }}/seafile-server/seahub/media/office-template/ - loop: "{{ seafile_custom_office_template.results }}" - tags: seafile - -- name: Deploy permission script - template: src=perms.sh.j2 dest={{ seafile_root_dir }}/perms.sh mode=755 - register: seafile_perms - tags: seafile - -- name: Set optimal permissions - command: "{{ seafile_root_dir }}/perms.sh" - changed_when: False - when: seafile_perms.changed or seafile_install_mode == 'upgrade' - tags: seafile - +- include: write_version.yml +- include: cleanup.yml - include: filebeat.yml diff --git a/roles/seafile/tasks/services.yml b/roles/seafile/tasks/services.yml new file mode 100644 index 0000000..a995e38 --- /dev/null +++ b/roles/seafile/tasks/services.yml @@ -0,0 +1,10 @@ +--- + +- name: Start and enable the services + service: name={{ item }} state=started enabled=yes + with_items: + - seafile + - seahub + when: seafile_install_mode != 'upgrade' # We need to run upgrade script manually + tags: seafile + diff --git a/roles/seafile/tasks/user.yml b/roles/seafile/tasks/user.yml new file mode 100644 index 0000000..f359c69 --- /dev/null +++ b/roles/seafile/tasks/user.yml @@ -0,0 +1,6 @@ +--- + +- name: Create user account + user: name={{ seafile_user }} comment="Seafile user account" system=True shell=/sbin/nologin + tags: seafile + diff --git a/roles/seafile/tasks/write_version.yml b/roles/seafile/tasks/write_version.yml new file mode 100644 index 0000000..387425d --- /dev/null +++ b/roles/seafile/tasks/write_version.yml @@ -0,0 +1,6 @@ +--- + +- name: Write version + copy: content={{ seafile_version }} dest={{ seafile_root_dir }}/meta/ansible_version + when: seafile_install_mode != 'none' + tags: seafile