artis3n.tailscale
artis3n.tailscale
ãã®ããŒã«ã¯ãLinux ã¿ãŒã²ããã« Tailscale ãã€ã³ã¹ããŒã«ããŠæ§æããŸãã
ãµããŒããããŠãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã :
- Debian / Ubuntu
- CentOS / RedHat
- Rocky Linux / AlmaLinux
- Amazon Linux 2023 / Amazon Linux 2
- Fedora
- Arch Linux
- OpenSUSE
- Oracle Linux
- Raspbian
åãã«ãªã¯ãšã¹ãã§ãã¹ãããããã£ã¹ããªãã¥ãŒã·ã§ã³ã®ããŒãžã§ã³ã®ãªã¹ãã«ã€ããŠã¯ãCI ã¯ãŒã¯ãããŒãåç §ããŠãã ããã
[!TIP] ãã®ããŒã«ã¯ Ansible ã®å®å šä¿®é£Ÿã³ã¬ã¯ã·ã§ã³åïŒFQCNïŒã䜿çšãããããAnsible 2.11 以äžãå¿ èŠã§ãã Ansible 2.12 ã¯ãFQCN ãªãã¡ã¯ã¿ãªã³ã°äžã«äºææ§ãã¹ããè¡ã£ããããæå°éã®å¿ èŠããŒãžã§ã³ãšããŠèšå®ãããŠããŸãã
ããããªããããªãã®çµç¹ããã®ããŒã«ãã䟡å€ãåŸãããã®ã§ããã°ããã®ããŒã«ã® 1 åéããŸãã¯å®æç㪠ã¹ãã³ãµãŒã·ãããéåžžã«æè¬ããŸãã
- ããŒã«ã®åºå
- ããŒã«ã®å€æ°
- äŸåé¢ä¿
- äŸã®ãã¬ã€ããã¯
- ç¶æ ã®è¿œè·¡
- ã©ã€ã»ã³ã¹
- èè æ å ±
- éçºãšè²¢ç®
ãã®ããŒã«ã¯ãTailscale ãã€ããªããã®ãã¹ãŠã® stderr ã¡ãã»ãŒãžã衚瀺ããtailscale up
åŒæ°ã«é¢ãããŠãŒã¶ãŒã®èšå®ãšã©ãŒã解決ããŸãã
--authkey=
ã®å€ã¯ãinsecurely_log_authkey
ã true
ã«èšå®ãããŠããªãéãã衚瀺ãããŸããã
ããŒã«ã®åºå
ãã®ããŒã«ã¯ãTailscale ããŒãã® IPv4 ããã³ IPv6 ã¢ãã¬ã¹ããªãã³ã«ããŒãã«å¯Ÿãã tailscale whois
ã®åºåããã¡ã¯ããšããŠæäŸããŸãã
ããã€ãã®éèŠãª whois
æ
å ±ãçŽæ¥æäŸãããæ®ãã® whois åºåã¯äŸ¿å©ãª JSON ãã¡ã¯ããšããŠä¿åãããŸãã
åºåããããã¡ã¯ã:
tailscale_node_ipv4 (string): Tailscale ããŒãã® IPv4 ã¢ãã¬ã¹ã
tailscale_node_ipv6 (string): Tailscale ããŒãã® IPv6 ã¢ãã¬ã¹ã
tailscale_node_hostname_full (string): Tailscale ããŒãã®å®å
šãªãã¹ãå (node.domain.ts.net)ã
tailscale_node_hostname_short (string): Tailscale ããŒãã®çããã¹ãå (node)ã
tailscale_node_created_at (string): Tailscale ããŒããäœæããã ISO-8601 ã¿ã€ã ã¹ã¿ã³ãã
tailscale_node_tags (list): Tailscale ããŒãã«å²ãåœãŠãããã¿ã°ã
tailscale_node_services (list): Tailscale ããŒãã§å®è¡äžã®ãµãŒãã¹ã
tailscale_node_whois (dict): Tailscale ããŒãã«å¯Ÿãã `tailscale whois` ã®å®å
šãªåºåã
ããŒã«ã®å€æ°
å¿ é
tailscale_authkey
ãŸã㯠tailscale_up_skip
ã®ãããããå¿
èŠã§ãã
ã»ãšãã©ã®å Žåãtailscale_authkey
ã䜿çšããŸãã
Tailscale ãã¢ã³ã€ã³ã¹ããŒã«ããŠããå ŽåïŒstate: absent
ïŒã¯ãtailscale_authkey
ãŸã㯠tailscale_up_skip
ã¯å¿
èŠãããŸããã
OAuth ããŒã䜿çšããŠèªèšŒããå Žåãtailscale_tags
ãèšå®ããå¿
èŠããããŸãã
tailscale_authkey
tailscale_up_skip
ã true
ã«èšå®ãããŠããå Žåã¯ãå¿
èŠãããŸããã
Tailscale ããŒãã®èªèšŒçšããŒã§ãã
ããŒãèªèšŒçšããŒã¯ãTailscale ã¢ã«ãŠã³ãã®äžã§çæã§ããŸãããã®ããŒã«ã¯ã2 ã€ã®çš®é¡ã®ããŒããµããŒãããŸãã
- èªèšŒã㌠(
tskey-auth-XXX-YYYYY
) https://login.tailscale.com/admin/authkeys - OAuth ã㌠(
tskey-client-XXX-YYYY
) https://login.tailscale.com/admin/settings/oauth
[!IMPORTANT] OAuth ããŒã䜿çšããå Žåã¯ã次ã®ããŒã«å€æ°ãå¿ èŠã§ãïŒ
tailscale_tags
ïŒæäŸããå¿ èŠããããŸãïŒãtailscale_oauth_ephemeral
ïŒããã©ã«ãã¯true
ïŒã ããã³tailscale_oauth_preauthorized
ïŒããã©ã«ãã¯false
ïŒã
èªèšŒããŒã¯ãçæåŸæå€§ 90 æ¥éã§æéåãã«ãªããŸãã OAuth ã·ãŒã¯ã¬ããã¯åãæ¶ãããªãéãæéåãã«ãªããŸããããçæããã OAuth ã¢ã¯ã»ã¹ããŒã¯ã³ã¯ 1 æéåŸã«æéåãã«ãªããŸãã
詳现ã«ã€ããŠã¯ãTailscale ã® OAuth ã¯ã©ã€ã¢ã³ã ããŒãžãç¹ã« é·æéçåããèªèšŒããŒã®çæ ãåç §ããŠãã ããã
OAuth ããŒã䜿çšããå Žåã¯ãOAuth ã¯ã©ã€ã¢ã³ãã« write
ããã€ã¹ã¹ã³ãŒããä»äžããããšãå¿ããªãã§ãã ããã

ãã®å€ã¯æ©å¯æ å ±ãšããŠæ±ãããã¹ãã§ãã
tailscale_tags
ããã©ã«ã: []
ãã®ããŒã«ã«ãã£ãŠæ§æããã Tailscale ããŒãã«æå®ãããã¿ã°ãé©çšããŸã
ïŒtailscale up
ãžã® --advertise-tags
ãªãã·ã§ã³ãéããŠïŒã
詳现ã«ã€ããŠã¯ãã¿ã°ãšã¯ïŒ ãåç
§ããŠãã ããã
[!NOTE] OAuth ã¯ã©ã€ã¢ã³ãã«ã¯ã¿ã°ãå¿ èŠã§ãïŒ
tailscale_authkey
ã® OAuth ããŒïŒã
ãšã³ããªãŒã«ã¯ tag:
ãå«ããªãã§ãã ããã
ããšãã°ãtailscale_tags: ['worker']
㯠--advertise-tags=tag:worker
ã«ç¿»èš³ãããŸãã
tailscale_up_skip
true ã«èšå®ãããŠããå Žåãtailscale_authkey
ã¯äžèŠã§ãã
ããã©ã«ã: false
Tailscale ããµãŒãã¹ãšããŠã€ã³ã¹ããŒã«ããã³æ§æããããtailscale up
ã®å®è¡ãã¹ããããããã©ããã
ãµãŒããŒããŸã Tailscale ãããã¯ãŒã¯ã«èªèšŒããªãå¿
èŠãããå Žåã®ãã«ãããã»ã¹ãžã® Tailscale ã€ã³ã¹ããŒã«ã®ããã±ãŒãžåæã«äŸ¿å©ã§ãã
ãªãã·ã§ã³
state
ããã©ã«ã: latest
Tailscale ãã€ã³ã¹ããŒã«ãŸãã¯ã¢ã³ã€ã³ã¹ããŒã«ãããã©ããã
å®çŸ©ãããŠããå Žåãstate
㯠latest
, present
, ãŸã㯠absent
ã®ããããã§ãªããã°ãªããŸããã
ãã®ããŒã«ã¯ããœãããŠã§ã¢ãææ°ã®ç¶æ
ãç¶æããææ°ã®ã»ãã¥ãªãã£ãšè£œåã®æ©èœãçµã¿èŸŒãããã« latest
ãããã©ã«ãã§äœ¿çšããŸãã
èšå®ã®å€æŽãããå¶åŸ¡ããããŠãŒã¶ãŒã«ã¯ãpresent
ã䜿çšããã°ããã§ã«ã€ã³ã¹ããŒã«ãããŠããå ŽåãTailscale ã¯æŽæ°ãããŸããã
tailscale_args
ãžã®å€æŽã¯ãlatest
ãš present
ã®äž¡æ¹ã®äžã§é©çšãããŸãã
ãã®ãã©ã¡ãŒã¿ã¯ãã¿ãŒã²ããã·ã¹ãã ã«ã€ã³ã¹ããŒã«ãã Tailscale ã®ããŒãžã§ã³ã«ã®ã¿åœ±é¿ããŸãã
absent
ã«èšå®ãããŠããå Žåããã®ããŒã«ã¯ Tailscale ããŒããç»é²è§£é€ãïŒãã§ã«èªèšŒæžã¿ã®å ŽåïŒãã·ã¹ãã ã«è¿œå ããããã¹ãŠã® Tailscale ã¢ãŒãã£ãã¡ã¯ããã¯ãªãŒã³ã¢ãããŸãã¯ç¡å¹ã«ããŸãã
state
ã absent
ã«èšå®ãããŠããå Žåãtailscale_authkey
ããã³ tailscale_up_skip
ã®ããããå¿
èŠãããŸããã
tailscale_args
tailscale up
ã«ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ãæž¡ããŸãã
䜿çšãããŠãã command ã¢ãžã¥ãŒã«ã¯ããµãã·ã§ã«åŒ ($()
) ã ;
ã &
ãªã©ã® bash æäœããµããŒãããŠããŸããã
tailscale up
ã®åŒæ°ã®ã¿ãæž¡ãããšãã§ããŸãã
[!CAUTION]
--authkey
ã«ã¯äœ¿çšããªãã§ãã ããã 代ããã«tailscale_authkey
倿°ã䜿çšããŠãã ããã
--advertise-tags
ã«ã¯äœ¿çšããªãã§ãã ããã 代ããã«tailscale_tags
倿°ã䜿çšããŠãã ããã
--timeout
ã«ã¯äœ¿çšããªãã§ãã ããã 代ããã«tailscale_up_timeout
倿°ã䜿çšããŠãã ããã
tailscale
ãã€ããªããã®ãã¹ãŠã® stdout/stderr åºåãå°å·ãããŸãã
ãã®ã»ã¯ã·ã§ã³ã®ã¿ã¹ã¯ã¯è¿
éã«é²ããããã¡ãã»ãŒãžã®å°å·ããŠãŒã¶ãŒãèªèã§ããããã«ã5 ç§ã®ããŒãºãå°å
¥ãããŠããŸãã
Stderrs ã¯ããŒã«ã®å®è¡ã®å€±æãç¶ããŸãã
æ©å¯æ§ã®é«ã --authkey
å€ã¯ãããã©ã«ãã§ãã¹ã¯ãããŸãã
æªãã¹ã¯ã®å€ã衚瀺ããå¿
èŠãããå Žåã¯ãinsecurely_log_authkey
ãåç
§ããŠãã ããã
tailscale_oauth_ephemeral
[!NOTE]
tailscale_authkey
ã OAuth ããŒã®å Žåã®ã¿äœ¿çšãããŸãã
ããã©ã«ã: true
true
ã®å ŽåãäžæçããŒããšããŠç»é²ããŸãã
tailscale_oauth_preauthorized
[!NOTE]
tailscale_authkey
ã OAuth ããŒã®å Žåã®ã¿äœ¿çšãããŸãã
ããã©ã«ã: false
æåããã€ã¹æ¿èªãã¹ãããããŸãïŒtrue
ã®å ŽåïŒã
insecurely_log_authkey
ããã©ã«ã: false
true
ã«èšå®ãããŠããå Žåã"Tailscale ãèµ·åãã" ã³ãã³ãã¯ãtailscale up
ã®éäžã§çºçãããšã©ãŒã®ãã°ã« Tailscale authkey ã®çå€ãå«ã¿ãŸãã
ããã©ã«ãã§ã¯ãæåããã¿ã¹ã¯ã®å®äºæã« authkey ã¯ãã°ã«èšé²ãããããšã©ãŒãçºçããå Žåã«ã¯ãã®ããŒã«ã«ãã£ãŠ stderr
åºåã§ãã¹ã¯ãããŸãã
Tailscale ãèµ·åããéã«ãšã©ãŒãçºçããauthkey ã®å€ããã¹ã¯ããã« "Tailscale ãèµ·åãã" ã¿ã¹ã¯ãå®è¡ããããå Žåã¯ããã®å€æ°ã true
ã«èšå®ããŠãã ããã
ããã§ããauthkey ãç¡å¹ãªå ŽåãããŒã«ã¯ Tailscale ãããã®äºå®ã«é¢ãããšã©ãŒã¡ãã»ãŒãžãäžç¶ããŸãïŒ
release_stability
ããã©ã«ã: stable
Tailscale ã®å®å®ããŒãžã§ã³ãŸãã¯äžå®å®ããŒãžã§ã³ã䜿çšãããã©ããã
stable
:
å®å®ãªãªãŒã¹ãã©ã®ãã©ãã¯ã䜿çšãããäžæãªå Žåã¯ããããéžæããŠãã ããã
unstable
:
æåç·ãæ©æãã€é »ç¹ã«é ä¿¡ãããŸããèãéšåããããããããŸããïŒ
tailscale_up_timeout
ããã©ã«ã: 120
tailscale up
ã³ãã³ãã®ã¿ã€ã ã¢ãŠãæéãç§åäœã§å®çŸ©ããŸãã
--timeout duration
tailscaled ãå®è¡äžã®ç¶æ ã«å ¥ããŸã§ã«åŸ ã€æå€§æé
verbose
ããã©ã«ã: false
ããŒã«ã®å®è¡äžã«è¿œå æ å ±ãåºåãããã©ããã ãããã°ãããã®ãªããžããªã® GitHub ã€ã·ã¥ãŒãžã®æ å ±ãåéããã®ã«äŸ¿å©ã§ãã
äŸåé¢ä¿
ã³ã¬ã¯ã·ã§ã³
äŸã®ãã¬ã€ããã¯
- name: ãµãŒããŒ
hosts: all
roles:
- role: artis3n.tailscale
vars:
# Ansible ãå®è¡ããŠãããã¹ãã®ç°å¢å€æ°ãã API ããŒãååŸããäŸ
tailscale_authkey: "{{ lookup('env', 'TAILSCALE_KEY') }}"
Tailscale SSH ãæå¹ã«ããïŒ
- name: ãµãŒããŒ
hosts: all
roles:
- role: artis3n.tailscale
vars:
# Ansible ãå®è¡ããŠãããã¹ãã®ç°å¢å€æ°ãã API ããŒãååŸããäŸ
tailscale_authkey: "{{ lookup('env', 'TAILSCALE_KEY') }}"
tailscale_args: "--ssh"
ä»»æã®ã³ãã³ãã©ã€ã³åŒæ°ãæž¡ãïŒ
- name: ãµãŒããŒ
hosts: all
tasks:
- name: Headscale ã䜿çš
include_role:
name: artis3n.tailscale
vars:
tailscale_args: "--login-server='http://localhost:8080'"
tailscale_authkey: "{{ lookup('env', 'HEADSCALE_KEY') }}"
詳现åºåãååŸïŒ
- name: ãµãŒããŒ
hosts: all
roles:
- role: artis3n.tailscale
vars:
verbose: true
tailscale_authkey: "{{ lookup('env', 'TAILSCALE_KEY') }}"
OAuth ã¯ã©ã€ã¢ã³ãã·ãŒã¯ã¬ããã䜿çšããŠæ¥ç¶ïŒ
- name: ãµãŒããŒ
hosts: all
roles:
- role: artis3n.tailscale
vars:
verbose: true
tailscale_authkey: "{{ lookup('env', 'TAILSCALE_OAUTH_CLIENT_SECRET') }}"
tailscale_tags:
- "oauth"
# ãªãã·ã§ã³ã§ã次ã®é
ç®ãå«ããïŒ
tailscale_oauth_ephemeral: true
tailscale_oauth_preauthorized: false
Tailscale ãã€ã³ã¹ããŒã«ããŠããããã¯ãŒã¯ãžã®èªèšŒã¯è¡ããªãïŒ
- name: ãµãŒããŒ
hosts: all
roles:
- role: artis3n.tailscale
vars:
tailscale_up_skip: true
Tailscale ããŒããç»é²è§£é€ããŠã¢ã³ã€ã³ã¹ããŒã«ããïŒ
- name: ãµãŒããŒ
hosts: all
roles:
- role: artis3n.tailscale
vars:
state: absent
ç¶æ ã®è¿œè·¡
ãã®ããŒã«ã¯ãã¿ãŒã²ããã® XDG_STATE_HOME
ãã£ã¬ã¯ããªã« artis3n-tailscale
ãã£ã¬ã¯ããªãäœæããŸãã
ãã®å€æ°ãååšããªãå Žå㯠$HOME/.local/state
ã«äœæãããŸãã
ããã¯ãtailscale up
ã«æž¡ãããåŒæ°ã®æ§æã®ç¶æ
ãç¶æããããã§ãã
ããã«ãããå¿
èŠã«å¿ã㊠Tailscale ããŒãã®èšå®ãã¢ã€ãã«ç¶æ
ã§æŽæ°ããããšãã§ããŸãã
ãã®ãã£ã¬ã¯ããªãåé€ãããšãå¿
èŠã®ãªããšãã«ãã®ããŒã«ã Tailscale ãåæ§æããŸãããä»ã®äœããå£ãããšã¯ãããŸããã
ãã ãããã® Ansible ããŒã«ã«ãã®ãã£ã¬ã¯ããªãšãã®å
容ã管çãããããšããå§ãããŸãã
泚æïŒ
ãã©ã°ã¯å®è¡éã§æ°žç¶åãããŸãããæ¯åãã¹ãŠã®ãã©ã°ãæå®ããå¿ èŠããããŸãã
...
Tailscale v1.8 以éã以åã«è¿œå ãããã©ã°ãæå®ãå¿ããå Žåã CLI ã¯èŠåã衚瀺ãããã¹ãŠã®æ¢åã®ãã©ã°ãå«ãã³ããŒå¯èœãªã³ãã³ããæäŸããŸãã
ã©ã€ã»ã³ã¹
MIT
èè æ å ±
Ari Kalfus (@artis3n) dev@artis3nal.com
éçºãšè²¢ç®
ãã® GitHub ãªããžããªã¯ãCI å®è¡æã« Tailscale ã«èªèšŒããããã«å°çšã® "ãã¹ã" Tailscale ã¢ã«ãŠã³ãã䜿çšããŸãã å Docker ã³ã³ããã¯ããã®ãã¹ãã¢ã«ãŠã³ãã«æ°ããèªå¯ããããã·ã³ãäœæããŸãã ãã·ã³ã¯ [äžæçèªèšŒããŒ][] ã䜿çšããŠèªèšŒãããèªåçã«ã¯ãªãŒã³ã¢ãããããŸãã
ãã® authkey ã¯ãTAILSCALE_CI_KEY
ãšããååã® [GitHub Actions ã·ãŒã¯ã¬ãã][] ã«ä¿åãããŠããŸãã
OAuth authkey ã®äºææ§ããã¹ãããããã«ãTailscale OAuth ã¯ã©ã€ã¢ã³ãã·ãŒã¯ã¬ããã TAILSCALE_OAUTH_CLIENT_SECRET
ãšããŠä¿åãããŠããŸãã
ãã®ãªããžããªã®ã³ã©ãã¬ãŒã¿ãŒã§ããã°ã
GitHub Codespaces ãéããŠããããã®ã·ãŒã¯ã¬ãããç°å¢ã«äºåå
¥åããããšãã§ããŸãã
ãã®ããŒã«ãããŒã«ã«ã§ãã¹ãããã«ã¯ãTailscale ã®äžæçèªèšŒããŒã TAILSCALE_CI_KEY
ç°å¢å€æ°ã«ä¿åã
ããã oauth
Molecule ã·ããªãªãå®è¡ããŠããå ŽåãOAuth ã¯ã©ã€ã¢ã³ãã·ãŒã¯ã¬ããã TAILSCALE_OAUTH_CLIENT_SECRET
ç°å¢å€æ°ã«è¿œå ããŸãã
[Zããã«ãMolecule ãã¹ãã®ããã«ã
çæ/æºåæé ã®äžéšãšããŠã¹ãã³ã¢ããããã Headscale ã³ã³ããã䜿çšã§ããŸãã
ãã®ããã«ã¯ãUSE_HEADSCALE
ç°å¢å€æ°ãèšå®ããŸãã
ããšãã°ïŒ
USE_HEADSCALE=true molecule test
ansible-galaxy install artis3n.tailscale