ansible/roles/octoprint/tasks/main.yml

279 lines
8.5 KiB
YAML

---
- name: Create group
group:
name: "{{ octoprint_group }}"
- name: Create user
user:
name: "{{ octoprint_user }}"
home: "/home/{{ octoprint_user }}"
group: "{{ octoprint_group }}"
append: yes
groups:
- video
- dialout
- name: Add octoprint user to additional groups
user:
name: "{{ octoprint_user }}"
append: yes
groups: "{{ octoprint_groups }}"
when: octoprint_groups is defined
- name: Install requirements
apt:
name:
- python3-pip
- python3-virtualenv
- name: Create octoprint directory
file:
path: "{{ octoprint_dir }}"
state: directory
owner: "{{ octoprint_user }}"
group: "{{ octoprint_group }}"
- name: Create virtual env and install python dependencies
pip:
name: octoprint
virtualenv: "{{ octoprint_dir }}"
become: true
become_user: "{{ octoprint_user }}"
- name: Install default octoprint plugins
pip:
name: "{{ item }}"
virtualenv: "{{ octoprint_dir }}"
become: true
become_user: "{{ octoprint_user }}"
with_items: "{{ octoprint_default_plugins }}"
notify: Restart octoprint
- name: Install additional octoprint plugins
pip:
name: "{{ item }}"
virtualenv: "{{ octoprint_dir }}"
become: true
become_user: "{{ octoprint_user }}"
with_items: "{{ octoprint_additional_plugins }}"
when: octoprint_additional_plugins is defined
notify: Restart octoprint
- name: Create configuration directories
file:
path: "/home/{{ octoprint_user }}/{{ item }}"
owner: "{{ octoprint_user }}"
group: "{{ octoprint_group }}"
state: directory
mode: u+rw,g+rw,o+r
with_items:
- .octoprint
- .octoprint/printerProfiles
- .octoprint/data
- .octoprint/data/appkeys
- name: Install systemd unit
template: src=octoprint.service.j2 dest=/lib/systemd/system/octoprint.service
notify:
- Reload systemd
- Restart octoprint
################################################################################
# Octoprint configuration
################################################################################
- name: Register if config already exists on target host
stat:
path: "/home/{{ octoprint_user }}/.octoprint/config.yaml"
register: octoprint_register_config_stat
- name: Default octoprint config
set_fact:
octoprint_default_config: "{{ lookup('template', 'config.yaml.j2') | from_yaml }}"
- name: Apply user config
set_fact:
octoprint_config_combined: "{{ octoprint_default_config | combine(octoprint_config, recursive=True)}}"
when: octoprint_config is defined
- name: Apply user config
set_fact:
octoprint_config_combined: "{{ octoprint_default_config }}"
when: octoprint_config is not defined
- name: Configure Octoprint
block:
- name: Initial configuration of octoprint
copy:
content: "{{ octoprint_config_combined | to_nice_yaml }}"
dest: "/home/{{ octoprint_user }}/.octoprint/config.yaml"
when: not octoprint_register_config_stat.stat.exists
- name: Update existing Octoprint configuration
block:
- name: Read Octoprint config file
slurp:
src: "/home/{{ octoprint_user }}/.octoprint/config.yaml"
register: octoprint_register_config
- name: Parse Octoprint config file
set_fact:
current_octoprint_config: "{{ octoprint_register_config['content'] | b64decode | from_yaml}}"
- name: Write updated octoprint configuration
copy:
content: "{{ current_octoprint_config | combine(octoprint_config_combined, recursive=True) | to_nice_yaml}}"
dest: "/home/{{octoprint_user}}/.octoprint/config.yaml"
notify: Restart octoprint
when: octoprint_register_config_stat.stat.exists
become: true
become_user: "{{ octoprint_user }}"
################################################################################
# Octoprint printer configuration
################################################################################
- name: Setup printer profiles
copy:
content: "{{ item | to_nice_yaml}}"
dest: "/home/{{ octoprint_user }}/.octoprint/printerProfiles/{{item.id}}.profile"
loop: "{{ octoprint_printer_profiles }}"
become: true
become_user: "{{ octoprint_user }}"
################################################################################
# Octoprint Users
################################################################################
- name: Setup octoprint users
block:
- name: Register if user databse already exists on target host
stat:
path: "/home/{{ octoprint_user }}/.octoprint.users.yaml"
register: octoprint_register_users
- name: Copy default users
copy:
content: "{{ octoprint_users_list | to_nice_yaml }}"
dest: "/home/{{ octoprint_user }}/.octoprint/users.yaml"
when: not octoprint_register_users.stat.exists
- name: Merge users database with default users
block:
- name: Read Octoprint users file
slurp:
src: "/home/{{ octoprint_user }}/.octoprint/users.yaml"
register: octoprint_register_users_file
- name: Parse Octoprint users file
set_fact:
current_octoprint_users: "{{ octoprint_register_users_file['content'] | b64decode | from_yaml }}"
- name: Merge current users with default users
set_fact:
octoprint_users_db: "{{ current_octoprint_users | combine(octoprint_users_list)}}"
- name: Copy new users file
copy:
content: "{{ octoprint_users_db | to_nice_yaml }}"
dest: "/home/{{ octoprint_user }}/.octoprint/users.yaml"
when: octoprint_register_users.stat.exists
when: octoprint_users_list is defined
become: true
become_user: "{{ octoprint_user }}"
################################################################################
# Octoprint app keys
################################################################################
- name: Install application keys
block:
- name: Register existing app keys
stat:
path: /home/{{ octoprint_user }}/.octoprint/data/appkeys/keys.yaml
register: app_keys_file
- name: Read existing app keys
slurp:
src: /home/{{ octoprint_user }}/.octoprint/data/appkeys/keys.yaml
register: existing_app_keys_content
when: app_keys_file.stat.exists
- name: Combine local and remote app keys
set_fact:
app_keys_combined: "{{ existing_app_keys_content['content'] | b64decode | from_yaml | combine(octoprint_app_keys ,recursive=True) }}"
when: app_keys_file.stat.exists
- name: Copy default app keys
copy:
content: "{{ app_keys_combined | to_nice_yaml }}"
dest: /home/{{ octoprint_user }}/.octoprint/data/appkeys/keys.yaml
when: app_keys_file.stat.exists
- name: Copy default app keys
copy:
content: "{{ octoprint_app_keys | to_nice_yaml }}"
dest: /home/{{ octoprint_user }}/.octoprint/data/appkeys/keys.yaml
when: not app_keys_file.stat.exists
when: octoprint_app_keys is defined
notify: Restart octoprint
################################################################################
# Webcam
################################################################################
- name: Setup webcam
block:
- name: Install dependencies
apt:
name:
- ffmpeg
- ustreamer
- name: Install systemd unit
template: src=ustreamer.service.j2 dest=/lib/systemd/system/ustreamer.service
notify:
- Reload systemd
- Restart ustreamer
- name: Enable and start ustreamer
service:
name: ustreamer
state: started
enabled: yes
when: octoprint_has_webcam
################################################################################
# Reverse proxy
################################################################################
- name: Configure reverse proxy
block:
- name: Ensure certificates are available
command: openssl req -x509 -nodes -newkey rsa:2048 -keyout /etc/apache2/ssl/{{ octoprint_domain }}.key -out /etc/apache2/ssl/{{ octoprint_domain }}.crt -days 730 -subj "/CN={{ octoprint_domain }}" creates=/etc/apache2/ssl/{{ octoprint_domain }}.crt
notify: Restart apache2
when: octoprint_ssl
- name: Configure certificate manager for octoprint
template: src=certs.j2 dest=/etc/acertmgr/{{ octoprint_domain }}.conf
notify: Run acertmgr
when: octoprint_ssl
- name: Configure vhost
template: src=nginx_vhost.j2 dest=/etc/nginx/sites-available/octoprint
notify: Restart nginx
- name: Enable vhost
file: src=/etc/nginx/sites-available/octoprint dest=/etc/nginx/sites-enabled/octoprint state=link
notify: Restart nginx
- name: Enable octoprint
service:
name: octoprint
state: started
enabled: yes