110 lines
3.2 KiB
YAML
110 lines
3.2 KiB
YAML
---
|
|
# 2026-10-17 Hyperling
|
|
# Allow pushing a local port to a remote server automagically in a runit script.
|
|
|
|
# ssh -N -p SSH_PORT -R REMOTE_PORT:localhost:LOCAL_PORT USER@REMOTE_HOST -v
|
|
|
|
- name: General | Tunnel | Provisioned Variables
|
|
ansible.builtin.debug:
|
|
var: "{{ item }}"
|
|
loop:
|
|
- tunnel_local_port
|
|
- tunnel_remote_host
|
|
- tunnel_remote_port
|
|
- tunnel_ssh_port
|
|
|
|
- name: General | Tunnel | Facts
|
|
ansible.builtin.set_fact:
|
|
tunnel_service_name: tunnel
|
|
|
|
- name: General | Tunnel | Packages [pacman]
|
|
ansible.builtin.package:
|
|
name:
|
|
- openbsd-netcat
|
|
state: present
|
|
when: ansible_pkg_mgr == "pacman"
|
|
|
|
- name: General | Tunnel | Packages [apt]
|
|
ansible.builtin.package:
|
|
name:
|
|
- netcat-openbsd
|
|
state: present
|
|
when: ansible_pkg_mgr == "apt"
|
|
|
|
- name: General | Tunnel | runit
|
|
block:
|
|
|
|
- name: General | Tunnel | runit | mkdir | /etc/sv
|
|
ansible.builtin.file:
|
|
path: /etc/sv/{{ tunnel_service_name }}
|
|
state: directory
|
|
mode: "0755"
|
|
|
|
- name: General | Tunnel | runit | mkdir | /etc/sv log
|
|
ansible.builtin.file:
|
|
path: /etc/sv/{{ tunnel_service_name }}/log
|
|
state: directory
|
|
mode: "0755"
|
|
|
|
- name: General | Tunnel | runit | mkdir | /var/log
|
|
ansible.builtin.file:
|
|
path: /var/log/{{ tunnel_service_name }}
|
|
state: directory
|
|
mode: "0755"
|
|
|
|
- name: General | Tunnel | runit | Script | Run
|
|
ansible.builtin.copy:
|
|
dest: /etc/sv/{{ tunnel_service_name }}/run
|
|
content: |
|
|
#!/bin/sh -e
|
|
exec 2>&1
|
|
|
|
# Health check to ensure connection does not go stale.
|
|
(
|
|
while true; do
|
|
sleep 300
|
|
nc -zv {{ tunnel_remote_host }} {{ tunnel_remote_port }} >/dev/null 2>&1
|
|
status="$?"
|
|
if [[ "$status" != 0 ]]; then
|
|
echo "RUN: Port check returned $status, restarting service."
|
|
sv restart {{ tunnel_service_name }}
|
|
fi
|
|
done
|
|
) &
|
|
|
|
# Do not use `exec` here otherwise the loop may get killed.
|
|
chpst -u {{ user }} ssh -v -N \
|
|
-R {{ tunnel_remote_port }}:localhost:{{ tunnel_local_port }} \
|
|
-p {{ tunnel_ssh_port }} {{ tunnel_remote_host }}
|
|
mode: "0755"
|
|
|
|
- name: General | Tunnel | runit | Script | Finish
|
|
ansible.builtin.copy:
|
|
dest: /etc/sv/{{ tunnel_service_name }}/finish
|
|
content: |
|
|
{{ runit_finish_sleep }}
|
|
mode: "0755"
|
|
|
|
- name: General | Tunnel | runit | Script | Log
|
|
ansible.builtin.copy:
|
|
dest: /etc/sv/{{ tunnel_service_name }}/log/run
|
|
content: |
|
|
#!/bin/sh -e
|
|
exec svlogd -tt /var/log/{{ tunnel_service_name }}
|
|
mode: "0755"
|
|
|
|
- name: General | Tunnel | runit | Script | Log Config
|
|
ansible.builtin.copy:
|
|
dest: /var/log/{{ tunnel_service_name }}/config
|
|
content: |
|
|
{{ runit_log_config_10mb }}
|
|
mode: "0755"
|
|
|
|
- name: General | Tunnel | runit | Service | Enable
|
|
ansible.builtin.service:
|
|
name: "{{ tunnel_service_name }}"
|
|
state: "{{ 'started' if tunnel_remote_host else 'stopped' }}"
|
|
enabled: "{{ true if tunnel_remote_host else false }}"
|
|
|
|
when: ansible_service_mgr == "runit"
|