Files
env-ansible/tasks/general/settings/tunnel.yml
T

111 lines
3.3 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
echo -n "RUN-LOOP: "
nc -zv {{ tunnel_remote_host }} {{ tunnel_remote_port }}
status="$?"
echo "RUN-LOOP: Port check returned ${status}."
if [[ "$status" != 0 ]]; then
echo "RUN-LOOP: Restarting service."
sv restart {{ tunnel_service_name }}
fi
echo "RUN-LOOP: Going back to sleep."
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"