parent
359b7b5c4c
commit
460a3fc863
1374 changed files with 40895 additions and 0 deletions
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,9 @@ |
||||
--- |
||||
- name: Update everything |
||||
hosts: '*' |
||||
tasks: |
||||
- yum: name='*' state=latest |
||||
when: ansible_os_family == 'RedHat' |
||||
- apt: name='*' state=latest |
||||
when: ansible_os_family == 'Debian' |
||||
|
@ -0,0 +1,42 @@ |
||||
--- |
||||
- name: Update Zabbix |
||||
hosts: '*' |
||||
tasks: |
||||
- yum: |
||||
name: |
||||
- zabbix-agent |
||||
- zabbix-agent-addons |
||||
state: latest |
||||
when: ansible_os_family == 'RedHat' |
||||
notify: restart zabbix-agent |
||||
- apt: |
||||
name: |
||||
- zabbix-agent |
||||
update_cache: True |
||||
state: latest |
||||
when: ansible_os_family == 'Debian' |
||||
notify: restart zabbix-agent |
||||
- git: |
||||
repo: https://git.fws.fr/fws/zabbix-agent-addons.git |
||||
dest: /var/lib/zabbix/addons |
||||
register: zabbix_agent_addons_git |
||||
when: ansible_os_family == 'Debian' |
||||
notify: restart zabbix-agent |
||||
- shell: cp -af /var/lib/zabbix/addons/{{ item.src }}/* {{ item.dest }}/ |
||||
with_items: |
||||
- { src: zabbix_conf, dest: /etc/zabbix/zabbix_agentd.conf.d } |
||||
- { src: zabbix_scripts, dest: /var/lib/zabbix/bin } |
||||
- { src: lib, dest: /usr/local/lib/site_perl } |
||||
when: |
||||
- zabbix_agent_addons_git.changed |
||||
- ansible_os_family == 'Debian' |
||||
- shell: chmod +x /var/lib/zabbix/bin/* |
||||
args: |
||||
warn: False |
||||
when: |
||||
- zabbix_agent_addons_git.changed |
||||
- ansible_os_family == 'Debian' |
||||
|
||||
handlers: |
||||
- name: restart zabbix-agent |
||||
service: name=zabbix-agent state=restarted |
@ -0,0 +1,94 @@ |
||||
--- |
||||
|
||||
ampache_id: "1" |
||||
ampache_manage_upgrade: True |
||||
|
||||
ampache_version: '4.1.1' |
||||
ampache_config_version: 40 |
||||
ampache_zip_url: https://github.com/ampache/ampache/archive/{{ ampache_version }}.zip |
||||
ampache_zip_sha1: 744ff90039a268579551d50650ce1502ec89daf1 |
||||
|
||||
ampache_root_dir: /opt/ampache_{{ ampache_id }} |
||||
|
||||
ampache_php_user: php-ampache_{{ ampache_id }} |
||||
ampache_php_version: 74 |
||||
|
||||
# If you prefer using a custom PHP FPM pool, set it's name. |
||||
# You might need to adjust ampache_php_user |
||||
# ampache_php_fpm_pool: php56 |
||||
|
||||
|
||||
ampache_mysql_server: "{{ mysql_server | default('localhost') }}" |
||||
# ampache_mysql_port: 3306 |
||||
ampache_mysql_db: ampache_{{ ampache_id }} |
||||
ampache_mysql_user: ampache_{{ ampache_id }} |
||||
# If not defined, a random pass will be generated and stored in the meta directory |
||||
# ampache_mysql_pass: ampache |
||||
|
||||
# ampache_alias: ampache |
||||
# ampache_allowed_ip: |
||||
# - 192.168.7.0/24 |
||||
# - 10.2.0.0/24 |
||||
|
||||
ampache_local_web_path: "http://ampache.{{ ansible_domain }}/" |
||||
ampache_auth_methods: |
||||
- mysql |
||||
|
||||
ampache_ldap_url: "{{ ad_auth | default(False) | ternary('ldap://' + ad_realm | default(samba_realm) | lower,ldap_uri) }}" |
||||
ampache_ldap_starttls: True |
||||
ampache_ldap_search_dn: "{{ ad_auth | default(False) | ternary((ad_ldap_user_search_base is defined) | ternary(ad_ldap_user_search_base,'DC=' + ad_realm | default(samba_realm) | regex_replace('\\.',',DC=')), ldap_base) }}" |
||||
ampache_ldap_username: "" |
||||
ampache_ldap_password: "" |
||||
ampache_ldap_objectclass: "{{ ad_auth | default(False) | ternary('user','inetOrgPerson') }}" |
||||
ampache_ldap_filter: "{{ ad_auth | default(False) | ternary('(&(objectCategory=person)(objectClass=user)(primaryGroupId=513)(sAMAccountName=%v))','(uid=%v)') }}" |
||||
ampache_ldap_email_field: mail |
||||
ampache_ldap_name_field: cn |
||||
|
||||
ampache_admin_users: |
||||
- admin |
||||
|
||||
#ampache_logout_redirect: https://sso.domain.org |
||||
|
||||
ampache_metadata_order: 'getID3,filename' |
||||
|
||||
ampache_lastfm_api_key: 697bad201ee93391630d845c7b3f9610 |
||||
ampache_lastfm_api_secret: 5f5fe59aa2f9c60220f04e94aa59c209 |
||||
|
||||
ampache_max_bit_rate: 192 |
||||
ampache_min_bit_rate: 64 |
||||
|
||||
# allowed, required or false |
||||
ampache_transcode_m4a: required |
||||
ampache_transcode_flac: required |
||||
ampache_transcode_mpc: required |
||||
ampache_transcode_ogg: required |
||||
ampache_transcode_oga: required |
||||
ampache_transcode_wav: required |
||||
ampache_transcode_wma: required |
||||
ampache_transcode_aif: required |
||||
ampache_transcode_aiff: required |
||||
ampache_transcode_ape: required |
||||
ampache_transcode_shn: required |
||||
ampache_transcode_mp3: allowed |
||||
ampache_transcode_avi: required |
||||
ampache_transcode_mkv: required |
||||
ampache_transcode_mpg: required |
||||
ampache_transcode_mpeg: required |
||||
ampache_transcode_m4v: required |
||||
ampache_transcode_mp4: required |
||||
ampache_transcode_mov: required |
||||
ampache_transcode_wmv: required |
||||
ampache_transcode_ogv: required |
||||
ampache_transcode_divx: required |
||||
ampache_transcode_m2ts: required |
||||
ampache_transcode_webm: required |
||||
ampache_transcode_player_api_mp3: required |
||||
ampache_encode_player_api_target: mp3 |
||||
ampache_encode_player_webplayer: mp3 |
||||
ampache_encode_target: mp3 |
||||
ampache_encode_video_target: webm |
||||
|
||||
# If defined, will be printed on the login page. HTML can be used, eg |
||||
# ampache_motd: '<a href="/sso.php">Use central authentication</a>' |
||||
|
||||
... |
@ -0,0 +1,4 @@ |
||||
--- |
||||
- include: ../httpd_common/handlers/main.yml |
||||
- include: ../httpd_php/handlers/main.yml |
||||
... |
@ -0,0 +1,6 @@ |
||||
--- |
||||
allow_duplicates: true |
||||
dependencies: |
||||
- role: repo_nux_dextop |
||||
- role: httpd_php |
||||
... |
@ -0,0 +1,218 @@ |
||||
--- |
||||
|
||||
- name: Install needed tools |
||||
yum: |
||||
name: |
||||
- unzip |
||||
- MySQL-python |
||||
- mariadb |
||||
- acl |
||||
- git |
||||
- composer |
||||
- patch |
||||
- ffmpeg |
||||
tags: ampache |
||||
|
||||
- import_tasks: ../includes/create_system_user.yml |
||||
vars: |
||||
- user: "{{ ampache_php_user }}" |
||||
- comment: "PHP FPM for ampache {{ ampache_id }}" |
||||
tags: ampache |
||||
|
||||
- import_tasks: ../includes/webapps_set_install_mode.yml |
||||
vars: |
||||
- root_dir: "{{ ampache_root_dir }}" |
||||
- version: "{{ ampache_version }}" |
||||
tags: ampache |
||||
- set_fact: ampache_install_mode={{ (install_mode == 'upgrade' and not ampache_manage_upgrade) | ternary('none',install_mode) }} |
||||
tags: ampache |
||||
- set_fact: ampache_current_version={{ current_version | default('') }} |
||||
tags: ampache |
||||
|
||||
- import_tasks: ../includes/webapps_archive.yml |
||||
vars: |
||||
- root_dir: "{{ ampache_root_dir }}" |
||||
- version: "{{ ampache_current_version }}" |
||||
- db_name: "{{ ampache_mysql_db }}" |
||||
when: ampache_install_mode == 'upgrade' |
||||
tags: ampache |
||||
|
||||
- name: Download Ampache |
||||
get_url: |
||||
url: "{{ ampache_zip_url }}" |
||||
dest: "{{ ampache_root_dir }}/tmp/" |
||||
checksum: "sha1:{{ ampache_zip_sha1 }}" |
||||
when: ampache_install_mode != 'none' |
||||
tags: ampache |
||||
|
||||
- name: Extract ampache archive |
||||
unarchive: |
||||
src: "{{ ampache_root_dir }}/tmp/ampache-{{ ampache_version }}.zip" |
||||
dest: "{{ ampache_root_dir }}/tmp" |
||||
remote_src: yes |
||||
when: ampache_install_mode != 'none' |
||||
tags: ampache |
||||
|
||||
- name: Create directory structure |
||||
file: path={{ item }} state=directory |
||||
with_items: |
||||
- "{{ ampache_root_dir }}" |
||||
- "{{ ampache_root_dir }}/web" |
||||
- "{{ ampache_root_dir }}/tmp" |
||||
- "{{ ampache_root_dir }}/sessions" |
||||
- "{{ ampache_root_dir }}/meta" |
||||
- "{{ ampache_root_dir }}/logs" |
||||
- "{{ ampache_root_dir }}/data" |
||||
- "{{ ampache_root_dir }}/data/metadata" |
||||
- "{{ ampache_root_dir }}/data/music" |
||||
- "{{ ampache_root_dir }}/data/video" |
||||
- "{{ ampache_root_dir }}/db_dumps" |
||||
tags: ampache |
||||
|
||||
|
||||
- name: Move files to the correct directory |
||||
synchronize: |
||||
src: "{{ ampache_root_dir }}/tmp/ampache-{{ ampache_version }}/" |
||||
dest: "{{ ampache_root_dir }}/web/" |
||||
recursive: True |
||||
delete: True |
||||
delegate_to: "{{ inventory_hostname }}" |
||||
when: ampache_install_mode != 'none' |
||||
tags: ampache |
||||
|
||||
- name: Check if htaccess files needs to be moved |
||||
stat: path={{ ampache_root_dir }}/web/{{ item }}/.htaccess.dist |
||||
with_items: |
||||
- channel |
||||
- play |
||||
- rest |
||||
register: htaccess |
||||
tags: ampache |
||||
|
||||
- name: Rename htaccess files |
||||
command: mv -f {{ ampache_root_dir }}/web/{{ item.item }}/.htaccess.dist {{ ampache_root_dir }}/web/{{ item.item }}/.htaccess |
||||
with_items: "{{ htaccess.results }}" |
||||
when: item.stat.exists |
||||
tags: ampache |
||||
|
||||
- name: Install libs using composer |
||||
composer: command=install working_dir={{ ampache_root_dir }}/web executable={{ (ampache_php_version == '54') | ternary('/bin/php','/bin/php' ~ ampache_php_version ) }} |
||||
tags: ampache |
||||
|
||||
- name: Remove temp files |
||||
file: path={{ item }} state=absent |
||||
with_items: |
||||
- "{{ ampache_root_dir }}/tmp/ampache-{{ ampache_version }}.zip" |
||||
- "{{ ampache_root_dir }}/tmp/ampache-{{ ampache_version }}" |
||||
tags: ampache |
||||
|
||||
- import_tasks: ../includes/get_rand_pass.yml |
||||
vars: |
||||
- pass_file: "{{ ampache_root_dir }}/meta/key.txt" |
||||
tags: ampache |
||||
- set_fact: ampache_key={{ rand_pass }} |
||||
tags: ampache |
||||
|
||||
- import_tasks: ../includes/get_rand_pass.yml |
||||
vars: |
||||
- pass_file: "{{ampache_root_dir }}/meta/ansible_dbpass" |
||||
when: ampache_mysql_pass is not defined |
||||
tags: ampache |
||||
- set_fact: ampache_mysql_pass={{ rand_pass }} |
||||
when: ampache_mysql_pass is not defined |
||||
tags: ampache |
||||
|
||||
- import_tasks: ../includes/webapps_create_mysql_db.yml |
||||
vars: |
||||
- db_name: "{{ ampache_mysql_db }}" |
||||
- db_user: "{{ ampache_mysql_user }}" |
||||
- db_server: "{{ ampache_mysql_server }}" |
||||
- db_pass: "{{ ampache_mysql_pass }}" |
||||
tags: ampache |
||||
|
||||
- name: Inject SQL structure |
||||
mysql_db: |
||||
name: "{{ ampache_mysql_db }}" |
||||
state: import |
||||
target: "{{ ampache_root_dir }}/web/sql/ampache.sql" |
||||
login_host: "{{ ampache_mysql_server }}" |
||||
login_user: sqladmin |
||||
login_password: "{{ mysql_admin_pass }}" |
||||
when: ampache_install_mode == 'install' |
||||
tags: ampache |
||||
|
||||
- name: Upgrade SQL database |
||||
command: php{{ (ampache_php_version == '54') | ternary('', ampache_php_version) }} {{ ampache_root_dir }}/web/bin/install/update_db.inc |
||||
become_user: "{{ ampache_php_user }}" |
||||
when: ampache_install_mode == 'upgrade' |
||||
tags: ampache |
||||
|
||||
- name: Grant admin privileges |
||||
command: mysql --host={{ ampache_mysql_server }} --user=sqladmin --password={{ mysql_admin_pass }} {{ ampache_mysql_db }} -e "UPDATE `user` SET `access`='100' WHERE `username`='{{ item }}'" |
||||
changed_when: False |
||||
become_user: "{{ ampache_php_user }}" |
||||
with_items: "{{ ampache_admin_users }}" |
||||
tags: ampache |
||||
|
||||
- import_tasks: ../includes/webapps_webconf.yml |
||||
vars: |
||||
- app_id: ampache_{{ ampache_id }} |
||||
- php_version: "{{ ampache_php_version }}" |
||||
- php_fpm_pool: "{{ ampache_php_fpm_pool | default('') }}" |
||||
tags: ampache |
||||
|
||||
- name: Deploy ampache configuration |
||||
template: src=ampache.cfg.php.j2 dest={{ ampache_root_dir }}/web/config/ampache.cfg.php group={{ ampache_php_user }} mode=640 |
||||
tags: ampache |
||||
|
||||
- name: Deploy motd |
||||
template: src=motd.php.j2 dest={{ ampache_root_dir }}/web/config/motd.php |
||||
when: ampache_motd is defined |
||||
tags: ampache |
||||
|
||||
- name: Remove motd |
||||
file: path={{ ampache_root_dir }}/web/config/motd.php state=absent |
||||
when: ampache_motd is not defined |
||||
tags: ampache |
||||
|
||||
- name: Deploy cron scripts |
||||
template: src={{ item }}.j2 dest={{ ampache_root_dir }}/web/bin/{{ item }} |
||||
with_items: |
||||
- cron.sh |
||||
tags: ampache |
||||
|
||||
- name: Enable cronjob |
||||
cron: |
||||
name: ampache_{{ ampache_id }} |
||||
special_time: daily |
||||
user: "{{ ampache_php_user }}" |
||||
job: "/bin/sh {{ ampache_root_dir }}/web/bin/cron.sh" |
||||
cron_file: ampache_{{ ampache_id }} |
||||
tags: ampache |
||||
|
||||
- name: Deploy sso script |
||||
template: src=sso.php.j2 dest={{ ampache_root_dir }}/web/sso.php |
||||
tags: ampache |
||||
|
||||
- name: Deploy backup scripts |
||||
template: src={{ item.script }}.j2 dest=/etc/backup/{{ item.type }}.d/ampache_{{ ampache_id }}_{{ item.script }} mode=750 |
||||
with_items: |
||||
- script: dump_db |
||||
type: pre |
||||
- script: rm_dump |
||||
type: post |
||||
tags: ampache |
||||
|
||||
- import_tasks: ../includes/webapps_compress_archive.yml |
||||
vars: |
||||
- root_dir: "{{ ampache_root_dir }}" |
||||
- version: "{{ ampache_current_version }}" |
||||
when: ampache_install_mode == 'upgrade' |
||||
tags: ampache |
||||
|
||||
- import_tasks: ../includes/webapps_post.yml |
||||
vars: |
||||
- root_dir: "{{ ampache_root_dir }}" |
||||
- version: "{{ ampache_version }}" |
||||
tags: ampache |
||||
... |
@ -0,0 +1,134 @@ |
||||
config_version = {{ ampache_config_version }} |
||||
{% if ampache_local_web_path is defined %} |
||||
local_web_path = "{{ ampache_local_web_path }}" |
||||
{% endif %} |
||||
database_hostname = {{ ampache_mysql_server }} |
||||
{% if ampache_mysql_port is defined %} |
||||
database_port = "{{ ampache_mysql_port }}" |
||||
{% endif %} |
||||
database_name = "{{ ampache_mysql_db }}" |
||||
database_username = "{{ ampache_mysql_user }}" |
||||
database_password = "{{ ampache_mysql_pass }}" |
||||
secret_key = "{{ ampache_key }}" |
||||
session_length = 3600 |
||||
stream_length = 7200 |
||||
remember_length = 604800 |
||||
session_name = ampache |
||||
session_cookielife = 0 |
||||
auth_methods = "{{ ampache_auth_methods | join(',') }}" |
||||
{% if 'ldap' in ampache_auth_methods %} |
||||
ldap_url = "{{ ampache_ldap_url }}" |
||||
ldap_username = "{{ ampache_ldap_username }}" |
||||
ldap_password = "{{ ampache_ldap_password }}" |
||||
ldap_start_tls = "{{ ampache_ldap_starttls | ternary('true','false') }}" |
||||
ldap_search_dn = "{{ ampache_ldap_search_dn }}" |
||||
ldap_objectclass = "{{ ampache_ldap_objectclass }}" |
||||
ldap_filter = "{{ ampache_ldap_filter }}" |
||||
ldap_email_field = "{{ ampache_ldap_email_field }}" |
||||
ldap_name_field = "{{ ampache_ldap_name_field }}" |
||||
external_auto_update = "true" |
||||
{% endif %} |
||||
{% if ampache_logout_redirect is defined %} |
||||
logout_redirect = "{{ ampache_logout_redirect }}" |
||||
{% endif %} |
||||
access_control = "true" |
||||
require_session = "true" |
||||
require_localnet_session = "true" |
||||
metadata_order = "{{ ampache_metadata_order }}" |
||||
getid3_tag_order = "id3v2,id3v1,vorbiscomment,quicktime,matroska,ape,asf,avi,mpeg,riff" |
||||
deferred_ext_metadata = "false" |
||||
additional_genre_delimiters = "[/]{2}|[/|\\\\|\|,|;]" |
||||
catalog_file_pattern = "mp3|mpc|m4p|m4a|aac|ogg|oga|wav|aif|aiff|rm|wma|asf|flac|opus|spx|ra|ape|shn|wv" |
||||
catalog_video_pattern = "avi|mpg|mpeg|flv|m4v|mp4|webm|mkv|wmv|ogv|mov|divx|m2ts" |
||||
catalog_playlist_pattern = "m3u|m3u8|pls|asx|xspf" |
||||
catalog_prefix_pattern = "The|An|A|Das|Ein|Eine|Les|Le|La" |
||||
track_user_ip = "true" |
||||
allow_zip_download = "true" |
||||
allow_zip_types = "album" |
||||
use_auth = "true" |
||||
ratings = "false" |
||||
userflags = "true" |
||||
directplay = "true" |
||||
sociable = "false" |
||||
licensing = "false" |
||||
memory_cache = "true" |
||||
album_art_store_disk = "true" |
||||
local_metadata_dir = "{{ ampache_root_dir }}/data/metadata" |
||||
max_upload_size = 1048576 |
||||
resize_images = "false" |
||||
art_order = "db,tags,folder,musicbrainz,lastfm,google" |
||||
lastfm_api_key = "{{ ampache_lastfm_api_key }}" |
||||
lastfm_api_secret = "{{ ampache_lastfm_api_secret }}" |
||||
channel = "false" |
||||
live_stream = "false" |
||||
refresh_limit = "60" |
||||
show_footer_statistics = "false" |
||||
debug = "true" |
||||
debug_level = 5 |
||||
log_path = "{{ ampache_root_dir }}/logs/" |
||||
log_filename = "%name.%Y%m%d.log" |
||||
site_charset = "UTF-8" |
||||
{% if 'ldap' in ampache_auth_methods or 'http' in ampache_auth_methods %} |
||||
auto_create = "true" |
||||
auto_user = "user" |
||||
{% endif %} |
||||
allow_public_registration = "false" |
||||
generate_video_preview = "true" |
||||
max_bit_rate = {{ ampache_max_bit_rate }} |
||||
min_bit_rate = {{ ampache_min_bit_rate }} |
||||
transcode_m4a = {{ ampache_transcode_m4a }} |
||||
transcode_flac = {{ ampache_transcode_flac }} |
||||
transcode_mpc = {{ ampache_transcode_mpc }} |
||||
transcode_ogg = {{ ampache_transcode_ogg }} |
||||
transcode_oga = {{ ampache_transcode_oga }} |
||||
transcode_wav = {{ ampache_transcode_wav }} |
||||
transcode_wma = {{ ampache_transcode_wma }} |
||||
transcode_aif = {{ ampache_transcode_aif }} |
||||
transcode_aiff = {{ ampache_transcode_aiff }} |
||||
transcode_ape = {{ ampache_transcode_ape }} |
||||
transcode_shn = {{ ampache_transcode_shn }} |
||||
transcode_mp3 = {{ ampache_transcode_mp3 }} |
||||
transcode_avi = {{ ampache_transcode_avi }} |
||||
transcode_mkv = {{ ampache_transcode_mkv }} |
||||
transcode_mpg = {{ ampache_transcode_mpg }} |
||||
transcode_mpeg = {{ ampache_transcode_mpeg }} |
||||
transcode_m4v = {{ ampache_transcode_m4v }} |
||||
transcode_mp4 = {{ ampache_transcode_mp4 }} |
||||
transcode_mov = {{ ampache_transcode_mov }} |
||||
transcode_wmv = {{ ampache_transcode_wmv }} |
||||
transcode_ogv = {{ ampache_transcode_ogv }} |
||||
transcode_divx = {{ ampache_transcode_divx }} |
||||
transcode_m2ts = {{ ampache_transcode_m2ts }} |
||||
transcode_webm = {{ ampache_transcode_webm }} |
||||
encode_target = {{ ampache_encode_target }} |
||||
encode_player_webplayer_target = {{ ampache_encode_player_webplayer }} |
||||
transcode_player_api_mp3 = {{ ampache_transcode_player_api_mp3 }} |
||||
encode_video_target = {{ ampache_encode_video_target }} |
||||
transcode_player_customize = "true" |
||||
transcode_cmd = "/bin/ffmpeg" |
||||
transcode_input = "-i %FILE%" |
||||
encode_args_mp3 = "-vn -b:a %BITRATE%K -c:a libmp3lame -f mp3 pipe:1" |
||||
encode_args_ogg = "-vn -b:a %BITRATE%K -c:a libvorbis -f ogg pipe:1" |
||||
encode_args_m4a = "-vn -b:a %BITRATE%K -c:a libfdk_aac -f adts pipe:1" |
||||
encode_args_wav = "-vn -b:a %BITRATE%K -c:a pcm_s16le -f wav pipe:1" |
||||
encode_args_opus = "-vn -b:a %BITRATE%K -c:a libopus -compression_level 10 -vsync 2 -f ogg pipe:1" |
||||
encode_args_flv = "-b:a %BITRATE%K -ar 44100 -ac 2 -v 0 -f flv -c:v libx264 -preset superfast -threads 0 pipe:1" |
||||
encode_args_webm = "-q %QUALITY% -f webm -c:v libvpx -maxrate %MAXBITRATE%k -preset superfast -threads 0 pipe:1" |
||||
encode_args_ts = "-q %QUALITY% -s %RESOLUTION% -f mpegts -c:v libx264 -c:a libmp3lame -maxrate %MAXBITRATE%k -preset superfast -threads 0 pipe:1" |
||||
encode_get_image = "-ss %TIME% -f image2 -vframes 1 pipe:1" |
||||
encode_srt = "-vf \"subtitles='%SRTFILE%'\"" |
||||
encode_ss_frame = "-ss %TIME%" |
||||
encode_ss_duration = "-t %DURATION%" |
||||
mail_type = "sendmail" |
||||
mail_domain = "{{ ansible_domain }}" |
||||
common_abbr = "divx,xvid,dvdrip,hdtv,lol,axxo,repack,xor,pdtv,real,vtv,caph,2hd,proper,fqm,uncut,topaz,tvt,notv,fpn,fov,orenji,0tv,omicron,dsr,ws,sys,crimson,wat,hiqt,internal,brrip,boheme,vost,vostfr,fastsub,addiction,x264,LOL,720p,1080p,YIFY,evolve,fihtv,first,bokutox,bluray,tvboom,info" |
||||
force_ssl = "true" |
||||
mail_enable = "true" |
||||
mail_type = "sendmail" |
||||
mail_domain = "{{ ansible_domain }}" |
||||
{% if system_proxy is defined and system_proxy != '' %} |
||||
proxy_host = "{{ system_proxy | urlsplit('hostname') }}" |
||||
proxy_port = "{{ system_proxy | urlsplit('port') }}" |
||||
proxy_user = "{{ system_proxy | urlsplit('username') }}" |
||||
proxy_pass = "{{ system_proxy | urlsplit('password') }}" |
||||
{% endif %} |
@ -0,0 +1,31 @@ |
||||
#!/bin/sh |
||||
|
||||
# Rotate logs |
||||
find {{ ampache_root_dir }}/logs -type f -mtime +7 -exec rm -f "{}" \; |
||||
find {{ ampache_root_dir }}/logs -type f -mtime +1 -exec xz -T0 "{}" \; |
||||
|
||||
# Do we have a previous filelist to compare against ? |
||||
PREV_HASH=$(cat {{ ampache_root_dir }}/tmp/data_hash.txt || echo 'none') |
||||
|
||||
# Now, compute a hash of the filelist |
||||
NEW_HASH=$(find {{ ampache_root_dir }}/data/{music,video} | sha1sum | cut -d' ' -f1) |
||||
|
||||
# Write new hash so we can compare next time |
||||
echo -n $NEW_HASH > {{ ampache_root_dir }}/tmp/data_hash.txt |
||||
|
||||
# If file list has changed since last time, then update the catalog |
||||
if [ "$PREV_HASH" != "$NEW_HASH" ]; then |
||||
# Clean (remove files which doesn't exists anymore) |
||||
/bin/php{{ (ampache_php_version == '54') | ternary('',ampache_php_version) }} {{ ampache_root_dir }}/web/bin/catalog_update.inc -c > /dev/null 2>&1 |
||||
# Add (files added) |
||||
/bin/php{{ (ampache_php_version == '54') | ternary('',ampache_php_version) }} {{ ampache_root_dir }}/web/bin/catalog_update.inc -a > /dev/null 2>&1 |
||||
# Update graphics |
||||
/bin/php{{ (ampache_php_version == '54') | ternary('',ampache_php_version) }} {{ ampache_root_dir }}/web/bin/catalog_update.inc -g > /dev/null 2>&1 |
||||
fi |
||||
|
||||
# Now check if files have changed recently. We can have the same file list, but metadata updates |
||||
NEW_FILES=$(find {{ ampache_root_dir }}/data/{music,video} -type f -mtime -1 | wc -l) |
||||
if [ "$NEW_FILES" -gt "0" ]; then |
||||
# Verify (update metadata) |
||||
/bin/php{{ (ampache_php_version == '54') | ternary('',ampache_php_version) }} {{ ampache_root_dir }}/web/bin/catalog_update.inc -v > /dev/null 2>&1 |
||||
fi |
@ -0,0 +1,7 @@ |
||||
#!/bin/sh |
||||
|
||||
/usr/bin/mysqldump --user={{ ampache_mysql_user }} \ |
||||
--password={{ ampache_mysql_pass }} \ |
||||
--host={{ ampache_mysql_server }} \ |
||||
--quick --single-transaction \ |
||||
--add-drop-table {{ ampache_mysql_db }} | lz4 -c > {{ ampache_root_dir }}/db_dumps/{{ ampache_mysql_db }}.sql.lz4 |
@ -0,0 +1,27 @@ |
||||
{% if ampache_alias is defined %} |
||||
Alias /{{ ampache_alias }} {{ ampache_root_dir }}/web |
||||
{% else %} |
||||
# No alias defined, create a vhost to access it |
||||
{% endif %} |
||||
|
||||
RewriteEngine On |
||||
<Directory {{ ampache_root_dir }}/web> |
||||
AllowOverride All |
||||
Options FollowSymLinks |
||||
{% if ampache_allowed_ip is defined %} |
||||
Require ip {{ ampache_src_ip | join(' ') }} |
||||
{% else %} |
||||
Require all granted |
||||
{% endif %} |
||||
<FilesMatch \.php$> |
||||
SetHandler "proxy:unix:/run/php-fpm/{{ ampache_php_fpm_pool | default('ampache_' + ampache_id | string) }}.sock|fcgi://localhost" |
||||
</FilesMatch> |
||||
<FilesMatch "(.maintenance.*|.ansible.*|.t?git.*|.php_cs|.travis.*)"> |
||||
Require all denied |
||||
</FilesMatch> |
||||
</Directory> |
||||
|
||||
<Directory {{ ampache_root_dir }}/web/config> |
||||
Require all denied |
||||
</Directory> |
||||
|
@ -0,0 +1,3 @@ |
||||
<?php |
||||
|
||||
echo '<a href="/sso.php">{{ ampache_motd }}</a>'; |
@ -0,0 +1,15 @@ |
||||
#!/bin/sh |
||||
|
||||
restorecon -R {{ ampache_root_dir }} |
||||
chown root:root {{ ampache_root_dir }} |
||||
chmod 700 {{ ampache_root_dir }} |
||||
setfacl -k -b {{ ampache_root_dir }} |
||||
setfacl -m u:{{ ampache_php_user | default('apache') }}:rx,u:{{ httpd_user | default('apache') }}:rx {{ ampache_root_dir }} |
||||
chown -R root:root {{ ampache_root_dir }}/web |
||||
chown apache-ampache {{ ampache_root_dir }}/data |
||||
chown -R {{ ampache_php_user }} {{ ampache_root_dir }}/{tmp,sessions,logs,data/metadata} |
||||
chmod 700 {{ ampache_root_dir }}/{tmp,sessions,logs,data} |
||||
find {{ ampache_root_dir }}/web -type f -exec chmod 644 "{}" \; |
||||
find {{ ampache_root_dir }}/web -type d -exec chmod 755 "{}" \; |
||||
chown :{{ ampache_php_user }} {{ ampache_root_dir }}/web/config/ampache.cfg.php |
||||
chmod 640 {{ ampache_root_dir }}/web/config/ampache.cfg.php |
@ -0,0 +1,37 @@ |
||||
; {{ ansible_managed }} |
||||
|
||||
[ampache_{{ ampache_id }}] |
||||
|
||||
listen.owner = root |
||||
listen.group = {{ httpd_user | default('apache') }} |
||||
listen.mode = 0660 |
||||
listen = /run/php-fpm/ampache_{{ ampache_id }}.sock |
||||
user = {{ ampache_php_user }} |
||||
group = {{ ampache_php_user }} |
||||
catch_workers_output = yes |
||||
|
||||
pm = dynamic |
||||
pm.max_children = 15 |
||||
pm.start_servers = 3 |
||||
pm.min_spare_servers = 3 |
||||
pm.max_spare_servers = 6 |
||||
pm.max_requests = 5000 |
||||
request_terminate_timeout = 60m |
||||
|
||||
php_flag[display_errors] = off |
||||
php_admin_flag[log_errors] = on |
||||
php_admin_value[error_log] = syslog |
||||
php_admin_value[memory_limit] = 512M |
||||
php_admin_value[session.save_path] = {{ ampache_root_dir }}/sessions |
||||
php_admin_value[upload_tmp_dir] = {{ ampache_root_dir }}/tmp |
||||
php_admin_value[sys_temp_dir] = {{ ampache_root_dir }}/tmp |
||||
php_admin_value[post_max_size] = 5M |
||||
php_admin_value[upload_max_filesize] = 5M |
||||
php_admin_value[disable_functions] = system, show_source, symlink, exec, dl, shell_exec, passthru, phpinfo, escapeshellarg, escapeshellcmd |
||||
php_admin_value[open_basedir] = {{ ampache_root_dir }} |
||||
php_admin_value[max_execution_time] = 1800 |
||||
php_admin_value[max_input_time] = 60 |
||||
php_admin_flag[allow_url_include] = off |
||||
php_admin_flag[allow_url_fopen] = on |
||||
php_admin_flag[file_uploads] = on |
||||
php_admin_flag[session.cookie_httponly] = on |
@ -0,0 +1,3 @@ |
||||
#!/bin/sh |
||||
|
||||
rm -f {{ ampache_root_dir }}/db_dump/* |
@ -0,0 +1,6 @@ |
||||
<?php |
||||
|
||||
# Just a dummy redirection so we can protect /sso.php with Lemonldap::NG |
||||
header('Location: /'); |
||||
|
||||
?> |
@ -0,0 +1,36 @@ |
||||
--- |
||||
|
||||
# The shell of the lbkp account |
||||
backup_shell: '/bin/bash' |
||||
|
||||
# List of commands lbkp will be allowed to run as root, with sudo |
||||
backup_sudo_base_commands: |
||||
- /usr/bin/rsync |
||||
- /usr/local/bin/pre-backup |
||||
- /usr/local/bin/post-backup |
||||
- /bin/tar |
||||
- /bin/gtar |
||||
backup_sudo_extra_commands: [] |
||||
backup_sudo_commands: "{{ backup_sudo_base_commands + backup_sudo_extra_commands }}" |
||||
|
||||
# List of ssh public keys to deploy |
||||
backup_ssh_keys: [] |
||||
|
||||
# Options to set for the ssh keys, to restrict what they can do |
||||
backup_ssh_keys_options: |
||||
- no-X11-forwarding |
||||
- no-agent-forwarding |
||||
- no-pty |
||||
|
||||
# List of IP address allowed to use the ssh keys |
||||
# Empty list means no restriction |
||||
backup_src_ip: [] |
||||
|
||||
# Custom pre / post script |
||||
backup_pre_script: | |
||||
#!/bin/bash -e |
||||
# Nothing to do |
||||
backup_post_script: | |
||||
#!/bin/bash -e |
||||
# Nothing to do |
||||
... |
@ -0,0 +1,53 @@ |
||||
#!/usr/bin/perl -w |
||||
|
||||
# This script will backup the config of MegaRAID based |
||||
# RAID controllers. The saved config can be restored with |
||||
# MegaCli -CfgRestore -f /home/lbkp/mega_0.bin for example |
||||
# It also create a backup of the config as text, so you can |
||||
# manually check how things were configured at a certain point in time |
||||
|
||||
# If MegaCli is not installed, then the script does nothing |
||||
|
||||
use strict; |
||||
|
||||
my $megacli = undef; |
||||
|
||||
if (-x '/opt/MegaRAID/MegaCli/MegaCli64'){ |
||||
$megacli = '/opt/MegaRAID/MegaCli/MegaCli64'; |
||||
} elsif (-x '/opt/MegaRAID/MegaCli/MegaCli'){ |
||||
$megacli = '/opt/MegaRAID/MegaCli/MegaCli'; |
||||
} |
||||
|
||||
exit (0) unless($megacli); |
||||
|
||||
my $adapters = 0; |
||||
foreach (qx($megacli -adpCount -NoLog)) { |
||||
if ( m/Controller Count:\s*(\d+)/ ) { |
||||
$adapters = $1; |
||||
last; |
||||
} |
||||
} |
||||
|
||||
foreach my $adp (0..$adapters-1){ |
||||
my $hba = 0; |
||||
my $failgrouplist = 0; |
||||
foreach my $line (qx($megacli -CfgDsply -a$adp -NoLog)) { |
||||
if ( $line =~ m/Failed to get Disk Group list/ ) { |
||||
$failgrouplist = 1; |
||||
} elsif ( $line =~ m/Product Name:.*(JBOD|HBA)/ ) { |
||||
$hba = 1; |
||||
} |
||||
} |
||||
# Skip adapter if in HBA mode |
||||
next if ($hba && $failgrouplist); |
||||
|
||||
# Save the config in binary format |
||||
qx($megacli -CfgSave -f /home/lbkp/megaraid/cfg_$adp.bin -a$adp -NoLog); |
||||
die "Failed to backup conf for adapter $adp\n" unless ($? == 0); |
||||
|
||||
# Now also save in text representation |
||||
open TXT, ">/home/lbkp/megaraid/cfg_$adp.txt"; |
||||
print TXT foreach qx($megacli -CfgDsply -a$adp -NoLog); |
||||
die "Failed to backup Cfg text description for adapter $adp\n" unless ($? == 0); |
||||
close TXT; |
||||
} |
@ -0,0 +1,3 @@ |
||||
#!/bin/sh |
||||
|
||||
/bin/rpm -qa --qf "%{NAME}\t%{VERSION}\t%{RELEASE}\n" | grep -v gpg-pubkey | sort > /home/lbkp/rpms.list |
@ -0,0 +1,9 @@ |
||||
#!/bin/bash |
||||
|
||||
if [ -d "/etc/backup/post.d" ]; then |
||||
for H in $(find /etc/backup/post.d -type f -o -type l | sort); do |
||||
[ -x $H ] && $H "$@" |
||||
done |
||||
fi |
||||
# Remove the lock |
||||
rm -f /var/lock/bkp.lock |
@ -0,0 +1,29 @@ |
||||
#!/bin/bash |
||||
|
||||
set -e |
||||
|
||||
# 2 locks are needed. The first one ensure we don't run |
||||
# The pre-backup script twice. It's an atomic lock. |
||||
# Then we need a second lock which will last until the post-backup ran |
||||
# This one doesn't need to be atomic (as we already checked this) |
||||
PRELOCKFILE="/var/lock/pre-bkp.lock" |
||||
exec 200>$PRELOCKFILE |
||||
flock -n 200 || ( echo "Couldn't aquire pre-backup lock" && exit 1 ) |
||||
PID=$$ |
||||
echo $PID 1>&200 |
||||
|
||||
if [ -e /var/lock/bkp.lock ]; then |
||||
# Consider the lock to be stale if it's older than 8 hours |
||||
if [ "$(( $(date +"%s") - $(stat -c "%Y" /var/lock/bkp.lock) ))" -gt "28800" ]; then |
||||
rm /var/lock/bkp.lock |
||||
else |
||||
echo "Another backup is running" |
||||
exit 1 |
||||
fi |
||||
fi |
||||
touch /var/lock/bkp.lock |
||||
if [ -d "/etc/backup/pre.d" ]; then |
||||
for H in $(find /etc/backup/pre.d -type f -o -type l | sort); do |
||||
[ -x $H ] && $H "$@" |
||||
done |
||||
fi |
@ -0,0 +1,3 @@ |
||||
#!/bin/bash -e |
||||
|
||||
rm -f /home/lbkp/megaraid/* |
@ -0,0 +1,84 @@ |
||||
--- |
||||
|
||||
- name: Install backup tools |
||||
yum: name=rsync |
||||
when: ansible_os_family == 'RedHat' |
||||
|
||||
- name: Install backup tools |
||||
apt: name=rsync |
||||
when: ansible_os_family == 'Debian' |
||||
|
||||
- name: Create a local backup user account |
||||
user: name=lbkp comment="Local backup account" system=yes shell={{ backup_shell }} |
||||
tags: backup |
||||
|
||||
- name: Deploy sudo configuration |
||||
template: src=sudo.j2 dest=/etc/sudoers.d/backup mode=400 |
||||
tags: backup |
||||
|
||||
- name: Deploy SSH keys for the backup account |
||||
authorized_key: |
||||
user: lbkp |
||||
key: "{{ backup_ssh_keys | join(\"\n\") }}" |
||||
key_options: "{{ backup_ssh_keys_options | join(',') }}" |
||||
exclusive: yes |
||||
when: backup_src_ip is not defined or backup_src_ip | length < 1 |
||||
tags: backup |
||||
|
||||
- name: Deploy SSH keys for the backup account (with source IP restriction) |
||||
authorized_key: |
||||
user: lbkp |
||||
key: "{{ backup_ssh_keys | join(\"\n\") }}" |
||||
key_options: "from=\"{{ backup_src_ip | join(',') }}\",{{ backup_ssh_keys_options | join(',') }}" |
||||
exclusive: yes |
||||
when: |
||||
- backup_src_ip is defined |
||||
- backup_src_ip | length > 0 |
||||
tags: backup |
||||
|
||||
- name: Create pre and post backup hook dir |
||||
file: path={{ item }} state=directory mode=750 |
||||
with_items: |
||||
- /etc/backup/pre.d |
||||
- /etc/backup/post.d |
||||
tags: backup |
||||
|
||||
- name: Deploy default pre/post backup hooks |
||||
copy: |
||||
content: "{{ item.content }}" |
||||
dest: /etc/backup/{{ item.type }}.d/default |
||||
mode: 755 |
||||
loop: |
||||
- type: pre |
||||
content: "{{ backup_pre_script }}" |
||||
- type: post |
||||
content: "{{ backup_post_script }}" |
||||
tags: backup |
||||
|
||||
- name: Copy pre-backup script |
||||
copy: src={{ item }} dest=/usr/local/bin/{{ item }} mode=750 group=lbkp |
||||
with_items: |
||||
- pre-backup |
||||
- post-backup |
||||
tags: backup |
||||
|
||||
- name: Deploy rpm dump list script |
||||
copy: src=dump-rpms-list dest=/etc/backup/pre.d/dump-rpms-list mode=755 |
||||
when: ansible_os_family == 'RedHat' |
||||
tags: backup |
||||
|
||||
- name: Create megaraid dump dir |
||||
file: path=/home/lbkp/megaraid state=directory |
||||
tags: backup |
||||
|
||||
- name: Deploy MegaCli backup scripts |
||||
copy: src={{ item.script }} dest=/etc/backup/{{ item.type }}.d/{{ item.script }} mode=750 |
||||
with_items: |
||||
- script: dump-megaraid-cfg |
||||
type: pre |
||||
- script: rm-megaraid-cfg |
||||
type: post |
||||
when: lsi_controllers | default([]) | length > 0 |
||||
tags: backup |
||||
|
||||
... |
@ -0,0 +1,2 @@ |
||||
Defaults:lbkp !requiretty |
||||
lbkp ALL=(root) NOPASSWD: {{ backup_sudo_commands | join(',') }} |
@ -0,0 +1,19 @@ |
||||
--- |
||||
|
||||
# You can choose either 3 or 4 |
||||
bpc_major_version: 3 |
||||
|
||||
# Auth to access BackupPC. Can be basic, lemonldap, lemonldap2 or none |
||||
bpc_auth: basic |
||||
|
||||
# List of IP address allowed |
||||
bpc_src_ip: [] |
||||
|
||||
# Should backuppc be started on boot ? |
||||
# You might want to turn this off if for example you must unlock |
||||
# the device on which you have your backup, and manually start backuppc after that |
||||
bpc_enabled: True |
||||
|
||||
# Should /BackupPC aliases be added on the main vhost ? |
||||
# You might want to, but you can also disable this and grant access only through a dedicated vhost |
||||
bpc_alias_on_main_vhost: True |
@ -0,0 +1,5 @@ |
||||
--- |
||||
|
||||
- include: ../httpd_common/handlers/main.yml |
||||
|
||||
... |
@ -0,0 +1,3 @@ |
||||
--- |
||||
dependencies: |
||||
- { role: httpd_front } |
@ -0,0 +1,48 @@ |
||||
--- |
||||
|
||||
- name: Install BackupPC 4 |
||||
yum: |
||||
name: |
||||
- BackupPC4 |
||||
- fuse-backuppcfs4 |
||||
when: bpc_major_version == 4 |
||||
tags: bpc |
||||
|
||||
- name: Install BackupPC 3 |
||||
yum: |
||||
name: |
||||
- BackupPC |
||||
- fuse-backuppcfs |
||||
when: bpc_major_version != 4 |
||||
tags: bpc |
||||
|
||||
- name: Install tools |
||||
yum: |
||||
name: |
||||
- rsync |
||||
- tar |
||||
- samba-client |
||||
- openssh-clients |
||||
- BackupPC-server-scripts |
||||
- fuse-chunkfs |
||||
tags: bpc |
||||
|
||||
- name: Deploy httpd conf |
||||
template: src=httpd.conf.j2 dest=/etc/httpd/ansible_conf.d/40-BackupPC.conf |
||||
notify: reload httpd |
||||
tags: bpc |
||||
|
||||
- name: Deploy sudo config |
||||
template: src=sudoers.j2 dest=/etc/sudoers.d/backuppc mode=0400 |
||||
tags: bpc |
||||
|
||||
- name: Create SSH Key |
||||
user: |
||||
name: backuppc |
||||
generate_ssh_key: yes |
||||
ssh_key_bits: 4096 |
||||
tags: bpc |
||||
|
||||
- name: Start and enable the service |
||||
service: name=backuppc state=started enabled={{ bpc_enabled }} |
||||
tags: bpc |
@ -0,0 +1,25 @@ |
||||
<Directory /usr/share/BackupPC/> |
||||
SSLRequireSSL on |
||||
{% if bpc_auth == "lemonldap" %} |
||||
PerlHeaderParserHandler Lemonldap::NG::Handler |
||||
{% elif bpc_auth == "lemonldap2" %} |
||||
PerlHeaderParserHandler Lemonldap::NG::Handler::ApacheMP2 |
||||
{% elif bpc_auth == "basic" %} |
||||
AuthType Basic |
||||
AuthUserFile /etc/BackupPC/apache.users |
||||
AuthName "BackupPC" |
||||
Require valid-user |
||||
{% endif %} |
||||
|
||||
{% if bpc_src_ip | length < 1 %} |
||||
Require all denied |
||||
{% else %} |
||||
Require ip {{ bpc_src_ip | join(' ') }} |
||||
{% endif %} |
||||
</Directory> |
||||
|
||||
{% if bpc_auth != False and bpc_auth != 'none' and bpc_alias_on_main_vhost == True %} |
||||
Alias /BackupPC/images /usr/share/BackupPC/html/ |
||||
ScriptAlias /BackupPC /usr/share/BackupPC/sbin/BackupPC_Admin |
||||
ScriptAlias /backuppc /usr/share/BackupPC/sbin/BackupPC_Admin |
||||
{% endif %} |
@ -0,0 +1,3 @@ |
||||
Defaults:backuppc !requiretty |
||||
Cmnd_Alias BACKUPPC = /usr/bin/rsync, /bin/tar, /bin/gtar, /usr/local/bin/pre-backup, /usr/local/bin/post-backup, /usr/bin/virt-backup |
||||
backuppc ALL=(root) NOPASSWD: BACKUPPC |
@ -0,0 +1,45 @@ |
||||
--- |
||||
|
||||
bitwarden_version: 1.14.2 |
||||
bitwarden_archive_url: https://github.com/dani-garcia/bitwarden_rs/archive/{{ bitwarden_version }}.tar.gz |
||||
bitwarden_archive_sha1: 1bb75b6ab11371ab60380ef19151ebd9410de4ef |
||||
|
||||
bitwarden_web_version: 2.13.2b |
||||
bitwarden_web_archive_url: https://github.com/dani-garcia/bw_web_builds/releases/download/v{{ bitwarden_web_version }}/bw_web_v{{ bitwarden_web_version }}.tar.gz |
||||
bitwarden_web_archive_sha1: df6f280731b852b31c3d938bfa1733140be9abb5 |
||||
|
||||
bitwarden_root_dir: /opt/bitwarden_rs |
||||
bitwarden_user: bitwarden_rs |
||||
|
||||
# Database : can be sqlite or mysql |
||||
bitwarden_db_engine: sqlite |
||||
bitwarden_db_server: "{{ mysql_server | default('localhost') }}" |
||||
bitwarden_db_port: 3306 |
||||
bitwarden_db_name: bitwardenrs |
||||
bitwarden_db_user: bitwardenrs |
||||
# A random one will be created if not defined |
||||
# bitwaren_db_pass: S3cr3t. |
||||
|
||||
# Port on which bitwarden will bind |
||||
bitwarden_http_port: 8000 |
||||
bitwarden_ws_port: 8001 |
||||
# List of IP addresses (can be CIDR notation) which will be able to |
||||
# access bitwarden ports |
||||
bitwarden_src_ip: [] |
||||
bitwarden_web_src_ip: [] |
||||
|
||||
# Public URL on which bitwarden will be accessible |
||||
bitwarden_public_url: http://{{ inventory_hostname }}:{{ bitwarden_http_port }} |
||||
|
||||
# Should registration be enabled |
||||
bitwarden_registration: False |
||||
# List of domain names for which registration will be accepted |
||||
# Thos domains will be accepted for registration even if bitwarden_registration is set to False |
||||
bitwarden_domains_whitelist: |
||||
- "{{ ansible_domain }}" |
||||
|
||||
# Admin Token to access /admin. A random one is created if not defined |
||||
# bitwarden_admin_token: S3cr3t. |
||||
|
||||
# Or you can just disable the admin token. But you have to protect /admin yourself (eg, on a reverse proxy) |
||||
bitwarden_disable_admin_token: False |
@ -0,0 +1,5 @@ |
||||
--- |
||||
|
||||
- name: restart bitwarden_rs |
||||
service: name=bitwarden_rs state=restarted |
||||
when: not bitwarden_started.changed |
@ -0,0 +1,7 @@ |
||||
--- |
||||
|
||||
dependencies: |
||||
- role: rust |
||||
- role: nginx |
||||
- role: mysql_server |
||||
when: bitwarden_db_engine == 'mysql' and (bitwarden_db_server == 'localhost' or bitwarden_db_server == '127.0.0.1') |
@ -0,0 +1,12 @@ |
||||
--- |
||||
|
||||
- name: Compress previous version |
||||
command: tar cJf {{ bitwarden_root_dir }}/archives/{{ bitwarden_current_version }}+{{ bitwarden_web_current_version }}.txz ./ |
||||
args: |
||||
warn: False |
||||
chdir: "{{ bitwarden_root_dir }}/archives/{{ bitwarden_current_version }}+{{ bitwarden_web_current_version }}" |
||||
tags: bitwarden |
||||
|
||||
- name: Remove archive dir |
||||
file: path={{ bitwarden_root_dir }}/archives/{{ bitwarden_current_version }}+{{ bitwarden_web_current_version }} state=absent |
||||
tags: bitwarden |
@ -0,0 +1,23 @@ |
||||
--- |
||||
|
||||
- name: Create archive dir |
||||
file: path={{ bitwarden_root_dir }}/archives/{{ bitwarden_current_version }}+{{ bitwarden_web_current_version }} state=directory |
||||
tags: bitwarden |
||||
|
||||
- name: Stop bitwarden during upgrade |
||||
service: name=bitwarden_rs state=stopped |
||||
tags: bitwarden |
||||
|
||||
- name: Archive current version |
||||
synchronize: |
||||
src: "{{ bitwarden_root_dir }}/{{ item }}" |
||||
dest: "{{ bitwarden_root_dir }}/archives/{{ bitwarden_current_version }}+{{ bitwarden_web_current_version }}/" |
||||
recursive: True |
||||
delete: True |
||||
delegate_to: "{{ inventory_hostname }}" |
||||
loop: |
||||
- bitwarden_rs |
||||
- data |
||||
- etc |
||||
- web-vault |
||||
tags: bitwarden |
@ -0,0 +1,8 @@ |
||||
--- |
||||
|
||||
- name: Remove temp files |
||||
files: path={{ item }} state=absent |
||||
loop: |
||||
- "{{ bitwarden_root_dir }}/tmp/bitwarden_rs-{{ bitwarden_version }}" |
||||
- "{{ bitwarden_root_dir }}/tmp/bitwarden_rs-{{ bitwarden_version }}.tar.gz" |
||||
tags: bitwarden |
@ -0,0 +1,11 @@ |
||||
--- |
||||
|
||||
- name: Deploy configuration |
||||
template: src=bitwarden_rs.conf.j2 dest={{ bitwarden_root_dir }}/etc/bitwarden_rs.conf group={{ bitwarden_user }} mode=640 |
||||
notify: restart bitwarden_rs |
||||
tags: bitwarden |
||||
|
||||
- name: Deploy nginx configuration |
||||
template: src=nginx.conf.j2 dest=/etc/nginx/ansible_conf.d/31-bitwarden.conf |
||||
notify: reload nginx |
||||
tags: bitwarden |
@ -0,0 +1,24 @@ |
||||
--- |
||||
|
||||
- name: Create directories |
||||
file: path={{ bitwarden_root_dir }}/{{ item.dir }} state=directory owner={{ item.owner | default(omit) }} group={{ item.group | default(omit) }} mode={{ item.mode | default(omit) }} |
||||
loop: |
||||
- dir: / |
||||
mode: 755 |
||||
- dir: etc |
||||
group: "{{ bitwarden_user }}" |
||||
mode: 750 |
||||
- dir: tmp |
||||
mode: 700 |
||||
- dir: meta |
||||
mode: 700 |
||||
- dir: archives |
||||
mode: 700 |
||||
- dir: data |
||||
owner: "{{ bitwarden_user }}" |
||||
group: "{{ bitwarden_user }}" |
||||
mode: 700 |
||||
- dir: web-vault |
||||
- dir: backup |
||||
mode: 700 |
||||
tags: bitwarden |
@ -0,0 +1,67 @@ |
||||
--- |
||||
|
||||
- name: Set initial install modes |
||||
block: |
||||
- set_fact: bitwarden_install_mode='none' |
||||
- set_fact: bitwarden_current_version='' |
||||
- set_fact: bitwarden_web_install_mode='none' |
||||
- set_fact: bitwarden_web_current_version='' |
||||
tags: bitwarden |
||||
|
||||
- name: Check if server is installed |
||||
stat: path={{ bitwarden_root_dir }}/meta/ansible_version |
||||
register: bitwarden_version_file |
||||
tags: bitwarden |
||||
|
||||
- when: bitwarden_version_file.stat.exists |
||||
block: |
||||
- name: Check installed version |
||||
slurp: src={{ bitwarden_root_dir }}/meta/ansible_version |
||||
register: bitwarden_current_version |
||||
- set_fact: bitwarden_current_version={{ bitwarden_current_version.content | b64decode | trim }} |
||||
- set_fact: bitwarden_install_mode='upgrade' |
||||
when: bitwarden_current_version != bitwarden_version |
||||
tags: bitwarden |
||||
|
||||
- when: not bitwarden_version_file.stat.exists |
||||
block: |
||||
- set_fact: bitwarden_install_mode='install' |
||||
tags: bitwarden |
||||
|
||||
- name: Check if web vault is installed |
||||
stat: path={{ bitwarden_root_dir }}/meta/ansible_web_version |
||||
register: bitwarden_web_version_file |
||||
tags: bitwarden |
||||
|
||||
- when: bitwarden_web_version_file.stat.exists |
||||
block: |
||||
- name: Check installed version |
||||
slurp: src={{ bitwarden_root_dir }}/meta/ansible_web_version |
||||
register: bitwarden_web_current_version |
||||
- set_fact: bitwarden_web_current_version={{ bitwarden_web_current_version.content | b64decode | trim }} |
||||
- set_fact: bitwarden_web_install_mode='upgrade' |
||||
when: bitwarden_web_current_version != bitwarden_web_version |
||||
tags: bitwarden |
||||
|
||||
- when: not bitwarden_web_version_file.stat.exists |
||||
block: |
||||
- set_fact: bitwarden_web_install_mode='install' |
||||
tags: bitwarden |
||||
|
||||
- when: bitwarden_admin_token is not defined |
||||
name: Generate a random admin token |
||||
block: |
||||
- import_tasks: ../includes/get_rand_pass.yml |
||||
vars: |
||||
- pass_file: "{{ bitwarden_root_dir }}/meta/ansible_admin_token" |
||||
- set_fact: bitwarden_admin_token={{ rand_pass }} |
||||
tags: bitwarden |
||||
|
||||
- when: bitwarden_db_pass is not defined |
||||
tags: bitwarden |
||||
block: |
||||
- import_tasks: ../includes/get_rand_pass.yml |
||||
vars: |
||||
- pass_file: "{{ bitwarden_root_dir }}/meta/ansible_dbpass" |
||||
- set_fact: bitwarden_db_pass={{ rand_pass }} |
||||
|
@ -0,0 +1,97 @@ |
||||
--- |
||||
|
||||
- name: Install needed packages |
||||
yum: |
||||
name: |
||||
- openssl-devel |
||||
- gcc |
||||
- sqlite |
||||
tags: bitwarden |
||||
|
||||
- name: Check if MariaDB version is set |
||||
fail: msg="Need to define mysql_mariadb_version" |
||||
when: |
||||
- bitwarden_db_engine == 'mysql' |
||||
- mysql_mariadb_version is not defined or mysql_mariadb_version == 'default' |
||||
tags: bitwarden |
||||
|
||||
- name: Install MariaDB devel package |
||||
yum: |
||||
name: |
||||
- MariaDB-devel |
||||
- /usr/lib64/libmariadb.so |
||||
when: bitwarden_db_engine == 'mysql' |
||||
tags: bitwarden |
||||
|
||||
- when: bitwarden_install_mode != 'none' |
||||
tags: bitwarden |
||||
block: |
||||
- name: Download bitwarden |
||||
get_url: |
||||
url: "{{ bitwarden_archive_url }}" |
||||
dest: "{{ bitwarden_root_dir }}/tmp" |
||||
checksum: sha1:{{ bitwarden_archive_sha1 }} |
||||
|
||||
- name: Extract bitwarden archive |
||||
unarchive: |
||||
src: "{{ bitwarden_root_dir }}/tmp/bitwarden_rs-{{ bitwarden_version }}.tar.gz" |
||||
dest: "{{ bitwarden_root_dir }}/tmp" |
||||
remote_src: True |
||||
|
||||
- name: Build bitwarden |
||||
command: bash -lc 'cargo build --features={{ (bitwarden_db_engine == "mysql") | ternary("mysql","sqlite") }} --release' |
||||
args: |
||||
chdir: "{{ bitwarden_root_dir }}/tmp/bitwarden_rs-{{ bitwarden_version }}" |
||||
|
||||
- name: Install binary |
||||
copy: src={{ bitwarden_root_dir }}/tmp/bitwarden_rs-{{ bitwarden_version }}/target/release/bitwarden_rs dest="{{ bitwarden_root_dir }}/" mode=755 remote_src=True |
||||
notify: restart bitwarden_rs |
||||
|
||||
- when: bitwarden_web_install_mode != 'none' |
||||
tags: bitwarden |
||||
block: |
||||
- name: Download bitwarden web vault |
||||
get_url: |
||||
url: "{{ bitwarden_web_archive_url }}" |
||||
dest: "{{ bitwarden_root_dir }}/tmp" |
||||
checksum: sha1:{{ bitwarden_web_archive_sha1 }} |
||||
|
||||
- name: Extract the archive |
||||
unarchive: |
||||
src: "{{ bitwarden_root_dir }}/tmp/bw_web_v{{ bitwarden_web_version }}.tar.gz" |
||||
dest: "{{ bitwarden_root_dir }}/tmp" |
||||
remote_src: True |
||||
|
||||
- name: Move files to their final location |
||||
synchronize: |
||||
src: "{{ bitwarden_root_dir }}/tmp/web-vault/" |
||||
dest: "{{ bitwarden_root_dir }}/web-vault/" |
||||
recursive: True |
||||
delete: True |
||||
delegate_to: "{{ inventory_hostname }}" |
||||
|
||||
- name: Install systemd unit |
||||
template: src=bitwarden_rs.service.j2 dest=/etc/systemd/system/bitwarden_rs.service |
||||
register: bitwarden_unit |
||||
tags: bitwarden |
||||
|
||||
- name: Reload systemd |
||||
systemd: daemon_reload=True |
||||
when: bitwarden_unit.changed |
||||
tags: bitwarden |
||||
|
||||
- name: Install pre/post backup hooks |
||||
template: src={{ item }}-backup.sh.j2 dest=/etc/backup/{{ item }}.d/bitwarden_rs.sh mode=755 |
||||
loop: |
||||
- pre |
||||
- post |
||||
tags: bitwarden |
||||
|
||||
- import_tasks: ../includes/webapps_create_mysql_db.yml |
||||
vars: |
||||
- db_name: "{{ bitwarden_db_name }}" |
||||
- db_user: "{{ bitwarden_db_user }}" |
||||
- db_server: "{{ bitwarden_db_server }}" |
||||
- db_pass: "{{ bitwarden_db_pass }}" |
||||
when: bitwarden_db_engine == 'mysql' |
||||
tags: bitwarden |
@ -0,0 +1,9 @@ |
||||
--- |
||||
|
||||
- name: Handle bitwarden_rs ports in the firewall |
||||
iptables_raw: |
||||
name: bitwarden_rs |
||||
state: "{{ (bitwarden_src_ip | length > 0) | ternary('present','absent') }}" |
||||
rules: "-A INPUT -m state --state NEW -m multiport -p tcp --dports {{ bitwarden_http_port }},{{ bitwarden_ws_port }} -s {{ bitwarden_src_ip | join(',') }} -j ACCEPT" |
||||
when: iptables_manage | default(True) |
||||
tags: firewall,bitwarden |
@ -0,0 +1,14 @@ |
||||
--- |
||||
|
||||
- include: user.yml |
||||
- include: directories.yml |
||||
- include: facts.yml |
||||
- include: archive_pre.yml |
||||
when: bitwarden_install_mode == 'upgrade' or bitwarden_web_install_mode == 'upgrade' |
||||
- include: install.yml |
||||
- include: conf.yml |
||||
- include: iptables.yml |
||||
- include: service.yml |
||||
- include: write_version.yml |
||||
- include: archive_post.yml |
||||
when: bitwarden_install_mode == 'upgrade' or bitwarden_web_install_mode == 'upgrade' |
@ -0,0 +1,6 @@ |
||||
--- |
||||
|
||||
- name: Start and enable the service |
||||
service: name=bitwarden_rs state=started enabled=True |
||||
register: bitwarden_started |
||||
tags: bitwarden |
@ -0,0 +1,5 @@ |
||||
--- |
||||
|
||||
- name: Create bitwarden_rs user |
||||
user: name={{ bitwarden_user }} home={{ bitwarden_root_dir }} system=True |
||||
tags: bitwarden |
@ -0,0 +1,10 @@ |
||||
--- |
||||
|
||||
- name: Write versions |
||||
copy: content={{ item.version }} dest={{ bitwarden_root_dir }}/meta/{{ item.file }} |
||||
loop: |
||||
- version: "{{ bitwarden_version }}" |
||||
file: ansible_version |
||||
- version: "{{ bitwarden_web_version }}" |
||||
file: ansible_web_version |
||||
tags: bitwarden |
@ -0,0 +1,25 @@ |
||||
IP_HEADER=X-Forwarded-For |
||||
SIGNUPS_VERIFY=true |
||||
SIGNUPS_ALLOWED={{ bitwarden_registration | ternary('true','false') }} |
||||
{% if bitwarden_domains_whitelist | length > 0 %} |
||||
SIGNUPS_DOMAINS_WHITELIST={{ bitwarden_domains_whitelist | join(',') }} |
||||
{% endif %} |
||||
ADMIN_TOKEN={{ bitwarden_admin_token }} |
||||
DISABLE_ADMIN_TOKEN={{ bitwarden_disable_admin_token | ternary('true','false') }} |
||||
DOMAIN={{ bitwarden_public_url }} |
||||
ROCKET_ENV=prod |
||||
ROCKET_ADDRESS=0.0.0.0 |
||||
ROCKET_PORT={{ bitwarden_http_port }} |
||||
WEBSOCKET_ENABLED=true |
||||
WEBSOCKET_PORT={{ bitwarden_ws_port }} |
||||
SMTP_HOST=localhost |
||||
SMTP_PORT=25 |
||||
SMTP_SSL=false |
||||
SMTP_FROM=bitwarden-rs-noreply@{{ ansible_domain }} |
||||
{% if bitwarden_db_engine == 'mysql' %} |
||||
DATABASE_URL=mysql://{{ bitwarden_db_user }}:{{ bitwarden_db_pass | urlencode | regex_replace('/','%2F') }}@{{ bitwarden_db_server }}:{{ bitwarden_db_port }}/{{ bitwarden_db_name }} |
||||
ENABLE_DB_WAL=false |
||||
{% else %} |
||||
DATABASE_URL=data/db.sqlite3 |
||||
{% endif %} |
||||
# vim: syntax=ini |
@ -0,0 +1,27 @@ |
||||
[Unit] |
||||
Description=Bitwarden Server (Rust Edition) |
||||
Documentation=https://github.com/dani-garcia/bitwarden_rs |
||||
After=network.target |
||||
{% if bitwarden_db_engine == 'mysql' and (bitwarden_db_server == 'localhost' or bitwarden_db_server == '127.0.0.1') %} |
||||
After=mariadb.service |
||||
Requires=mariadb.service |
||||
{% endif %} |
||||
|
||||
[Service] |
||||
User={{ bitwarden_user }} |
||||
Group={{ bitwarden_user }} |
||||
EnvironmentFile={{ bitwarden_root_dir }}/etc/bitwarden_rs.conf |
||||
ExecStart={{ bitwarden_root_dir }}/bitwarden_rs |
||||
PrivateTmp=true |
||||
PrivateDevices=true |
||||
ProtectHome=true |
||||
ProtectSystem=full |
||||
WorkingDirectory={{ bitwarden_root_dir }} |
||||
ReadWriteDirectories={{ bitwarden_root_dir }}/data |
||||
ReadOnlyDirectories={{ bitwarden_root_dir }}/etc {{ bitwarden_root_dir }}/web-vault |
||||
Restart=on-failure |
||||
StartLimitInterval=0 |
||||
RestartSec=30 |
||||
|
||||
[Install] |
||||
WantedBy=multi-user.target |
@ -0,0 +1,71 @@ |
||||
server { |
||||
listen 443 ssl http2; |
||||
server_name {{ bitwarden_public_url | urlsplit('hostname') }}; |
||||
|
||||
include /etc/nginx/ansible_conf.d/acme.inc; |
||||
|
||||
{% if bitwarden_cert_path is defined and bitwarden_key_path is defined %} |
||||
ssl_certificate {{ bitwarden_cert_path }}; |
||||
ssl_certificate_key {{ bitwarden_key_path }}; |
||||
{% elif bitwarden_letsencrypt_cert is defined and bitwarden_letsencrypt_cert == True %} |
||||
ssl_certificate /var/lib/dehydrated/certificates/certs/{{ bitwarden_public_url | urlsplit('hostname') }}/fullchain.pem; |
||||
ssl_certificate_key /var/lib/dehydrated/certificates/certs/{{ bitwarden_public_url | urlsplit('hostname') }}/privkey.pem; |
||||
{% elif bitwarden_letsencrypt_cert is string %} |
||||
ssl_certificate /var/lib/dehydrated/certificates/certs/{{ bitwarden_letsencrypt_cert }}/fullchain.pem; |
||||
ssl_certificate_key /var/lib/dehydrated/certificates/certs/{{ bitwarden_letsencrypt_cert }}/privkey.pem; |
||||
{% endif %} |
||||
|
||||
server_name {{ bitwarden_public_url | urlsplit('hostname') }}; |
||||
|
||||
root {{ bitwarden_root_dir }}/web-vault; |
||||
|
||||
client_max_body_size 512M; |
||||
|
||||
if ($request_method !~ ^(GET|POST|HEAD|PUT|DELETE)$ ) { |
||||
return 405; |
||||
} |
||||
|
||||
location /notifications/hub { |
||||
proxy_pass http://localhost:{{ bitwarden_ws_port }}; |
||||
proxy_set_header Upgrade $http_upgrade; |
||||
proxy_set_header Connection "upgrade"; |
||||
} |
||||
location /notifications/hub/negotiate { |
||||
proxy_pass http://localhost:{{ bitwarden_http_port }}; |
||||
} |
||||
|
||||
location @proxy { |
||||
proxy_pass http://localhost:{{ bitwarden_http_port }}; |
||||
} |
||||
|
||||
location / { |
||||
try_files $uri $uri/index.html @proxy; |
||||
} |
||||
|
||||
add_header X-Frame-Options "DENY"; |
||||
add_header X-Content-Type-Options "nosniff"; |
||||
add_header X-XSS-Protection "1; mode=block"; |
||||
add_header Strict-Transport-Security "$hsts_header"; |
||||
|
||||
# Send info about the original request to the backend |
||||
proxy_set_header X-Forwarded-For "$proxy_add_x_forwarded_for"; |
||||
proxy_set_header X-Real-IP "$remote_addr"; |
||||
proxy_set_header X-Forwarded-Proto "$scheme"; |
||||
proxy_set_header X-Forwarded-Host "$host"; |
||||
proxy_set_header Host "$host"; |
||||
|
||||
# Set the timeout to read responses from the backend |
||||
proxy_read_timeout 60s; |
||||
|
||||
# Enable Keep Alive to the backend |
||||
proxy_socket_keepalive on; |
||||
|
||||
# Disable buffering large files |
||||
proxy_max_temp_file_size 5m; |
||||
|
||||
allow 127.0.0.1; |
||||
{% for ip in bitwarden_web_src_ip %} |
||||
allow {{ ip }}; |
||||
{% endfor %} |
||||
deny all; |
||||
} |
@ -0,0 +1,4 @@ |
||||
#!/bin/bash -e |
||||
|
||||
rm -f {{ bitwarden_root_dir }}/backup/* |
||||
umount /home/lbkp/bitwarden |
@ -0,0 +1,17 @@ |
||||
#!/bin/bash -e |
||||
|
||||
mkdir -p /home/lbkp/bitwarden_rs/ |
||||
cp {{ bitwarden_root_dir }}/data/rsa* {{ bitwarden_root_dir }}/backup/ |
||||
{% if bitwarden_db_engine == 'mysql' %} |
||||
/usr/bin/mysqldump \ |
||||
{% if bitwarden_db_server != 'localhost' and bitwarden_db_server != '127.0.0.1' %} |
||||
--user='{{ bitwarden_db_user }}' \ |
||||
--password='{{ bitwarden_db_pass }}' \ |
||||
--host='{{ bitwarden_db_server }}' \ |
||||
{% endif %} |
||||
--quick --single-transaction \ |
||||
--add-drop-table {{ bitwarden_db_name }} | zstd -T0 -c > {{ bitwarden_root_dir }}/backup/{{ bitwarden_db_name }}.sql.zstd |
||||
{% else %} |
||||
sqlite3 {{ bitwarden_root_dir }}/data/db.sqlite3 ".backup '{{ bitwarden_root_dir }}/backup/db.sqlite3'" |
||||
{% endif %} |
||||
mount -o bind,ro {{ bitwarden_root_dir }}/backup/ /home/lbkp/bitwarden_rs/ |
@ -0,0 +1,117 @@ |
||||
--- |
||||
|
||||
bm_http_ports: |
||||
- 80 |
||||
- 443 |
||||
bm_http_src_ip: |
||||
- 0.0.0.0/0 |
||||
|
||||
bm_imap_ports: |
||||
- 143 |
||||
- 993 |
||||
bm_imap_src_ip: |
||||
- 0.0.0.0/0 |
||||
|
||||
bm_pop_ports: |
||||
- 110 |
||||
- 995 |
||||
bm_pop_src_ip: |
||||
- 0.0.0.0/0 |
||||
|
||||
bm_smtp_ports: |
||||
- 25 |
||||
- 465 |
||||
- 587 |
||||
bm_smtp_src_ip: |
||||
- 0.0.0.0/0 |
||||
|
||||
bm_milter_ports: |
||||
- 2500 |
||||
bm_milter_src:ip: [] |
||||
|
||||
bm_int_ports: |
||||
- 24 |
||||
- 144 |
||||
- 1110 |
||||
- 1143 |
||||
- 2000 |
||||
- 2400 |
||||
- 2500 |
||||
- 4444 |
||||
- 5280 |
||||
- 5290 |
||||
- 5432 |
||||
- '5701:5715' |
||||
- 8021 |
||||
- 8022 |
||||
- 8079 |
||||
- 8080 |
||||
- 8082 |
||||
- 8084 |
||||
- 8087 |
||||
- 9083 |
||||
- 9086 |
||||
- 9090 |
||||
- 9099 |
||||
- 9200 |
||||
- 9300 |
||||
bm_int_src_ip: [] |
||||
|
||||
# bm_letsencrypt_cert: bluemind.domain.tld |
||||
|
||||
bm_mem_alloc_base: |
||||
bm-core: |
||||
heap: 512 |
||||
direct: 512 |
||||
spare: 20 |
||||
bm-node: |
||||
heap: 128 |
||||
direct: 128 |
||||
spare: 0 |
||||
bm-eas: |
||||
heap: 256 |
||||
direct: 128 |
||||
spare: 2 |
||||
bm-mapi: |
||||
heap: 512 |
||||
direct: 256 |
||||
spare: 10 |
||||
bm-ips: |
||||
heap: 64 |
||||
direct: 64 |
||||
spare: 0 |
||||
bm-hps: |
||||
heap: 128 |
||||
direct: 128 |
||||
spare: 0 |
||||
bm-lmtpd: |
||||
heap: 128 |
||||
direct: 128 |
||||
spare: 0 |
||||
bm-locator: |
||||
heap: 64 |
||||
direct: 64 |
||||
spare: 0 |
||||
bm-milter: |
||||
heap: 64 |
||||
direct: 64 |
||||
spare: 0 |
||||
bm-tika: |
||||
heap: 128 |
||||
direct: 128 |
||||
spare: 0 |
||||
bm-xmpp: |
||||
heap: 32 |
||||
direct: 32 |
||||
spare: 0 |
||||
bm-ysnp: |
||||
heap: 64 |
||||
direct: 64 |
||||
spare: 0 |
||||
bm-elasticsearch: |
||||
heap: 512 |
||||
direct: 512 |
||||
spare: 20 |
||||
bm_mem_alloc: {} |
||||
bm_mem_alloc_rules: "{{ bm_mem_alloc_base | combine(bm_mem_alloc, recursive=True) }}" |
||||
|
@ -0,0 +1,4 @@ |
||||
--- |
||||
|
||||
- name: restart bluemind |
||||
command: bmctl restart |
@ -0,0 +1,118 @@ |
||||
--- |
||||
|
||||
- name: Install tools |
||||
yum: |
||||
name: |
||||
- socat |
||||
tags: bm |
||||
|
||||
- name: Create dehydrated hook dir |
||||
file: path=/etc/dehydrated/hooks_deploy_cert.d state=directory |
||||
tags: bm |
||||
|
||||
- name: Deploy dehydrated hook |
||||
template: src=dehydrated_deploy_hook.j2 dest=/etc/dehydrated/hooks_deploy_cert.d/bluemind mode=755 |
||||
tags: bm |
||||
|
||||
- name: Create local conf directory |
||||
file: path=/etc/bm/local state=directory |
||||
tags: bm |
||||
|
||||
- name: Configure proxy |
||||
lineinfile: |
||||
regex: '^PROXY_OPTS=.*' |
||||
line: "PROXY_OPTS=\"{{ (system_proxy is defined and system_proxy != '') | ternary('-Dhttps.proxyHost=' ~ system_proxy | urlsplit('hostname') ~ ' -Dhttps.proxyPort=' ~ system_proxy | urlsplit('port') ~ ' -Dhttp.proxyHost=' ~ system_proxy | urlsplit('hostname') ~ ' -Dhttp.proxyPort=' ~ system_proxy | urlsplit('port'),'') }}\"" |
||||
path: /etc/bm/local/{{ item }}.ini |
||||
create: True |
||||
loop: |
||||
- bm-core |
||||
- bm-webserver |
||||
notify: restart bluemind |
||||
tags: bm |
||||
|
||||
- name: Configure JVM options |
||||
lineinfile: |
||||
regex: '^JVM_OPTS=.*' |
||||
line: "JVM_OPTS=\"${PROXY_OPTS}\"" |
||||
path: /etc/bm/local/{{ item }}.ini |
||||
insertafter: '^PROXY_OPTS=.*' |
||||
loop: |
||||
- bm-core |
||||
- bm-webserver |
||||
notify: restart bluemind |
||||
tags: bm |
||||
|
||||
- name: Configure memory allocation rules |
||||
template: src=rules.json.j2 dest=/etc/bm/local/rules.json |
||||
notify: restart bluemind |
||||
tags: bm |
||||
|
||||
- set_fact: |
||||
bm_restart_services: "[ 'bm-elasticsearch', 'bm-mapi' ]" |
||||
tags: bm |
||||
|
||||
- name: Create systemd unit snippet dirs |
||||
file: path=/etc/systemd/system/{{ item }}.service.d state=directory |
||||
loop: "{{ bm_restart_services }}" |
||||
tags: bm |
||||
|
||||
- name: Configure systemd to restart services on failure |
||||
copy: |
||||
content: | |
||||
[Service] |
||||
TimeoutSec=60 |
||||
StartLimitInterval=0 |
||||
RestartSec=1 |
||||
Restart=on-failure |
||||
dest: /etc/systemd/system/{{ item }}.service.d/restart.conf |
||||
loop: "{{ bm_restart_services }}" |
||||
register: bm_units |
||||
notify: restart bluemind |
||||
tags: bm |
||||
|
||||
- name: Reload systemd |
||||
systemd: daemon_reload=True |
||||
when: bm_units.results | selectattr('changed','equalto',True) | list | length > 0 |
||||
tags: bm |
||||
|
||||
- name: Handle firewall ports |
||||
iptables_raw: |
||||
name: "{{ item.name }}" |
||||
state: "{{ (item.src | length > 0) | ternary('present','absent') }}" |
||||
rules: "{% if 'tcp' in item.proto | default(['tcp']) or item.proto | default('tcp') == 'tcp' %}-A INPUT -m state --state NEW -p tcp -m multiport --dports {{ item.ports | join(',') }} -s {{ item.src | join(',') }} -j ACCEPT\n{% endif %} |
||||
{% if 'udp' in item.proto | default(['tcp']) or item.proto | default('tcp') == 'udp' %}-A INPUT -m state --state NEW -p udp -m multiport --dports {{ item.ports | join(',') }} -s {{ item.src | join(',') }} -j ACCEPT{% endif %}" |
||||
when: iptables_manage | default(True) |
||||
with_items: |
||||
- ports: "{{ bm_http_ports }}" |
||||
name: bm_http_ports |
||||
src: "{{ bm_http_src_ip }}" |
||||
- ports: "{{ bm_imap_ports }}" |
||||
name: bm_imap_ports |
||||
src: "{{ bm_imap_src_ip }}" |
||||
- ports: "{{ bm_pop_ports }}" |
||||
name: bm_pop_ports |
||||
src: "{{ bm_pop_src_ip }}" |
||||
- ports: "{{ bm_smtp_ports }}" |
||||
name: bm_smtp_ports |
||||
src: "{{ bm_smtp_src_ip }}" |
||||
- ports: "{{ bm_milter_ports }}" |
||||
name: bm_milter_ports |
||||
src: "{{ bm_milter_src_ip }}" |
||||
- ports: "{{ bm_int_ports }}" |
||||
name: bm_int_ports |
||||
src: "{{ bm_int_src_ip }}" |
||||
tags: bm,firewall |
||||
|
||||
- name: Create pre/post backup hook dir |
||||
file: path=/etc/backup/{{ item }}.d state=directory mode=750 |
||||
loop: |
||||
- pre |
||||
- post |
||||
tags: bm |
||||
|
||||
- name: Deploy pre and post backup script |
||||
template: src={{ item }}-backup.j2 dest=/etc/backup/{{ item }}.d/bluemind mode=755 |
||||
loop: |
||||
- pre |
||||
- post |
||||
tags: bm |
@ -0,0 +1,53 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<configuration> |
||||
<appender name="CORE" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-core - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
<logger name="org.apache.directory.shared" level="ERROR" /> |
||||
<root level="INFO"> |
||||
<appender-ref ref="CORE" /> |
||||
</root> |
||||
|
||||
<appender name="XMPP" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-xmpp - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
<logger name="net.bluemind.xmpp" level="INFO" additivity="false" /> |
||||
<appender-ref ref="XMPP" /> |
||||
</logger> |
||||
|
||||
<appender name="MAILINDEX" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-mailindex - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
<logger name="net.bluemind.index.mail" level="INFO" additivity="false" /> |
||||
<appender-ref ref="MAILINDEX" /> |
||||
</logger> |
||||
|
||||
<appender name="SLOWRESTCALL" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-slowrestcall - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
<logger name="net.bluemind.core.rest.log.CallLogger" level="WARN" additivity="false" /> |
||||
<appender-ref ref="SLOWRESTCALL" /> |
||||
</logger> |
||||
|
||||
<appender name="RESTSOCKJSPROXYHANDLER" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-js - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
<logger name="net.bluemind.core.rest.sockjs.vertx.RestSockJsProxyHandler" level="INFO" additivity="false" /> |
||||
<appender-ref ref="RESTSOCKJSPROXYHANDLER" /> |
||||
</logger> |
||||
</configuration> |
@ -0,0 +1,59 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<configuration> |
||||
<appender name="ALL" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-eas - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
|
||||
<appender name="REQUESTS" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-eas-requests - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
|
||||
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"> |
||||
<!-- in the absence of the class attribute, it is assumed that the |
||||
desired discriminator type is |
||||
ch.qos.logback.classic.sift.MDCBasedDiscriminator --> |
||||
<discriminator> |
||||
<key>user</key> |
||||
<defaultValue>anonymous</defaultValue> |
||||
</discriminator> |
||||
<sift> |
||||
<appender name="FILE-${user}" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
||||
<file>/var/log/bm-eas/user-eas-${user}.log</file> |
||||
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> |
||||
<maxIndex>10</maxIndex> |
||||
<FileNamePattern>/var/log/bm-eas/user-eas-${user}.log.%i.gz</FileNamePattern> |
||||
</rollingPolicy> |
||||
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> |
||||
<MaxFileSize>5000KB</MaxFileSize> |
||||
</triggeringPolicy> |
||||
<encoder> |
||||
<pattern>%d [%thread] %c{1} %p - %m\n</pattern> |
||||
</encoder> |
||||
</appender> |
||||
</sift> |
||||
</appender> |
||||
|
||||
<appender name="ASYNC_SIFT" class="ch.qos.logback.classic.AsyncAppender"> |
||||
<queueSize>500</queueSize> |
||||
<discardingThreshold>0</discardingThreshold> |
||||
<appender-ref ref="SIFT" /> |
||||
</appender> |
||||
|
||||
<logger name="org.apache.directory.shared.asn1.ber" level="ERROR"> |
||||
<appender-ref ref="ALL"/> |
||||
</logger> |
||||
<logger name="net.bluemind.vertx.common.request.impl.WrappedResponse" level="INFO" additivity="true"> |
||||
<appender-ref ref="REQUESTS"/> |
||||
</logger> |
||||
|
||||
<root level="INFO"> |
||||
<appender-ref ref="ALL"/> |
||||
<appender-ref ref="ASYNC_SIFT"/> |
||||
</root> |
||||
</configuration> |
@ -0,0 +1,12 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<configuration> |
||||
<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-hps - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
<root level="INFO"> |
||||
<appender-ref ref="SYSLOG" /> |
||||
</root> |
||||
</configuration> |
@ -0,0 +1,12 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<configuration> |
||||
<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-ips - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
<root level="INFO"> |
||||
<appender-ref ref="SYSLOG" /> |
||||
</root> |
||||
</configuration> |
@ -0,0 +1,12 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<configuration> |
||||
<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-lmtp - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
<root level="INFO"> |
||||
<appender-ref ref="SYSLOG" /> |
||||
</root> |
||||
</configuration> |
@ -0,0 +1,13 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<configuration> |
||||
<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-locator - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
<logger name="org.apache.directory.shared.asn1.ber" level="ERROR" /> |
||||
<root level="INFO"> |
||||
<appender-ref ref="SYSLOG" /> |
||||
</root> |
||||
</configuration> |
@ -0,0 +1,12 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<configuration> |
||||
<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-milter - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
<root level="INFO"> |
||||
<appender-ref ref="SYSLOG" /> |
||||
</root> |
||||
</configuration> |
@ -0,0 +1,13 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<configuration> |
||||
<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-node - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
<logger name="org.apache.sshd.server" level="WARN" /> |
||||
<root level="INFO"> |
||||
<appender-ref ref="SYSLOG" /> |
||||
</root> |
||||
</configuration> |
@ -0,0 +1,19 @@ |
||||
[Unit] |
||||
Description=Bluemind syslog daemon |
||||
After=syslog.target |
||||
|
||||
[Service] |
||||
Type=simple |
||||
ExecStart=/bin/socat -t0 -T0 -u -s udp4-recv:10514 stdout |
||||
User=bm-syslog |
||||
Group=bm-syslog |
||||
Restart=always |
||||
PrivateTmp=yes |
||||
PrivateDevices=yes |
||||
ProtectSystem=full |
||||
ProtectHome=yes |
||||
NoNewPrivileges=yes |
||||
|
||||
[Install] |
||||
WantedBy=multi-user.target |
||||
|
@ -0,0 +1,12 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<configuration> |
||||
<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-locator - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
<root level="INFO"> |
||||
<appender-ref ref="SYSLOG" /> |
||||
</root> |
||||
</configuration> |
@ -0,0 +1,43 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<configuration> |
||||
<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-webserver - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
<root level="INFO"> |
||||
<appender-ref ref="SYSLOG" /> |
||||
</root> |
||||
|
||||
<appender name="DAV" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-dav - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
<logger name="net.bluemind.dav.server" level="INFO" additivity="false"> |
||||
<appender-ref ref="DAV" /> |
||||
</logger> |
||||
|
||||
<appender name="SETUP" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-setup - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
<logger name="net.bluemind.sw.server" level="INFO" additivity="false"> |
||||
<appender-ref ref="SETUP" /> |
||||
</logger> |
||||
|
||||
<appender name="JSLOG" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-js-errors - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
<logger name="net.bluemind.webmodule.server.handlers.LogHandler" level="INFO" additivity="false"> |
||||
<appender-ref ref="JSLOG" /> |
||||
</logger> |
||||
</configuration> |
||||
|
@ -0,0 +1,12 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<configuration> |
||||
<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-xmpp - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
<root level="INFO"> |
||||
<appender-ref ref="SYSLOG" /> |
||||
</root> |
||||
</configuration> |
@ -0,0 +1,14 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<configuration> |
||||
<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender"> |
||||
<syslogHost>localhost</syslogHost> |
||||
<port>10514</port> |
||||
<facility>DAEMON</facility> |
||||
<suffixPattern>bm-ysnp - [%thread] %c{1} %p - %m\n</suffixPattern> |
||||
</appender> |
||||
<logger name="org.apache.directory.shared.asn1.ber" level="ERROR" /> |
||||
<root level="INFO"> |
||||
<appender-ref ref="SYSLOG" /> |
||||
</root> |
||||
</configuration> |
||||
|
@ -0,0 +1,12 @@ |
||||
#!/bin/bash -e |
||||
|
||||
{% if bm_letsencrypt_cert is defined %} |
||||
if [ $1 == "{{ bm_letsencrypt_cert }}" ]; then |
||||
cat /var/lib/dehydrated/certificates/certs/{{ bm_letsencrypt_cert }}/privkey.pem > /etc/ssl/certs/bm_cert.pem |
||||
cat /var/lib/dehydrated/certificates/certs/{{ bm_letsencrypt_cert }}/fullchain.pem >> /etc/ssl/certs/bm_cert.pem |
||||
chown root:root /etc/ssl/certs/bm_cert.pem |
||||
chmod 644 /etc/ssl/certs/bm_cert.pem |
||||
/bin/systemctl reload postfix |
||||
/bin/systemctl reload bm-nginx |
||||
fi |
||||
{% endif %} |
@ -0,0 +1,5 @@ |
||||
#!/bin/sh |
||||
|
||||
set -e |
||||
|
||||
rm -rf /home/lbkp/bm/* |
@ -0,0 +1,17 @@ |
||||
#!/bin/sh |
||||
|
||||
set -e |
||||
|
||||
DEST=/home/lbkp/bm/pgsql |
||||
mkdir -p $DEST |
||||
chown postgres:postgres $DEST |
||||
chmod 700 $DEST |
||||
|
||||
for DB in $(su - postgres -c "/bin/psql -d postgres -qtc 'SELECT datname from pg_database' | grep -vP '^\s+?template[01]$'") |
||||
do |
||||
su - postgres -c "/bin/pg_dump -Fp -Cc $DB" | /bin/nice -n 10 lz4 -c > $DEST/$DB.sql.lz4 |
||||
done |
||||
su - postgres -c "/bin/pg_dumpall --globals-only" | /bin/nice -n 10 lz4 -c > $DEST/pg_globals.sql.lz4 |
||||
su - postgres -c "/bin/pg_dumpall --schema-only" | /bin/nice -n 10 lz4 -c > $DEST/pg_schema.sql.lz4 |
||||
|
||||
cp -a /etc/bm/local /home/lbkp/bm/conf |
@ -0,0 +1,11 @@ |
||||
[ |
||||
{% for product in bm_mem_alloc_rules.keys() | list %} |
||||
{ |
||||
"product":"{{ product }}", |
||||
"defaultHeap":"{{ bm_mem_alloc_rules[product].heap }}", |
||||
"defaultDirect":"{{ bm_mem_alloc_rules[product].direct }}", |
||||
"sparePercent":{{ bm_mem_alloc_rules[product].spare }} |
||||
}{% if not loop.last %},{% endif %} |
||||
|
||||
{% endfor %} |
||||
] |
@ -0,0 +1,19 @@ |
||||
--- |
||||
|
||||
bounca_version: 0.1.1 |
||||
#bounca_version: master |
||||
#bounca_git_url: https://github.com/repleo/bounca.git |
||||
bounca_archive_url: https://github.com/repleo/bounca/archive/v{{ bounca_version }}.tar.gz |
||||
bounca_root_dir: /opt/bounca |
||||
bounca_port: 8084 |
||||
bounca_src_ip: [] |
||||
bounca_user: bounca |
||||
bounca_db_server: "{{ pg_server | default('localhost') }}" |
||||
bounca_db_name: bounca |
||||
bounca_db_user: bounca |
||||
# Will be generated if not defined |
||||
# bounca_db_pass: |
||||
# bounca_secret_key: |
||||
|
||||
bounca_admin_mail: "{{ system_admin_email }}" |
||||
bounca_from_mail: bounca@{{ ansible_domain }} |
@ -0,0 +1,5 @@ |
||||
--- |
||||
|
||||
- include: ../common/handlers/main.yml |
||||
- name: restart bounca |
||||
service: name=bounca state=restarted |
@ -0,0 +1,2 @@ |
||||
--- |
||||
|
@ -0,0 +1,323 @@ |
||||
--- |
||||
|
||||
- name: Set default install mode to none |
||||
set_fact: bounca_install_mode="none" |
||||
tags: bounca |
||||
|
||||
- name: Check if bounca is installed |
||||
stat: path={{ bounca_root_dir }}/meta/ansible_version |
||||
register: bounca_version_file |
||||
tags: bounca |
||||
|
||||
- name: Check installed version |
||||
command: cat {{ bounca_root_dir }}/meta/ansible_version |
||||
register: bounca_current_version |
||||
changed_when: False |
||||
when: bounca_version_file.stat.exists |
||||
tags: bounca |
||||
|
||||
- name: Set install mode to install |
||||
set_fact: bounca_install_mode='install' |
||||
when: not bounca_version_file.stat.exists |
||||
tags: bounca |
||||
|
||||
- name: Set install mode to upgrade |
||||
set_fact: bounca_install_mode='upgrade' |
||||
when: |
||||
- bounca_version_file.stat.exists |
||||
- bounca_current_version is defined |
||||
- bounca_current_version.stdout != bounca_version |
||||
# - bounca_manage_upgrade |
||||
tags: bounca |
||||
|
||||
- name: Install dependencies |
||||
yum: |
||||
name: |
||||
- python34-virtualenv |
||||
- python34-pip |
||||
- uwsgi-plugin-python3 |
||||
- uwsgi-logger-systemd |
||||
- python-psycopg2 |
||||
- openssl-devel |
||||
- postgresql-devel |
||||
- postgresql |
||||
- gcc |
||||
- git |
||||
tags: bounca |
||||
|
||||
- name: Create user account for bounca |
||||
user: |
||||
name: bounca |
||||
system: True |
||||
shell: /sbin/nologin |
||||
home: "{{ bounca_root_dir }}" |
||||
tags: bounca |
||||
|
||||
- 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: "{{ bounca_root_dir }}/tmp" |
||||
- dir: "{{ bounca_root_dir }}/app" |
||||
- dir: "{{ bounca_root_dir }}/data" |
||||
mode: 700 |
||||
group: "{{ bounca_user }}" |
||||
owner: "{{ bounca_user }}" |
||||
- dir: "{{ bounca_root_dir }}/meta" |
||||
mode: 700 |
||||
- dir: "{{ bounca_root_dir }}/archives" |
||||
mode: 700 |
||||
- dir: /etc/bounca |
||||
mode: 750 |
||||
group: "{{ bounca_user }}" |
||||
tags: bounca |
||||
|
||||
- name: Create archive dir |
||||
file: path={{ bounca_root_dir }}/archives/{{ bounca_current_version.stdout }} state=directory mode=700 |
||||
when: bounca_install_mode == "upgrade" |
||||
tags: bounca |
||||
|
||||
- name: Archive current BounCA install |
||||
synchronize: |
||||
src: "{{ bounca_root_dir }}/app" |
||||
dest: "{{ bounca_root_dir }}/archives/{{ bounca_current_version.stdout }}/app" |
||||
recursive: True |
||||
delegate_to: "{{ inventory_hostname }}" |
||||
when: bounca_install_mode == "upgrade" |
||||
tags: bounca |
||||
|
||||
- name: Dump database |
||||
postgresql_db: |
||||
name: "{{ bounca_db_name }}" |
||||
state: dump |
||||
login_host: "{{ bounca_db_server }}" |
||||
login_user: sqladmin |
||||
login_password: "{{ pg_admin_pass }}" |
||||
target: "{{ bounca_root_dir }}/archives/{{ bounca_current_version.stdout }}/{{ bounca_db_name }}.sql.gz" |
||||
when: bounca_install_mode == "upgrade" |
||||
tags: bounca |
||||
|
||||
- name: Compress previous version |
||||
command: tar cJf {{ bounca_root_dir }}/archives/{{ bounca_current_version.stdout }}.txz ./ |
||||
environment: |
||||
XZ_OPT: -T0 |
||||
args: |
||||
chdir: "{{ bounca_root_dir }}/archives/{{ bounca_current_version.stdout }}" |
||||
when: bounca_install_mode == 'upgrade' |
||||
tags: bounca |
||||
|
||||
- name: Remove the archive directory |
||||
file: path={{ bounca_root_dir }}/archives/{{ bounca_current_version.stdout }} state=absent |
||||
when: bounca_install_mode == 'upgrade' |
||||
tags: bounca |
||||
|
||||
- name: Download BounCA |
||||
get_url: |
||||
url: "{{ bounca_archive_url }}" |
||||
dest: "{{ bounca_root_dir }}/tmp" |
||||
when: bounca_install_mode != 'none' |
||||
tags: bounca |
||||
|
||||
- name: Extract BounCA |
||||
unarchive: |
||||
src: "{{ bounca_root_dir }}/tmp/bounca-{{ bounca_version }}.tar.gz" |
||||
dest: "{{ bounca_root_dir }}/tmp" |
||||
remote_src: yes |
||||
when: bounca_install_mode != "none" |
||||
tags: bounca |
||||
|
||||
- name: Move BounCA to it's directory |
||||
synchronize: |
||||
src: "{{ bounca_root_dir }}/tmp/bounca-{{ bounca_version }}/" |
||||
dest: "{{ bounca_root_dir }}/app/" |
||||
recursive: True |
||||
delete: True |
||||
when: bounca_install_mode != "none" |
||||
delegate_to: "{{ inventory_hostname }}" |
||||
tags: bounca |
||||
|
||||
#- name: Clone GIT repo |
||||
# git: |
||||
# repo: "{{ bounca_git_url }}" |
||||
# dest: "{{ bounca_root_dir }}/app" |
||||
# version: "{{ bounca_version }}" |
||||
# force: True |
||||
# register: bounca_git |
||||
# tags: bounca |
||||
# |
||||
#- name: Get new git commit |
||||
# command: git rev-parse HEAD |
||||
# args: |
||||
# chdir: "{{ bounca_root_dir }}/app" |
||||
# register: bounca_git_commit |
||||
# changed_when: False |
||||
# tags: bounca |
||||
# |
||||
#- name: Set install mode to upgrade |
||||
# set_fact: bounca_install_mode='upgrade' |
||||
# when: |
||||
# - bounca_install_mode == 'none' |
||||
# - bounca_git_commit.stdout != bounca_current_version.stdout |
||||
# tags: bounca |
||||
|
||||
- name: Create archive dir |
||||
file: path={{ bounca_root_dir }}/archives/{{ bounca_current_version.stdout }} state=directory mode=700 |
||||
when: bounca_install_mode == "upgrade" |
||||
tags: bounca |
||||
|
||||
- name: Dump database |
||||
postgresql_db: |
||||
name: "{{ bounca_db_name }}" |
||||
state: dump |
||||
login_host: "{{ bounca_db_server }}" |
||||
login_user: sqladmin |
||||
login_password: "{{ pg_admin_pass }}" |
||||
target: "{{ bounca_root_dir }}/archives/{{ bounca_current_version.stdout }}/{{ bounca_db_name }}.sql.gz" |
||||
when: bounca_install_mode == "upgrade" |
||||
tags: bounca |
||||
|
||||
- name: Create the virtualenv |
||||
pip: |
||||
state: latest |
||||
virtualenv: "{{ bounca_root_dir }}" |
||||
virtualenv_command: /usr/bin/virtualenv-3 |
||||
requirements: "{{ bounca_root_dir }}/app/requirements.txt" |
||||
tags: bounca |
||||
|
||||
- name: Link pki to the data dir |
||||
file: src={{ bounca_root_dir }}/data dest={{ bounca_root_dir }}/app/pki state=link |
||||
tags: bounca |
||||
|
||||
- name: Handle bounca ports |
||||
iptables_raw: |
||||
name: bounca_ports |
||||
state: "{{ (bounca_src_ip | length > 0) | ternary('present','absent') }}" |
||||
rules: "-A INPUT -m state --state NEW -p tcp -m multiport --dports {{ bounca_port }} -s {{ bounca_src_ip | join(',') }} -j ACCEPT" |
||||
tags: [firewall,bounca] |
||||
|
||||
#- name: Install additional python module |
||||
# pip: |
||||
# state: latest |
||||
# virtualenv: "{{ bounca_root_dir }}" |
||||
# name: "{{ item }}" |
||||
# with_items: |
||||
# - django-lemonldap |
||||
# tags: bounca |
||||
|
||||
- name: Generate a random pass for the database |
||||
shell: openssl rand -base64 45 > {{ bounca_root_dir }}/meta/ansible_dbpass |
||||
args: |
||||
creates: "{{ bounca_root_dir }}/meta/ansible_dbpass" |
||||
when: bounca_db_pass is not defined |
||||
tags: bounca |
||||
|
||||
- name: Read database password |
||||
command: cat {{ bounca_root_dir }}/meta/ansible_dbpass |
||||
register: bounca_rand_pass |
||||
when: bounca_db_pass is not defined |
||||
changed_when: False |
||||
tags: bounca |
||||
|
||||
- name: Set database pass |
||||
set_fact: bounca_db_pass={{ bounca_rand_pass.stdout }} |
||||
when: bounca_db_pass is not defined |
||||
tags: bounca |
||||
|
||||
- name: Generate a random secret |
||||
shell: openssl rand -base64 45 > {{ bounca_root_dir }}/meta/ansible_secret |
||||
args: |
||||
creates: "{{ bounca_root_dir }}/meta/ansible_secret" |
||||
when: bounca_secret_key is not defined |
||||
tags: bounca |
||||
|
||||
- name: Read secret_key |
||||
command: cat {{ bounca_root_dir }}/meta/ansible_secret |
||||
register: bounca_rand_secret |
||||
when: bounca_secret_key is not defined |
||||
changed_when: False |
||||
tags: bounca |
||||
|
||||
- name: Set secret_key |
||||
set_fact: bounca_secret_key={{ bounca_rand_secret.stdout }} |
||||
when: bounca_secret_key is not defined |
||||
tags: bounca |
||||
|
||||
- name: Create the PostgreSQL role |
||||
postgresql_user: |
||||
db: postgres |
||||
name: "{{ bounca_db_user }}" |
||||
password: "{{ bounca_db_pass }}" |
||||
login_host: "{{ bounca_db_server }}" |
||||
login_user: sqladmin |
||||
login_password: "{{ pg_admin_pass }}" |
||||
tags: bounca |
||||
|
||||
- name: Create the PostgreSQL database |
||||
postgresql_db: |
||||
name: "{{ bounca_db_name }}" |
||||
encoding: UTF-8 |
||||
lc_collate: C |
||||
lc_ctype: C |
||||
template: template0 |
||||
owner: "{{ bounca_db_user }}" |
||||
login_host: "{{ bounca_db_server }}" |
||||
login_user: sqladmin |
||||
login_password: "{{ pg_admin_pass }}" |
||||
tags: bounca |
||||
|
||||
- name: Deploy configuration |
||||
template: src={{ item.src }} dest={{ item.dest }} owner={{ item.owner | default(omit) }} group={{ item.group | default(omit) }} mode={{ item.mode | default(omit) }} |
||||
with_items: |
||||
- src: main.ini.j2 |
||||
dest: /etc/bounca/main.ini |
||||
group: bounca |
||||
mode: 640 |
||||
- src: uwsgi.ini.j2 |
||||
dest: /etc/bounca/uwsgi.ini |
||||
group: bounca |
||||
mode: 640 |
||||
notify: restart bounca |
||||
tags: bounca |
||||
|
||||
#- name: Add a tmpfiles.d snippet |
||||
# copy: content="d /run/bounca 750 bounca apache" dest=/etc/tmpfiles.d/bounca.conf |
||||
# register: bounca_tmpfiles |
||||
# tags: bounca |
||||
# |
||||
#- name: Create tmpdir |
||||
# command: systemd-tmpfiles --create |
||||
# when: bounca_tmpfiles.changed |
||||
# tags: bounca |
||||
|
||||
- name: Deploy BounCA unit |
||||
template: src=bounca.service.j2 dest=/etc/systemd/system/bounca.service |
||||
register: bounca_unit |
||||
tags: bounca |
||||
|
||||
- name: Reload systemd |
||||
command: systemctl daemon-reload |
||||
when: bounca_unit.changed |
||||
tags: bounca |
||||
|
||||
- name: Stop BounCA daemon for DB upgrade |
||||
service: name=bounca state=stopped |
||||
when: bounca_install_mode == 'upgrade' |
||||
tags: bounca |
||||
|
||||
- name: Migrate BounCA DB |
||||
django_manage: command="migrate --noinput" app_path={{ bounca_root_dir }}/app virtualenv={{ bounca_root_dir }} |
||||
when: bounca_install_mode != 'none' |
||||
tags: bounca |
||||
|
||||
- name: Collect static assets |
||||
django_manage: command="collectstatic --noinput" app_path={{ bounca_root_dir }}/app virtualenv={{ bounca_root_dir }} |
||||
when: bounca_install_mode != 'none' |
||||
tags: bounca |
||||
|
||||
- name: Start and enable the daemon |
||||
service: name=bounca state=started enabled=True |
||||
tags: bounca |
||||
|
||||
- name: Write installed version |
||||
# copy: content={{ bounca_git_commit.stdout}} dest={{ bounca_root_dir }}/meta/ansible_version |
||||
copy: content={{ bounca_version }} dest={{ bounca_root_dir }}/meta/ansible_version |
||||
tags: bounca |
@ -0,0 +1,17 @@ |
||||
[Unit] |
||||
Description=BounCA PKI Daemon |
||||
After=syslog.target |
||||
|
||||
[Service] |
||||
Environment=PYTHONPATH=/usr/bin/python34 |
||||
ExecStart=/usr/sbin/uwsgi --ini /etc/bounca/uwsgi.ini |
||||
ExecReload=/bin/kill -HUP $MAINPID |
||||
User={{ bounca_user }} |
||||
Group={{ bounca_user }} |
||||
KillSignal=SIGINT |
||||
Restart=always |
||||
Type=notify |
||||
NotifyAccess=all |
||||
|
||||
[Install] |
||||
WantedBy=multi-user.target |
@ -0,0 +1,14 @@ |
||||
[database] |
||||
DATABASE_USER: {{ bounca_db_user }} |
||||
DATABASE_PASSWORD: {{ bounca_db_pass }} |
||||
DATABASE_HOST: {{ bounca_db_server }} |
||||
DATABASE_NAME: {{ bounca_db_name }} |
||||
|
||||
[secrets] |
||||
SECRET_KEY: {{ bounca_secret_key }} |
||||
|
||||
[email] |
||||
EMAIL_HOST: localhost |
||||
ADMIN_MAIL: {{ bounca_admin_mail }} |
||||
FROM_MAIL: {{ bounca_from_mail }} |
||||
|
@ -0,0 +1,17 @@ |
||||
[uwsgi] |
||||
plugin = python3 |
||||
thread = 4 |
||||
master = 1 |
||||
processes = 30 |
||||
vacuum = true |
||||
http11-socket = 0.0.0.0:{{ bounca_port }} |
||||
chdir = {{ bounca_root_dir }}/app |
||||
home = {{ bounca_root_dir }} |
||||
module = bounca.wsgi |
||||
check-static = {{ bounca_root_dir }}/app/media |
||||
static-skip-ext = .php |
||||
static-skip-ext = .cgi |
||||
static-skip-ext = .py |
||||
offload-threads = 4 |
||||
cache2 = name=bounca,items=200 |
||||
static-cache-paths = 300 |
@ -0,0 +1,16 @@ |
||||
--- |
||||
clam_mirror: database.clamav.net |
||||
clam_user: clamav |
||||
clam_group: clamav |
||||
clam_enable_clamd: False |
||||
clam_custom_db_url: [] |
||||
clam_safebrowsing: True |
||||
clam_listen_port: 3310 |
||||
clam_ports: "{{ [clam_listen_port] + [clam_stream_port_min + ':' + clam_stream_port_max] }}" |
||||
clam_listen_ip: 127.0.0.1 |
||||
clam_src_ip: [] |
||||
# Max stream size, in MB |
||||
clam_stream_max_size: 50 |
||||
clam_stream_port_min: 30000 |
||||
clam_stream_port_max: 32000 |
||||
|
@ -0,0 +1,9 @@ |
||||
--- |
||||
|
||||
- include: ../common/handlers/main.yml |
||||
|
||||
- name: restart freshclam |
||||
service: name=freshclam state=restarted |
||||
|
||||
- name: restart clamd |
||||
service: name=clamd state={{ clam_enable_clamd | ternary('restarted','stopped') }} |
@ -0,0 +1,57 @@ |
||||
--- |
||||
|
||||
- name: Install packages |
||||
yum: |
||||
name: |
||||
- clamav |
||||
- clamav-data-empty |
||||
- clamav-server-systemd |
||||
- clamav-update |
||||
|
||||
- name: Create clamav user account |
||||
user: |
||||
name: clamav |
||||
system: True |
||||
shell: /sbin/nologin |
||||
comment: "ClamAV antivirus user account" |
||||
|
||||
- name: Set SELinux |
||||
seboolean: name={{ item }} state=True persistent=True |
||||
with_items: |
||||
- clamd_use_jit |
||||
- antivirus_can_scan_system |
||||
when: ansible_selinux.status == 'enabled' |
||||
|
||||
- name: Deploy freshclam configuration |
||||
template: src=freshclam.conf.j2 dest=/etc/freshclam.conf mode=644 |
||||
notify: restart freshclam |
||||
|
||||
- name: Deploy clamd configuration |
||||
template: src=clamd.conf.j2 dest=/etc/clamd.conf |
||||
notify: restart clamd |
||||
|
||||
- name: Deploy systemd units |
||||
template: src={{ item }}.j2 dest=/etc/systemd/system/{{ item }} |
||||
with_items: |
||||
- freshclam.service |
||||
- clamd.service |
||||
notify: |
||||
- restart freshclam |
||||
- restart clamd |
||||
register: clamav_units |
||||
|
||||
- name: Deploy tmpfiles.d fragment |
||||
copy: |
||||
content: 'd /var/run/clamav 755 {{ clam_user }} {{ clam_group }}' |
||||
dest: /etc/tmpfiles.d/clamav.conf |
||||
notify: systemd-tmpfiles |
||||
|
||||
- name: Reload systemd |
||||
command: systemctl daemon-reload |
||||
when: clamav_units.changed |
||||
|
||||
- name: Start and enable freshclam |
||||
service: name=freshclam state=started enabled=True |
||||
|
||||
- name: Handle clamd service |
||||
service: name=clamd state={{ clam_enable_clamd | ternary('started','stopped') }} enabled={{ clam_enable_clamd }} |
@ -0,0 +1,12 @@ |
||||
LogSyslog yes |
||||
LogVerbose yes |
||||
ExtendedDetectionInfo yes |
||||
LocalSocket /var/run/clamav/clamd.sock |
||||
LocalSocketMode 666 |
||||
TCPSocket {{ clam_listen_port }} |
||||
TCPAddr {{ clam_listen_ip }} |
||||
StreamMinPort {{ clam_stream_port_min }} |
||||
StreamMaxPort {{ clam_stream_port_max }} |
||||
StreamMaxLength {{ clam_stream_max_size }}M |
||||
ExitOnOOM yes |
||||
Foreground yes |
@ -0,0 +1,13 @@ |
||||
[Unit] |
||||
Description=ClamAV antivirus daemon |
||||
After=syslog.target network.target |
||||
|
||||
[Service] |
||||
Type=simple |
||||
ExecStart=/usr/sbin/clamd -c /etc/clamd.conf |
||||
User={{ clam_user }} |
||||
Group={{ clam_group }} |
||||
Restart=on-failure |
||||
|
||||
[Install] |
||||
WantedBy=multi-user.target |
@ -0,0 +1,13 @@ |
||||
DatabaseDirectory /var/lib/clamav |
||||
LogVerbose yes |
||||
LogSyslog yes |
||||
PidFile /var/run/freshclam.pid |
||||
Checks {{ clam_safebrowsing | ternary('48','12') }} |
||||
DatabaseOwner clamupdate |
||||
DatabaseMirror {{ clam_mirror }} |
||||
{% for custom in clam_custom_db_url %} |
||||
DatabaseCustomURL={{ custom }} |
||||
{% endfor %} |
||||
NotifyClamd /etc/clamd.conf |
||||
Foreground yes |
||||
SafeBrowsing {{ clam_safebrowsing | ternary('yes','no') }} |
@ -0,0 +1,15 @@ |
||||
[Unit] |
||||
Description=ClamAV signature updater |
||||
After=network.target |
||||
|
||||
[Service] |
||||
Type=simple |
||||
User=clamupdate |
||||
Group=clamupdate |
||||
ExecStart=/usr/bin/freshclam --stdout --daemon |
||||
Restart=on-failure |
||||
PrivateTmp=true |
||||
|
||||
[Install] |
||||
WantedBy=multi-user.target |
||||
|
@ -0,0 +1,120 @@ |
||||
--- |
||||
|
||||
# List of UNIX group which will have full root access, using sudo |
||||
system_admin_groups: ['admins','Domain\ Admins'] |
||||
|
||||
# Email address of the admin (will receive root email) |
||||
# system_admin_email: admin@domain.net |
||||
|
||||
# List of basic system utilisties to install |
||||
# (Common list for EL and Debian based distro) |
||||
system_utils: |
||||
- htop |
||||
- screen |
||||
- iftop |
||||
- tcpdump |
||||
- bzip2 |
||||
- pbzip2 |
||||
- lzop |
||||
- zstd |
||||
- vim |
||||
- bash-completion |
||||
- rsync |
||||
- lsof |
||||
- net-tools |
||||
- sysstat |
||||
- pciutils |
||||
- strace |
||||
- wget |
||||
- man-db |
||||
- unzip |
||||
- openssl |
||||
- pv |
||||
- less |
||||
- nano |
||||
- tree |
||||
- mc |
||||
|
||||
# List specific for EL based |
||||
system_utils_el: |
||||
- openssh-clients |
||||
- nc |
||||
- xz |
||||
- lz4 |
||||
- yum-utils |
||||
- fuse-sshfs |
||||
- policycoreutils-python |
||||
|
||||
# List specific for Debian based |
||||
system_utils_deb: |
||||
- openssh-client |
||||
- netcat |
||||
- xz-utils |
||||
- liblz4-tool |
||||
- sshfs |
||||
|
||||
# Kernel modules to load |
||||
system_kmods: [] |
||||
|
||||
# List of extra package to install |
||||
system_extra_pkgs: [] |
||||
|
||||
# MegaCLI tool version |
||||
megacli_version: 8.07.14-1 |
||||
|
||||
# List of FS to mount |
||||
fstab: [] |
||||
# fstab: |
||||
# - name: /mnt/data |
||||
# src: files.domain.org:/data |
||||
# opts: noatime |
||||
# fstype: nfs |
||||
# state: present |
||||
# boot: yes |
||||
|
||||
# Various SELinux booleans |
||||
sebool: [] |
||||
# sebool: |
||||
# - name: httpd_use_fusefs |
||||
# state: True |
||||
# persistent: True |
||||
|
||||
system_swappiness: 10 |
||||
system_sysctl: {} |
||||
# system_sysctl: |
||||
# vm.vfs_cache_pressure: 500 |
||||
# vm.dirty_ratio: 10 |
||||
# vm.dirty_background_ratio: 5 |
||||
|
||||
# Disable traditional rsyslog daemon |
||||
system_disable_syslog: False |
||||
|
||||
# Send journald logs to a remote server using systemd-journal-upload |
||||
# system_journal_remote_uri: http://logs.example.com:19532 |
||||
|
||||
# Max disk space used by the Journal. Default is 10% of the available space. But must be exressed as an absolute value in the conf |
||||
# We can specify the max amount of space used, and the min amount of space left free. The smallest limit will apply |
||||
system_journal_max_use: 3G |
||||
system_journal_keep_free: 2G |
||||
|
||||
# System Timezone |
||||
system_tz: 'Europe/Paris' |
||||
|
||||
# Tuned profile to apply. If undefined, virt-host and virt-guest are applied automatically when needed |
||||
# system_tuned_profile: enterprise-storage |
||||
|
||||
# Frquency of the fstrim cron job. Can be daily, weekly or monthly |
||||
system_fstrim_freq: daily |
||||
|
||||
system_base_bash_aliases: |
||||
ls: 'ls $LS_OPTIONS' |
||||
ll: 'ls $LS_OPTIONS -l' |
||||
l: 'ls $LS_OPTIONS -lA' |
||||
rm: 'rm -i' |
||||
cp: 'cp -i' |
||||
mv: 'mv -i' |
||||
|
||||
system_extra_bash_aliases: {} |
||||
system_bash_aliases: "{{ system_base_bash_aliases | combine(system_extra_bash_aliases, recursive=True) }}" |
||||
|
||||
... |
Binary file not shown.
@ -0,0 +1,10 @@ |
||||
#!/bin/bash |
||||
|
||||
export LS_OPTIONS='--color=auto' |
||||
eval "`dircolors`" |
||||
alias ls='ls $LS_OPTIONS' |
||||
alias ll='ls $LS_OPTIONS -l' |
||||
alias l='ls $LS_OPTIONS -lA' |
||||
alias rm='rm -i' |
||||
alias cp='cp -i' |
||||
alias mv='mv -i' |
@ -0,0 +1 @@ |
||||
CRONDARGS="-s" |
@ -0,0 +1,10 @@ |
||||
#!/bin/bash |
||||
|
||||
/sbin/fstrim -v --all |
||||
|
||||
# Proxmox container support |
||||
if [ -x /usr/sbin/pct ]; then |
||||
for CONTAINER in $(/usr/sbin/pct list | awk '/^[0-9]/ {print $1}'); do |
||||
/sbin/fstrim -v /proc/$(lxc-info -n $CONTAINER -p | awk '{print $2}')/root |
||||
done |
||||
fi |
Binary file not shown.
@ -0,0 +1,4 @@ |
||||
let g:skip_defaults_vim=1 |
||||
set mouse-=a |
||||
set background=dark |
||||
syntax on |
@ -0,0 +1,33 @@ |
||||
--- |
||||
- name: rehash postfix |
||||
command: "postmap /etc/postfix/{{ item }}" |
||||
with_items: |
||||
- relay_auth |
||||
|
||||
- name: restart postfix |
||||
service: name=postfix state=restarted |
||||
|
||||
- name: newaliases |
||||
command: newaliases |
||||
|
||||
- name: restart journald |
||||
service: name=systemd-journald state=restarted |
||||
|
||||
- name: systemd-tmpfiles |
||||
command: systemd-tmpfiles --create |
||||
|
||||
- name: reload systemd |
||||
command: systemctl daemon-reload |
||||
|
||||
- name: restart crond |
||||
service: name=crond state=restarted |
||||
|
||||
- name: restart journal-upload |
||||
service: name=systemd-journal-upload state=restarted |
||||
when: remote_journal is defined |
||||
|
||||
- name: restart journald |
||||
service: name=systemd-journald state=restarted |
||||
|
||||
- name: load kmods |
||||
service: name=systemd-modules-load state=restarted |
@ -0,0 +1,28 @@ |
||||
--- |
||||
allow_duplicates: no |
||||
dependencies: |
||||
- role: mkdir |
||||
- role: system_proxy |
||||
- role: repo_base |
||||
when: ansible_os_family == 'RedHat' |
||||
- role: network |
||||
- role: iptables |
||||
when: iptables_manage | default(True) |
||||
- role: zabbix_agent |
||||
- role: fusioninventory_agent |
||||
- role: sssd_ldap_auth |
||||
when: ldap_auth | default(False) |
||||
- role: sssd_ad_auth |
||||
when: ad_auth | default(False) |
||||
- role: ntp_client |
||||
when: ansible_virtualization_role == 'host' or ansible_virtualization_type != 'lxc' |
||||
- role: sudo |
||||
- role: ssh |
||||
- role: patrix |
||||
when: |
||||
- patrix_enabled | default(True) |
||||
- patrix_server is defined |
||||
- patrix_user is defined |
||||
- patrix_pass is defined |
||||
- role: postfix |
||||
when: system_postfix | default(True) |
@ -0,0 +1,16 @@ |
||||
--- |
||||
|
||||
- name: Check if qemu agent channel is available |
||||
stat: path=/dev/virtio-ports/org.qemu.guest_agent.0 |
||||
register: qemu_ga_dev |
||||
|
||||
- include: guest_{{ ansible_os_family }}.yml |
||||
when: |
||||
- qemu_ga_dev.stat.exists |
||||
- ansible_virtualization_type == 'kvm' |
||||
|
||||
- name: Start and enable qemu guest agent |
||||
service: name=qemu-guest-agent state=started enabled=yes |
||||
when: |
||||
- qemu_ga_dev.stat.exists |
||||
- ansible_virtualization_type == 'kvm' |
@ -0,0 +1,4 @@ |
||||
--- |
||||
|
||||
- name: Install qemu guest agent |
||||
apt: name=qemu-guest-agent state=present |
@ -0,0 +1,5 @@ |
||||
--- |
||||
|
||||
- name: Install qemu guest agent |
||||
yum: name=qemu-guest-agent state=present |
||||
|
@ -0,0 +1,18 @@ |
||||
--- |
||||
|
||||
- set_fact: |
||||
controllers: "{{ controllers | default([]) + [ ansible_devices[item].host ] }}" |
||||
with_items: "{{ ansible_devices.keys() | list }}" |
||||
|
||||
- set_fact: |
||||
lsi_controllers: "{{ controllers | select('match', '(?i).*(lsi|megaraid).*') | list | unique }}" |
||||
|
||||
- include_tasks: hardware_{{ ansible_os_family }}.yml |
||||
|
||||
- name: Remove MegaCli package |
||||
file: path=/tmp/{{ megacli }} state=absent |
||||
when: |
||||
- lsi_controllers | length > 0 |
||||
- megacli_installed_version.stdout != megacli_version |
||||
|
||||
... |
@ -0,0 +1,30 @@ |
||||
--- |
||||
|
||||
- set_fact: megacli=megacli_{{ megacli_version }}_all.deb |
||||
|
||||
- name: Install libncurses |
||||
apt: |
||||
name: |
||||
- libncurses5 |
||||
|
||||
- name: Check if MegaCLi is installed (Debian) |
||||
shell: dpkg -s megacli | grep Version | awk '{ print $2 }' 2>/dev/null |
||||
args: |
||||
warn: False |
||||
register: megacli_installed_version |
||||
failed_when: False |
||||
changed_when: False |
||||
when: lsi_controllers | length > 0 |
||||
|
||||
- name: Copy MegaCli package |
||||
copy: src={{ megacli }} dest=/tmp |
||||
when: |
||||
- lsi_controllers | length > 0 |
||||
- megacli_installed_version.stdout != megacli_version |
||||
|
||||
- name: Install MegaCli (Debian) |
||||
apt: deb=/tmp/{{ megacli }} allow_unauthenticated=yes |
||||
when: |
||||
- lsi_controllers | length > 0 |
||||
- megacli_installed_version.stdout != megacli_version |
||||
|
@ -0,0 +1,24 @@ |
||||
--- |
||||
|
||||
- set_fact: |
||||
megacli: MegaCli-{{ megacli_version }}.noarch.rpm |
||||
|
||||
- name: Check if MegaCLi is installed |
||||
shell: rpm -q --qf "%{VERSION}-%{RELEASE}" MegaCli 2>/dev/null |
||||
register: megacli_installed_version |
||||
changed_when: False |
||||
failed_when: False |
||||
when: lsi_controllers | length > 0 |
||||
|
||||
- name: Copy MegaCli package |
||||
copy: src={{ megacli }} dest=/tmp |
||||
when: |
||||
- lsi_controllers | length > 0 |
||||
- megacli_installed_version.stdout != megacli_version |
||||
|
||||
- name: Install MegaCli |
||||
yum: name=/tmp/{{ megacli }} state=present |
||||
when: |
||||
- lsi_controllers | length > 0 |
||||
- megacli_installed_version.stdout != megacli_version |
||||
|
@ -0,0 +1,11 @@ |
||||
--- |
||||
|
||||
- name: Set system hostname |
||||
hostname: name={{ system_hostname | default(inventory_hostname | regex_replace('^([^\.]+)\..*','\\1')) }} |
||||
|
||||
- name: Prevent PVE from changing /etc/hostname |
||||
copy: content='' dest=/etc/.pve-ignore.hostname |
||||
when: ansible_virtualization_type == 'lxc' |
||||
|
||||
... |
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue