Compare commits

...
Sign in to create a new pull request.
Author SHA1 Message Date
b1812aaf52
acmedns(host): add to ansible_pull_hosts 2026-11-07 19:24:08 +01:00
a9d6bda678
update dooris configuration to allow connection to club-assistant 2026-11-07 12:20:09 +01:00
b34666c52f Update docker.io/xenrox/ntfy-alertmanager Docker tag to v1.0.2 2026-11-06 02:16:48 +00:00
d60fb2f37f Update quay.io/oauth2-proxy/oauth2-proxy Docker tag to v7.15.6 2026-11-05 20:16:20 +00:00
0e87b29e41
add remaining Chaosknoten hosts to alloy_hosts 2026-11-05 15:32:06 +01:00
44c1eaa76f status: add hta to gatus monitoring 2026-11-05 09:25:06 +01:00
cc6790dff2 Merge branch 'main' of git.hamburg.ccc.de:CCCHH/ansible-infra 2026-11-05 09:08:03 +01:00
9174ed6152 hta: set proper django secret key 2026-11-05 09:08:01 +01:00
947d8fd0a0
ansible-pull(role): deploy failure notify service using the copy loop
Deploy the ansible-pull-failure-notify.service using the loop using
ansible.builtin.copy as it doesn't have any template logic.
2026-11-04 17:28:05 +01:00
a4a92448dc
ansible-pull(role): have failure notify deploy match other script deploy
Have the deployment of the ansible-pull-failure-notify script match the
deployment of the other helper scripts.
2026-11-04 17:28:05 +01:00
96a7eabbac
ansible-pull(role): move ansible-pull reboot logic to script as well
Do this to unify the way these helper scripts get deployed.
2026-11-04 17:28:05 +01:00
1157c98ff5
ansible-pull(role): make successful run timestamp exporter work
The successful run timestamp exporter didn't work, because the
ansible-pull user wouldn't necessarily have the necessary permissions
and because the command wouldn't properly work.
Move the timestamp export as well as the reboot to separate services,
which always run as root, to ensure these operations work and to have a
clean setup using systemd services.
Also move the successful run timestamp exporter to a custom script to
have it work properly.
2026-11-04 17:28:03 +01:00
f6f6cc4804 ansible-pull(role): export last successful run timestamp statistic
Using the node exporter textfile collector, expose the timestamp of the
last successful ansible-pull run.
2026-11-03 19:58:03 +01:00
52d3d8ecd9 alloy(role): enable node exporter textfile collector
Enable the node exporter textfile collector, which allows for collecting
custom statistics in a simple way.
https://github.com/prometheus/node_exporter#textfile-collector
2026-11-03 19:58:03 +01:00
94430cb43a hta: Enable OIDC login 2026-11-03 00:23:15 +01:00
stb
6a87ba0562 Add Hackertours Admin (hta) (#182)
The two images are built in https://git.hamburg.ccc.de/CCCHH/hackertours-admin

Reviewed-on: CCCHH/ansible-infra#182
Reviewed-by: chris <c6ristian+git-ccchh@christian.moe>
2026-11-02 18:51:09 +01:00
04f2b1d25c Limit the size of logs more severly
The goal is to:
* limit the amount of  (potentially) PII data by limiting retention time
* make sure the disk doesn't fill up with log data
* make it easier to look at logs on the system without having to wade through many old entries
2026-11-02 18:28:50 +01:00
04bb14c6f4
update matrix moderation guidelines based on infra-team discussion 2026-11-01 22:58:26 +01:00
Max
c28d7706a3
autoremove apt packages after upgrades 2026-10-31 16:27:51 +01:00
8fb44f13ce add dooris-pve 2026-10-30 00:39:38 +01:00
30ab1f2238
bump draupnir to 3.2.0 2026-10-29 19:45:34 +01:00
47d4da604a ansible-lint: ignore more directories that aren't part of the repo 2026-10-29 15:50:53 +01:00
5c558950e4 Add log rotation 2026-10-29 15:50:04 +01:00
df4f065a30 Sync about every 2 minutes 2026-10-29 15:50:04 +01:00
1dc38a5de0 Add matrix-sync compose setup 2026-10-29 15:50:04 +01:00
13f47cce68
add static ip and dns for openwebrx 2026-10-27 23:22:30 +01:00
d7ef159455
add static ip and dns for crabsdr 2026-10-27 23:08:55 +01:00
e56e03176e
auth-dns(host): fix club-assistant acme cname 2026-10-22 16:54:08 +02:00
88887b3109 Update docker.io/library/nginx Docker tag to v1.31.8 2026-10-22 02:17:06 +00:00
f078b902b3 Re-enable ccchoir blog 2026-10-21 23:29:02 +02:00
39028a6557
dokuwiki(role): set php strict_mode and disable upload_progress 2026-10-21 18:02:13 +02:00
be76c3d792
wiki.ccchh.net is not longer in the dns
so we remove it from all other configs as well
2026-10-21 16:55:32 +02:00
311404a6be
dokuwiki(role): add support for Debian 13 & remove for 11 2026-10-21 16:33:55 +02:00
ec2be61327 Update docker.io/grafana/loki Docker tag to v3.7.9 2026-10-21 02:17:27 +00:00
56ecf7ff18
grafana: remove ccchh opnsense for scrape jobs 2026-10-20 20:52:10 +02:00
ce96105463 Make Jitsi JVB work correctly with IPv6
Since the Jitsi Docker Compose stack does not properly take IPv6 into consideration, patch the JVB config to add mappings from the private IPv6 address of the Docker network to the public IPv6 address.

This should be the source of the reported problems with conferences with 3+ people.
2026-10-20 15:34:05 +02:00
442231323c disable ccchoir.de for now 2026-10-20 15:05:55 +02:00
stb
c02b7e6f35 Merge branch 'main' into jitsi-docker-compose-role 2026-10-20 15:04:15 +02:00
9032e5b34a
also fix www.didays.de monitoring 2026-10-19 13:17:54 +02:00
7061ff8b14
fix didays.de monitoring 2026-10-19 13:11:43 +02:00
Max
8e0bc6c406
fix onlyoffice monitoring 2026-10-16 17:49:13 +02:00
c970e5fb83 Update docker.io/library/nginx Docker tag to v1.31.7 2026-10-15 14:16:47 +00:00
stb
c898a0ec0e Merge branch 'main' into jitsi-docker-compose-role 2026-10-14 12:57:38 +02:00
743a7d609c Update docker.io/onlyoffice/documentserver Docker tag to v10 2026-10-12 20:17:02 +00:00
42df2e4af1 revert 106a5cb97a
revert auth-dns: dooris has wrong ipv6 address
2026-10-11 00:01:24 +02:00
106a5cb97a
auth-dns: dooris has wrong ipv6 address 2026-10-10 23:58:31 +02:00
086eb9ff46
auth-dns: add ptouch-print-server to ccchh.net 2026-10-10 23:38:48 +02:00
54a4015bb0 Add matrix-sync 2026-10-08 14:27:27 +02:00
stb
816c7497fa Merge branch 'main' into jitsi-docker-compose-role 2026-10-08 11:12:38 +02:00
8bf5690275 Customize with our logos 2026-10-08 10:50:48 +02:00
610a1faca8 Allow UI customization 2026-10-08 10:50:23 +02:00
86e793c624 Use jitsi role to configure jitsi
The host has been manually cleaned up (removed old packages and config) and this config has been deployed already.
2026-10-08 10:24:38 +02:00
dbac5ede16 Add a role for Jitsi in Docker Compose
We need this role to follow the recommended deployment approach from https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker/

This role enables us to keep our config and customizations separate from releases of the Compose setup the Jitsi project publishs.
2026-10-08 10:23:17 +02:00
0f23f117a7 Update docker.io/pretix/standalone Docker tag to v2026.8 2026-10-04 14:16:17 +00:00
78ee1382d5 Confige sending mail with auth 2026-10-04 15:05:06 +02:00
d03264c256
set client_max_body_size to 100m on pad nginx 2026-10-02 16:21:07 +02:00
08d6f039ca Update quay.io/oauth2-proxy/oauth2-proxy Docker tag to v7.15.5 2026-10-01 14:16:30 +00:00
e21c7dccec Update git.hamburg.ccc.de/ccchh/oci-images/keycloak Docker tag to v26.7.5 2026-10-01 02:45:54 +00:00
5a18fbdb5a
status(host): add monitoring for www.didays.de (a redirect to didays.de) 2026-09-29 02:57:51 +02:00
6e9a75fa97
public-reverse-proxy(host): add config for www.didays.de 2026-09-29 02:57:51 +02:00
d9a13c7497
set new dooris' main lock to "Hauptraum" 2026-09-28 15:03:15 +02:00
d39ff1f861
fix *matrix: create room* guide link not being clickable 2026-09-27 18:20:49 +02:00
2ae7f86f6b
add c6ris age key backed via fido piv 2026-09-26 01:03:43 +02:00
Max
b9cc68bda1
reduce renovate executions to twice every six hours 2026-09-26 00:51:51 +02:00
d0fe432d9e Update quay.io/oauth2-proxy/oauth2-proxy Docker tag to v7.15.4 2026-09-25 12:05:35 +02:00
adf5ecdb54 Update mariadb Docker tag to v12.3.3 2026-09-25 00:16:55 +00:00
4ffb5c18a1
use jtbx SSH key instead of PGP key and use SOPS merge for admin keys
Use jtbx SSH key instead of his PGP key and re-organize .sops.yaml
around the SOPS merge feature to accommodate admin age/SSH keys.
2026-09-24 20:11:54 +02:00
Max
e2277e0e9c
bypass pull request workflow for automatic patch updates 2026-09-22 22:10:44 +02:00
83b0ab0950 public-reverse-proxy(host): Increase nginx worker fd limit
By default the limit on file descriptors is at a 1024 hard limit and 520k hard limit.
Unsure how this affects nginx, but each client connection needs two file descriptors.
So let's try to set the limit of open files explicitly.
2026-09-22 16:05:05 +02:00
1901ca515d Update git.hamburg.ccc.de/ccchh/oci-images/keycloak Docker tag to v26.7.4 2026-09-22 00:16:40 +00:00
049682bce2
host(draupnir): set backgroundDelayMS to have Draupnir act fast
Use a recommended low value for backgroundDelayMS to have Draupnir chain
consecutive backgrounded operations faster and therefore act faster.
2026-09-22 02:10:47 +02:00
81e5380a14 Update docker.io/library/nginx Docker tag to v1.31.6 2026-09-21 22:52:07 +02:00
acf0b57d97 Update docker.io/grafana/loki Docker tag to v3.7.8 2026-09-21 22:49:09 +02:00
fbddd28c71 public-reverse-proxy(host): Add bildungsurlaub.hamburg.ccc.de 2026-09-21 19:51:18 +02:00
a649455d92 auth-dns(host): Move bildungsurlaub.hamburg.ccc.de to public-web-static 2026-09-21 19:48:56 +02:00
547210d31f auth-dns(host): Remove deleted www2 and www3 VMs 2026-09-21 19:44:51 +02:00
f1135b818f
z9-router(host): new keys for Junes WireGuard 2026-09-21 19:09:07 +02:00
ee810bfc16
update matrix moderation docs to reflect that we now have two ban lists 2026-09-18 17:45:48 +02:00
d422b9660a
docs: correct mjolnir -> draupnir 2026-09-16 13:39:42 +02:00
5925b22bf5
setup cccfr secondary DNS 2026-09-11 10:52:37 +02:00
4bdd36b8f7
update knot role to support more operational variety
Now secondary zones, dynamic zones, interpeted catalog zones, etc.
are supported by our knot role
2026-09-11 10:52:33 +02:00
1290063204
update our moderation policy room access policy 2026-09-08 15:44:10 +02:00
f2a6ae5de9 Update docker.io/xenrox/ntfy-alertmanager Docker tag to v1.0.1 2026-09-07 23:43:48 +02:00
e3635939f4
fix draupnir ban docs 2026-09-07 18:38:39 +02:00
f7c3e2146d
migrate mjolnir to draupnir 2026-09-06 14:40:45 +02:00
ddce7783db add guide for common matrix moderation actions 2026-09-05 23:29:09 +02:00
8f07ad8ca4 add guide about matrix room creation 2026-09-05 23:29:09 +02:00
6a1caed856 add concept doc for matrix moderation 2026-09-05 23:29:09 +02:00
d20120d708 Migrate config renovate.json 2026-09-05 12:23:31 +02:00
bf04f2d163 Docs: Add dokuwiki upgrade guide 2026-09-04 21:13:58 +02:00
Max
39d95a7b9f except keycloak from grouped update PRs
keycloak is a critical service
separating keycloak updates makes it easier to respond quickly to
critical updates or delay them when there are breaking changes
2026-09-03 18:24:43 +02:00
Max
247cb031f2 auto update patch versions 2026-09-03 18:24:43 +02:00
4540dc5516 Update to current version, open up fully again. 2026-08-25 19:04:44 +02:00
bd71738df3 Temporary block until we can update Keycloak 2026-08-25 18:41:40 +02:00
ae314ea9b3 Configure manual subscriber lists 2026-08-24 10:01:16 +02:00
a2eba1ac70 fixed IP for Retro Sun SparcStation 4 2026-08-21 23:34:10 +02:00
5ae8a3b186 Re-add IP for waybackproxy 2026-08-21 23:28:21 +02:00
6389a936c8 Merge branch 'main' of git.hamburg.ccc.de:CCCHH/ansible-infra 2026-08-18 19:27:56 +02:00
233131b612 Use correct hostname 2026-08-18 19:27:54 +02:00
a87c27b3d5
keycloak(host): allow right ipv4 of z9 router 2026-08-17 21:39:00 +02:00
e9a5b711ae Start migrating config to Ansible
The real file still lives in /opt/mailman on the host for now, need to migrate whole config into Ansible.
2026-08-17 09:25:23 +02:00
548d761def Migrate officemail away 2026-08-17 09:20:13 +02:00
53c1801eba Change confirmation lifetime to 7d 2026-08-16 09:28:42 +02:00
e668c44273 Enable list subscription management for intern@ 2026-08-16 09:01:57 +02:00
00524f7bab
base_config: only install kitty-terminfo, not kitty 2026-08-11 23:55:03 +02:00
379aa7c451
add configuration required for dooris -> spaceapid integration 2026-08-11 20:54:27 +02:00
73760a9995
fix ansible-lint warnings 2026-08-11 17:38:51 +02:00
39d8ff4ef8
update wireguard publicKey for lilly 2026-08-11 17:33:57 +02:00
938a913094
z9-router(host): add firewall rule chaosknoten to z9 pbs 2026-08-09 17:32:36 +02:00
6a402aa544
z9-router(host): fix dhcp6 config, wrong interface 2026-08-09 17:09:40 +02:00
35381d5bb9
z9-router and auth-dns(host): add static dhcp lease and dns entry for wled-eh22 2026-08-09 17:09:15 +02:00
f5d1c6deee
z9-router(host): add firewall rule staubis to club assistant 2026-08-07 23:50:57 +02:00
stb
8f3cd75a46 Merge branch 'main' into renovate/docker.io-pretalx-standalone-2026.x 2026-08-07 23:47:09 +02:00
stb
cf18c8e633 Merge branch 'main' into renovate/docker.io-pretix-standalone-2026.x 2026-08-07 23:44:45 +02:00
3ab9f83039
z9-router(host): fix nftables 2026-08-07 23:36:56 +02:00
d97c22cc8e
z9-router(host): fix dns 2026-08-07 23:36:37 +02:00
ebdafb997f
unbound(role): also over write fallback_dns in resolvd 2026-08-07 23:36:22 +02:00
22ace3c537
z9-router(host): fix file permissions 2026-08-07 23:13:44 +02:00
1ec54ad502
secrets(role): add parent folder settings 2026-08-07 23:10:54 +02:00
4fbac5cfe6
unbound(role): add config flag in README 2026-08-07 22:56:07 +02:00
5378c3f360
auth-dns(host): ccchh.net remove unused 2026-08-07 22:56:07 +02:00
51b2cac907
z9-router(host): remove netwan, vlan55 untagged, add and fix DNS, fix formatting 2026-08-07 22:56:07 +02:00
c45fb91f76
kea_dhcp(role): seperate package installes 2026-08-07 22:55:57 +02:00
47fbd96642
kea_dhcp(role): update README 2026-08-07 22:55:57 +02:00
897ee5fa43
kea_dhcp(role): remove unused 2026-08-07 22:55:57 +02:00
7eabd88e2c
unbound(role): update readme and move task block to top level and remove unused 2026-08-07 22:55:57 +02:00
82760d2bc2
light(host): remove resolver from nginx conf 2026-08-07 22:55:56 +02:00
c2130adbb5
auth-dns(host): remove unused unfi ipv6 and specify comments 2026-08-07 22:55:56 +02:00
14b54797ec
README.md: correct sentence 2026-08-07 22:55:56 +02:00
49f07b0872
z9-router(host): move yate from vlan 55 to 52 2026-08-07 22:55:56 +02:00
1452c85b9d
z9-router(host): change mac address of yate in dhcp 2026-08-07 22:55:56 +02:00
8043198569
z9-router(host): add dhcp and dns for dooris-legacy 2026-08-07 22:55:56 +02:00
ffb88164ee
z9-router(host): change vlan 54 to 55 and remove netwan move vlan 400 to netlan 2026-08-07 22:55:56 +02:00
b76fac2255
general: update gitignore 2026-08-07 22:55:55 +02:00
58ea3ef7a3
z9-router(host): update host kea config
- edit config to work with update kea role
- fix ipv6 addresses
2026-08-07 22:55:55 +02:00
32caa40f77
unbound(role): fix some unbound setup stuff 2026-08-07 22:55:55 +02:00
8d9cb0007c
kea_dhcp(role): update to newest fux noc version 2026-08-07 22:55:55 +02:00
6006dbca27
z9-router(host): nftables conf fix indent and allow dhcpv6 2026-08-07 22:55:55 +02:00
9271cbda97
unbound(role): fix systemd unit of prometheus exporter 2026-08-07 22:55:34 +02:00
4ec4c1f942
z9-router(host): fix systemd-networkd configs 2026-08-07 22:55:34 +02:00
83f654037a
unbound(role): fix unbound prometheus exporter install on debian
- download debian image from github und verify checksum
- setup systemd service unit
2026-08-07 22:55:33 +02:00
6b05c4b05a
unbound(role): fix unbound config template
- fix some indentation problems
- fix access control
- fix remote control unix socket and thrust anchor file (because debain
appamour ist annoying)
  - add unbound-anchor package
2026-08-07 22:55:33 +02:00
db6ef3fcb2
kea_dhcp(role): fix include wars check 2026-08-07 22:55:33 +02:00
fa91690485
z9(pve01): change thinkcccore0 to pve01 2026-08-07 22:55:33 +02:00
04d24ccb6f
z9(group): remove all old ip references and change them to new ones 2026-08-07 22:55:33 +02:00
9e92a3c390
z9(group): remove all z9 references as subdomain 2026-08-07 22:55:33 +02:00
a0b0e8188f
unbound(role): move resolvd vars to task 2026-08-07 22:55:33 +02:00
5423558ab4
unbound(role): make unbound thread number configurable 2026-08-07 22:55:32 +02:00
bb141ddab3
unbound(role): reformat config template and use all vcpus 2026-08-07 22:55:32 +02:00
9a5dafb2bc
unbound(role): remove tags inside role 2026-08-07 22:55:32 +02:00
a4bb9a82d2
unbound(role): add FIXME note to unbound prometheus exporter install 2026-08-07 22:55:32 +02:00
1a0ac38861
unbound(role): use existing deploy_systemd_resolved_config role and some reordering 2026-08-07 22:55:32 +02:00
613e0528d7
kea_dhcp(role): make stork-agent.env smaller and add link to documentation 2026-08-07 22:55:32 +02:00
6734843e8a
kea_dhcp(role): fix indentation in template 2026-08-07 22:55:32 +02:00
c803b1fc67
kea_dhcp(role): add README.md 2026-08-07 22:55:31 +02:00
7440e8fd15
kea_dhcp(role): some fixes and removing arch part
- remove tags from tasks
- remove archlinux part
- use debian default package for kea
2026-08-07 22:55:31 +02:00
ebc6c8a9b8
z9-router(host): fix some spelling and a wireguard peer address 2026-08-07 22:55:31 +02:00
8351c28cd0
z9-router(host): add ansible pull 2026-08-07 22:55:31 +02:00
1dff022146
z9-router(host): rename rt1 to z9-router 2026-08-07 22:55:31 +02:00
010b8d1224
rt1(z9 host) unbound(role) kea_dhcp(role): create unbound and kea_dhcp role for rt1
- create unbound role
- create kea_dhcp role
- configure unbound and keadhcp on rt1(z9 host)
2026-08-07 22:55:31 +02:00
aeaa80d2c4
rt1(z9 host): create host and configure networkd and nftables 2026-08-07 22:55:31 +02:00
54b0d83451 Update docker.io/pretalx/standalone Docker tag to v2026 2026-08-04 21:31:22 +00:00
e32d3734e4 Update docker.io/pretix/standalone Docker tag to v2026.7 2026-08-04 21:31:00 +00:00
7f421b2409 Update to current version 2026-08-04 23:16:39 +02:00
6c4f2dc9b6 Update with correct prefixes 2026-08-04 18:44:51 +02:00
849f63cd1b Activate sync 2026-08-04 09:13:50 +02:00
68289025d2 Merge branch 'main' of git.hamburg.ccc.de:CCCHH/ansible-infra 2026-08-03 08:58:31 +02:00
03ba0cf126 Use correct IP prefix in example 2026-08-03 08:58:29 +02:00
9a78164b7b
roles(dooris): remove blank line to make ansible-lint happy 2026-08-03 00:06:44 +02:00
9266123f42 Explain that you can use a default route
#133
2026-08-02 18:12:02 +02:00
24124e9f3d Document wg setup
First step for #133
2026-08-02 18:09:29 +02:00
f749ed436c Use fixed port range to allow for better fw rules 2026-08-02 17:25:30 +02:00
0377db2812 Use correct hostname for yate 2026-08-02 17:24:58 +02:00
5ecf70ade3 Activate old address for yate for now 2026-07-31 19:43:37 +02:00
6eafc47773 jitsi dazu
Erstmal nur der Host, die eigentliche Config muss später passieren
2026-07-29 22:52:13 +02:00
de8daaf56c
add dooris role for setup of dooris interaction on the node itself 2026-07-29 14:16:04 +02:00
699a2bcfff
specify that docker_compose role may not be included twice
Our docker compose role is configured via ansible variables in a way
that overwrites each other if it is activated twice with different
variable assignments (unless e.g. a role that just installs more
packages).
To prevent misuse of the role, the allow_duplicates key of the role
meta is set to false. This should make ansible complain if the role
is included twice for a single host.
2026-07-29 14:16:04 +02:00
685646c697 Set up Keycloak to Mailman sync for chaos@
DRY_RUN=true, so no changes to Mailman are performed yet.
2026-07-26 16:19:41 +02:00
647058f6ad ccchoir: stick to major version and cronjob update 2026-07-26 13:21:41 +02:00
283bc80b41 Update wordpress image 2026-07-26 00:47:54 +02:00
70b1039f95 Upgrade Hedgdedoc to 1.11.1
Closes #130

Also add appropriate config for renovate to upgrade Hedgedoc.
2026-07-24 23:26:23 +02:00
374e8f981a Update git.hamburg.ccc.de/ccchh/oci-images/nextcloud Docker tag to v34 2026-07-23 20:16:22 +00:00
4218b59d3b
fix: alloy role the suites for deb repo must be stable 2026-07-23 22:08:58 +02:00
900971ebe9 alloy(role): pull in alloy role that works from fux (#112)
Reviewed-on: CCCHH/ansible-infra#112
Reviewed-by: June <june@noreply.git.hamburg.ccc.de>
2026-07-23 20:34:02 +02:00
9a876e12a8
fix CNAME for club-assistant acme challenge 2026-07-23 14:33:19 +02:00
b3fe097421
re-enable club-assistant dns record 2026-07-22 21:44:03 +02:00
28a22e4476 pad: disable external link warning
closes #130
2026-07-22 00:04:05 +02:00
60a407a406
add prusa-mk4.ccchh.net DNS entry 2026-07-18 20:13:00 +02:00
Max
2a576495da
separate multiple major release upgrades 2026-07-11 21:57:34 +02:00
580b5bdb1f
auth-dns(host): add acme cnames back
for:
- club-assistant
- light
- light-werkstatt
- dooris
2026-07-11 21:29:47 +02:00
14d2d002f7 Update docker.io/prom/prometheus Docker tag to v3.13.1 2026-07-10 09:15:50 +00:00
25bab80c58
status(host): add monitoring for didays.de and staging 2026-07-09 22:20:11 +02:00
56392b776a
public-reverse-proxy(host): add config for didays.de and staging 2026-07-09 22:20:11 +02:00
50cca22cfe Update docker.io/binwiederhier/ntfy Docker tag to v2.26.0 2026-07-09 19:00:56 +00:00
1ae4a39f57 Update all stable non-major dependencies 2026-07-08 00:16:11 +00:00
a35326a065
transmission(role): running the handler should always report changed
Make ansible-lint happy by specifying that.
2026-07-08 00:59:02 +02:00
9ae16363c5
forgejo-runner-external(host): configure forgejo-runner setup
Configure connection for the DI-Day/website repo.
2026-07-08 00:42:50 +02:00
dd1cd6f529
forgejo-runner-external(host): basic setup 2026-07-08 00:20:02 +02:00
81b16a04cb Explain why this is necessary 2026-07-05 10:40:29 +02:00
b9a5fa3ce5
forgejo-runner(host): configure some more labels for more images
Provide the ubuntu labels similar to the images running at Codeberg
using the catthehacker/ubuntu:act-* images.
See:
https://github.com/catthehacker/docker_images
https://codeberg.org/actions/meta

Also provide convenience labels for Alpine and Debian.
2026-07-03 03:42:18 +02:00
d44d84ae2a
forgejo-runner(host): configure forgejo-runner setup 2026-07-03 03:42:18 +02:00
0acc56b238
docker(role): document gVisor issue with user-def. br. and provide help
Document issue with containers on user-defined bridges and using the
gVisor runsc runtime. Also provide a helper resolv.conf as a workaround.
2026-07-03 03:42:18 +02:00
2e50226b94
docker(role): provide option to set up gVisor (runsc runtime) 2026-07-03 03:42:18 +02:00
7d7cf455eb
forgejo_runner(role): create role for setting up Forgejo Runner install 2026-07-03 03:42:18 +02:00
94120337aa
forgejo-runner(host): basic setup 2026-07-03 03:42:17 +02:00
Max
dea6bfe68b
update keycloak to 26.6.3 2026-06-30 22:19:41 +02:00
cf98c9df30
configure dooris to write ssh public keys into file 2026-06-30 21:14:32 +02:00
8de361d223
add dooris.ccchh.net entries 2026-06-30 20:47:35 +02:00
75e574a80b Merge branch 'main' of git.hamburg.ccc.de:CCCHH/ansible-infra 2026-06-28 17:02:07 +02:00
3e0fdb6074 Configure transmission 2026-06-28 17:02:05 +02:00
9b8da29cae
auth-dns(host): update ip of xr18 in ccchh.net 2026-06-28 14:24:28 +02:00
899dbea4dd Fix redirect check, but this is wrong
Redirect checks should not repeat the content check for the target, but simply check that the redirect is going to the right URL.
2026-06-19 09:30:18 +02:00
stb
1abea4ccec Merge branch 'main' into use-canary 2026-06-19 09:10:49 +02:00
8b924c924f Update actions/checkout action to v7 2026-06-18 15:15:51 +00:00
e5fa86468a Encode domain in canary 2026-06-15 19:56:15 +02:00
05149f42fa Use canary comment instead of actual content
Please only merge after CCCHH/ccchh-website#170
2026-06-15 19:14:42 +02:00
5f7b0c9449 Adjust to content change 2026-06-15 19:07:17 +02:00
75b7e80321
migrate uberwachungsfrei kundgebung to own domain 2026-06-11 14:40:09 +02:00
5973de0959
dns: validate zone files before apply in knot role 2026-06-10 16:17:58 +02:00
57d2a94990
dns: fix syntax error in diday.org zone 2026-06-10 16:17:23 +02:00
431aaefb36
dns: remove ns.vie.ccc.de from already migrated zones 2026-06-10 16:05:51 +02:00
6d922b7c8b
dns: also notify erfadns.ber.ccc.de for catalog zone changes 2026-06-10 13:12:00 +02:00
931afac7e0
add ueberwachungsfrei-kundgebung site 2026-06-09 21:42:49 +02:00
b283089b06
readd ns.vie.ccc.de to our zones because zones are not delegated yet 2026-06-09 21:27:33 +02:00
ec9275cf46
add ueberwachungsfrei-kundgebung.hamburg.ccc.de domain 2026-06-09 21:00:51 +02:00
389b87113b
auth-dns: update NS records of all zone files
The current set is auth-dns.hamburg.ccc.de in addition to the
newly created erfadns.ber.ccc.de

See https://zammad.hamburg.ccc.de/#ticket/zoom/1738 for details.
2026-06-09 11:00:02 +02:00
471012928a auth-dns: configure nameserver secondary solely to erfadns.ber.ccc.de 2026-06-09 10:31:32 +02:00
04305a1124
keycloak: update to 26.6.0 2026-06-08 21:34:13 +02:00
5f94d7f284
remove ns-intern.hamburg.ccc.de from notify targets of our domains 2026-06-06 16:26:47 +02:00
66e0095070
add zone diday.org. to authoritative DNS 2026-06-06 16:25:18 +02:00
8ca5d82d39
knot: fix templating inconsistency in netplan config 2026-06-06 15:06:11 +02:00
3a09c107b9
knot: use explicit ansible_facts reference 2026-06-06 14:59:16 +02:00
fa6e280594
www2/www3(host): remove hosts as they got removed 2026-06-04 00:54:55 +02:00
7b48f1ebe7
status(host): fix auth-dns ccchh.net check by moving to new entry
Check entry for pve01 instead of no longer present entry for
club-assistant for the auth-dns ccchh.net check.
2026-06-04 00:39:07 +02:00
fa598c72fc Add opensourcetorrents 2026-06-01 21:15:31 +02:00
a72accca20 Add documentation style outline (#97)
Reviewed-on: CCCHH/ansible-infra#97
Reviewed-by: lilly <lilly@noreply.git.hamburg.ccc.de>
2026-05-27 20:49:07 +02:00
7832978ff7
update ccchh.net dns zone after club proxmox migration 2026-05-24 11:55:37 +02:00
dd48a9d519
bring guide about new chaosknoten VMs into doc structure 2026-05-24 00:27:23 +02:00
0842a51ae0 Merge branch 'main' of git.hamburg.ccc.de:CCCHH/ansible-infra 2026-05-24 00:12:52 +02:00
603d3fb6f4 Update machine SMTP mail sending config 2026-05-24 00:12:50 +02:00
4574dbf4ba
secrets(role): introduce secrets role for storing secrets
Allows storage of secrets to then be referenced in other places.
The motivation was storing WireGuard secrets for systemd-networkd.
2026-05-23 22:40:17 +02:00
5ca311d240
add some documentation structure 2026-05-23 19:37:51 +02:00
51cd583dff
docs: move information on secrets and sops into docs 2026-05-20 22:54:32 +02:00
74fb99ec8f
docs: delete outdated section on web service setup from README
A better guide can be found in the new docs.
2026-05-20 20:09:28 +02:00
b91bc38d7b
docs: rework and split up docs on creating a new web service
- Split out the general information on how to set up a new VM on
  Chaosknoten to have it be more generally useful.
- Also split out the section on monitoring to not have it intermingled
  with the other information.
- Rework the guides to include more information and be more streamlined.
  Also remove duplicate information along the way.
2026-05-20 20:06:57 +02:00
ec27b52820
cloud: bump nextcloud to 33 and postgres 15.18 2026-05-20 19:49:53 +02:00
411200884b
docs: overhaul SOPS documentation for better structure and readability 2026-05-20 18:57:21 +02:00
292c626629
add ns2.vie.ccc.de as dns secondary 2026-05-20 15:44:47 +02:00
0c83fcc2b2
sops: darios key expired, so remove for now 2026-05-20 04:09:28 +02:00
8428d5a66b
docs: use pymdownx.superfences to make codeblocks in lists work properly 2026-05-19 23:49:06 +02:00
fc47d119bb
docs: move guides into sub-directory
Also start documenting the docs structure in home.
2026-05-19 19:24:06 +02:00
197b9c297c docs: fix code blocks overflowing and add syntax highlighting
Without these options code blocks would overflow. See:
https://github.com/asiffer/mkdocs-shadcn/issues/57
And it also provides nice syntax highlighting.
2026-05-19 18:33:03 +02:00
abcc144711 docs: add index page 2026-05-19 18:33:03 +02:00
31cc60c648 docs: add mkdocs config and CI for building infra-docs website
Heavily inspired by: https://forgejo.c3voc.de/voc/av-docs
2026-05-19 18:33:03 +02:00
a93d22fb05 add configuration for infra-docs and infra-docs staging 2026-05-19 18:33:03 +02:00
8a8ce7206d
add infrastructure-authorized-keys to lists host 2026-05-19 16:27:59 +02:00
dcd454011f
status(host): add checks for auth-dns 2026-05-19 14:27:54 +02:00
55d1279c3e
status(host): add check for diday.org 2026-05-19 14:17:07 +02:00
3541c68357
disable dnssec for catalog zones on auth-dns
Catalog zones are not real zones in the DNS hierarchy and don't
have a parent zone. Therefore they will never have a valid DNSSEC
delegation so we should skip signing those zones.
2026-05-19 11:01:52 +02:00
6bb09901a0
add ns.vie.ccc.de. as direct secondary for authoritative DNS zones 2026-05-19 11:00:03 +02:00
73e77bde70
tag plays in playbooks (instead of tasks in roles) 2026-05-19 00:24:10 +02:00
6b19f69135
renovate(role): add cleanup service and timer for renovate volume
With time the volume seems to just keeps growing with cache data, so
clean it up once a day.
2026-05-19 00:23:26 +02:00
b0347d64bf
remove configuration for deleted woodpecker host 2026-05-18 20:13:48 +02:00
1275d50bdf
dooris(host): use new dooris software
Also fix DNS record not properly working anymore.
2026-05-18 18:00:30 +02:00
1757c36605 Postorious needs REST API as well 2026-05-16 13:31:18 +02:00
a76f01aea7 Move secrets to SOPS, add REST_USER 2026-05-16 13:06:19 +02:00
cc5dfb3cf7 Update docker.io/grafana/grafana Docker tag to v13 2026-05-15 19:41:57 +02:00
83e6f76464 deploy_systemd_journal_config(role): Disable ForwardToSyslog
We don't want hour journalctl logs mirrored to /var/log/syslog
2026-05-15 19:25:44 +02:00
164f784957
remove errornously added irz42 reverse-dns secondaries 2026-05-15 14:50:15 +02:00
637dc6b25a
consider ansible-pull jobs failed after 30 minutes 2026-05-13 16:53:57 +02:00
18ffa42358
remove actually unused reverse-dns zones 2026-05-13 15:14:37 +02:00
d2f95237a0
add wieskes nameservers for reverse-dns zone transfers from auth-dns 2026-05-13 15:11:29 +02:00
e3ef60186f
grafana: set default alertmanager notifications 2026-05-09 21:34:08 +02:00
c9c44efa0b
auth-dns(host): remove entries for old and deprecated services 2026-05-09 19:16:34 +02:00
d76212c5a8
auth-dns(host): remove legacy "-intern" entries from hamburg.ccc.de zone 2026-05-09 18:27:54 +02:00
3c558003a9
auth-dns(host): format hamburg.ccc.de zone file
Format zone file as first step of a series of clean-ups.
2026-05-08 21:20:55 +02:00
595b19375a
replace primary NS in all zones except *.hamburg.ccc.de zones 2026-05-07 23:59:50 +02:00
bc4df9a3f4
fix ansible-lint warnings of knot role 2026-05-07 23:45:48 +02:00
50beedbc62
configure metric scraping from knot on auth-dns 2026-05-06 15:51:38 +02:00
291ebce943
router(host): configure public (v4) network 2026-05-06 14:43:05 +02:00
f7306b91a6
remove unused dns zones 2026-05-06 14:37:53 +02:00
021843b5ce
migrate reverse dns zones to new auth-dns server 2026-05-06 14:33:04 +02:00
5283d2da95
improve knot roles reloading behavior
With this change, the nameserver is not restarted on configuration
updates but only reloaded instead.
2026-05-06 14:33:04 +02:00
3aa146d723
nftables(role): reload instead of restart
This should make the role more robust against misconfigurations.
2026-05-06 14:19:38 +02:00
46b0a49eb8
migrate dns zone eh22.easterhegg.eu to new auth-dns server 2026-05-06 12:34:23 +02:00
d535607ae6
migrate dns zone eh20.easterhegg.eu. to new auth-dns server 2026-05-06 12:31:55 +02:00
04a6c685d1
migrate dns zone hamburg.ccc.de. to new auth-dns server 2026-05-06 12:17:51 +02:00
fa021fb737
migrate dns zone ccchh.net. to new auth-dns server 2026-05-06 12:12:54 +02:00
9100523045
remove obsolete auth-dns compose file 2026-05-06 11:59:51 +02:00
416ca85b11
rename auth_dns -> knot role 2026-05-06 11:52:33 +02:00
8c1553c707
fix role name auth-dns -> auth_dns 2026-05-06 11:47:10 +02:00
9ca4eb14e1
configure hh.ccc.de on auth-dns 2026-05-06 11:47:10 +02:00
c0a09cd299
add old zones from ns-intern 2026-05-06 11:47:10 +02:00
6fa2d65db2
enable auth-dns role to actually configure useful zones 2026-05-06 11:47:10 +02:00
becee70ab9
disable systemd-resolved on auth-dns 2026-05-06 11:47:10 +02:00
fa94d59df6
add barebones knot config
This configuration does not yet do much but it provisions a knot
server that runs.
2026-05-06 11:47:10 +02:00
adc3400177
mute ansible discovered interpreter warning 2026-05-06 11:44:41 +02:00
d880eb8677
fix systemd-resolved not being installed
closes CCCHH/ansible-infra#88
2026-05-03 16:50:45 +02:00
c304a1c82a
add README.md to deploy_systemd_resolved_config role 2026-05-02 01:01:23 +02:00
58ced1a85e
add capability to disable systemd-resolved to base_config role 2026-05-01 00:16:43 +02:00
d9fc1ef401
add host auth-dns.hamburg.ccc.de 2026-04-29 21:24:59 +02:00
69fcd2691e
clarify some docs 2026-04-29 21:24:50 +02:00
5d16c7781c
Revert "deploy alerta on grafana.hosts.hamburg.ccc.de"
This reverts commit b10d7d1592.
2026-04-29 19:05:15 +02:00
b6cec3ad61
public-reverse-proxy(host): use new public-web-static hostname
public-web-static got moved to a new network and has a new hostname as
well as new addresses now, so use that.
2026-04-28 23:31:41 +02:00
d7811f249a
diday-staging-runner(host): deploy host runner for diday staging deploy 2026-04-28 20:12:27 +02:00
b10d7d1592
deploy alerta on grafana.hosts.hamburg.ccc.de 2026-04-24 19:05:08 +02:00
5242a14eed Update to newest version 2026-04-24 17:42:51 +02:00
0330c6b6ca
reduce ansible grafana log verbosity by using loop_control labels 2026-04-24 15:32:43 +02:00
2c1f95df9a
add documentation about how one commits DNS zones on ns-intern 2026-04-24 15:31:54 +02:00
1715b4fc88 stb hat IPv6 zu Hause geändert 2026-04-23 12:24:25 +02:00
ec4dd36178
dooris(host): move to dns-01-acme-dns 2026-04-19 23:48:11 +02:00
26fbbc9035
sops: use fis new key 2026-04-19 00:36:37 +02:00
1d2d03e4b3
status(host): add monitoring for (www./staging.)c3dog.de 2026-04-11 20:53:57 +02:00
f4c9d203da
public-reverse-proxy(host): add config for staging.c3dog.de 2026-04-11 20:53:57 +02:00
abcd622757
light(host): move to dns-01-acme-dns 2026-04-11 04:34:24 +02:00
8630efeca6
keycloak(host): set specific Keycloak version as image also has it now 2026-04-05 01:02:37 +02:00
230da323dc
public-reverse-proxy(host): add config for docs.c3voc.de and staging 2026-04-04 15:39:33 +02:00
3f94a992fe
ntfy-alertmanager: edit msg when alert resolve's 2026-04-03 17:41:24 +02:00
28d154edcd Update docker.io/xenrox/ntfy-alertmanager Docker tag to v1 2026-04-03 13:16:18 +00:00
7b03059440
public-reverse-proxy(host): add config for c3dog.de 2026-04-03 15:08:02 +02:00
aa28d30e8d Update docker.io/library/redis Docker tag to v8 2026-04-02 09:30:51 +00:00
8945b86c85
tickets(host): update postgresql image from version 15 to 18 2026-04-02 11:24:42 +02:00
db8dfac07a Update docker.io/pretix/standalone Docker tag to v2026 2026-04-01 23:47:03 +00:00
8e5b0083b3
fix docker compose services not coming up after reboot
Fix the issue by adding missing restart configuration to docker compose
deployments.
2026-04-02 01:16:08 +02:00
7a9929c66d Version bump 2026-04-01 09:10:05 +02:00
0df667fc58
keycloak(host): update postgresql image from version 15 to 18 2026-04-01 02:19:13 +02:00
34958a0584
pad(host): update postgresql image from version 15 to 18 2026-04-01 01:51:22 +02:00
6bc872f1c0
pretalx(host): move to dns-01-acme-dns as http-01 failed for cfp.eh22 2026-03-31 17:51:06 +02:00
73ed238a28
sunders(host): move to dns-01-acme-dns 2026-03-31 16:59:02 +02:00
8bf6dfbefb
certbot(role): support DNS-01 certs using acme-dns
Introduce new configuration structure called certbot__certs, which
allows for different challenge types per cert with the first challenge
type supported being dns-01-acme-dns.
2026-03-31 16:48:00 +02:00
21f51ea2d7
z9(hosts): setup ansible-pull for all z9 hosts 2026-03-30 21:55:44 +02:00
66830eaf30 Update all stable non-major dependencies 2026-03-28 01:01:38 +00:00
904c50c17c
fux alert: set for to 2min 2026-03-10 21:45:52 +01:00
242746bcbd
alerts-fux: add alert for blackbox exporter probes 2026-03-09 21:14:26 +01:00
e961886972
pad(host): set session secret, so users won't be logged out on restart
Closes #74
2026-03-09 21:09:08 +01:00
c246a6815c
ansible-lint: fix issues 2026-03-06 21:27:51 +01:00
9b092d0daf Update all stable non-major dependencies 2026-03-06 20:16:48 +00:00
2b5f261cd3
docker(role): move automatic cleanup of unused Docker data here
Move the automatic cleanup of unused Docker data to the docker role from
the docker_compose role, so that hosts, which only use Docker (like
renovate) also have an automatic cleanup set up.
Also use a systemd timer instead of cron.
2026-03-06 21:09:47 +01:00
0788fde69d only allow sops encryption of *.sops.* files 2026-03-06 20:21:33 +01:00
f345ff5e00
renovate: make exclusion of CalVer non-patch/-minor upgrades work
Pretix and Pretalx both use CalVer, so we don't want to have upgrades to
their second number be identified as minor updates and get grouped with
all the other minor and patch updates.
The regex to re-classify the second number as major doesn't work.
Probably because of:
"Important: all capture groups must contain only purely numeric values."
(https://docs.renovatebot.com/modules/versioning/regex/)
So instead match on the minor update type for Pretix and Pretalx and set
the group name to null.
2026-03-06 19:53:24 +01:00
e98f6d68bd
Revert "wip: test renovate"
This reverts commit 05d8c39b75.
Doesn't work.
2026-03-06 19:15:55 +01:00
4f3caaf5ed
add bitwhisker to sops 2026-03-05 20:18:53 +01:00
05d8c39b75
wip: test renovate 2026-03-05 15:26:51 +01:00
fee18bd349
certbot(role): allow empty list of certificate domains
Also explicitly document that they are used with the HTTP-01 challenge.
This is in preparation for adding a new option with DNS-01 challenge
support.
2026-03-05 14:37:17 +01:00
3820a97584
certbot(role): move arguments documentation into README
Do this to match how it's done in newer roles.
2026-03-05 14:37:17 +01:00
0331c77d55
grafana: fuxnoc macht mehr internet mit ipv6 2026-03-01 21:32:10 +01:00
711f2f1c64
certbot(role): don't use certbot__version_spec anymore as its not used 2026-03-01 20:08:49 +01:00
165487884c
setup reverse-proxying for *.staging.diday.org 2026-02-27 21:51:09 +01:00
bc9e76b8ed
remove did.hamburg.ccc.de from public-reverse-proxy 2026-02-27 21:51:09 +01:00
983584a510
configure reverse proxy map explicitly for hostnames 2026-02-27 21:51:09 +01:00
7ca446457a
onlyoffice: support custom fonts and add di.day fonts 2026-02-26 23:13:30 +01:00
fcc0d615a7
configure diday.org on public-reverse-proxy 2026-02-26 18:01:52 +01:00
41dc9c8529
configure www2 nginx 2026-02-26 17:44:24 +01:00
3e3cedd357
add www2 and www3 hosts 2026-02-24 19:09:20 +01:00
ac013ca8a1 Fix template syntax 2026-02-22 18:37:16 +01:00
08101ccef1 Fix permission 2026-02-22 18:37:01 +01:00
7a1ea7d40e Override base.html template to brand site 2026-02-22 18:22:12 +01:00
d26fbf2577 Allow syncing an arbitrary set of files to the target 2026-02-22 18:21:47 +01:00
a3c514d18d Ignore pycaches 2026-02-22 18:21:15 +01:00
bb06f21c53
configure diday website deployment 2026-02-18 11:57:21 +01:00
e823c46a2d stb updated key 2026-02-18 09:51:25 +01:00
910655adfb Explain how to update GPG keys 2026-02-18 09:34:27 +01:00
5f31392a27 Remove authoritative-dns as its not needed anymore 2026-02-11 10:38:04 +01:00
fe647da3bf
mjolnir: deploy mjolnir using docker compose
Moving from mjolnir from nix-infra to ansible-infra.
Also using native encryption now instead of the deprecated pantalaimon
and having protectAllJoinedRooms set to true for easier and quicker
usage.
2026-02-11 03:10:43 +01:00
db70d666d1
vscode settings: exclude vendored collections and roles from search 2026-02-09 19:53:27 +01:00
7b8dab07b6
distribution_check(role): remove role as it's not really needed
As the roles are used internally only anyway, we don't need to specify
compatbilities like this and don't properly use it anyway.
2026-02-09 17:49:49 +01:00
2f67cb875d
status(host): rotate age key 2026-02-09 17:43:25 +01:00
2350710177 Use new entry after acmedns db reset 2026-02-08 18:38:37 +01:00
3086c2b60c Use new name for sqlite driver 2026-02-08 14:19:02 +01:00
196f1d70cf downgrade acme-dns to v1.0 2026-02-08 11:37:14 +01:00
f6c15773e1
ansible-lint: add collections and roles directories to excluded paths 2026-02-06 22:27:18 +01:00
2aed20393f Vendor Galaxy Roles and Collections 2026-02-06 22:07:16 +01:00
c1e1897cda
grafana: more alertmanager config 2026-02-06 17:17:26 +01:00
17ba7c04f2
acmdns(host): expose and monitor health endpoint 2026-02-01 23:14:15 +01:00
536eedeffc
status(host): add monitoring for ACME DNS 2026-02-01 22:44:42 +01:00
397285655b
status(host): add monitoring for spaceapi.ccc.de 2026-02-01 21:38:57 +01:00
8e75f1ad14
status(host): add monitoring for cpu.ccc.de and aliases 2026-02-01 21:30:40 +01:00
c3b20abab3
status(host): use custom alert for Matrix to make it work with PAT
The Personal Access Token we use isn't compatible with the default
Matrix alerting provider, so use a custom alert.
2026-02-01 20:49:33 +01:00
9c2fe5ea9b
public-reverse-proxy(host): remove cpuccc.hamburg.ccc.de alias 2026-01-28 15:32:29 +01:00
06ae220857 Remove spaceapiccc.hamburg.ccc.de 2026-01-27 22:35:28 +01:00
1f2a08cf15 Spell stuff correctly 2026-01-27 20:16:57 +01:00
2e5b0ab940
nginx(role): to not log IPs, just disable the access log 2026-01-27 18:18:17 +01:00
3bba747dab Configure seperate server for spaceapi.ccc.de 2026-01-27 16:30:00 +01:00
b90a57ffb0 Merge branch 'main' of git.hamburg.ccc.de:CCCHH/ansible-infra 2026-01-27 16:21:20 +01:00
ad783e4a15 now in production 2026-01-27 16:21:18 +01:00
200e8019ed
public-reverse-proxy: add config for local/lokal.ccc.de
local/lokal.ccc.de points to cpu.ccc.de.
2026-01-27 15:49:38 +01:00
4f0c4bb276 Explain need to re-encrypt after adding a host 2026-01-27 09:47:01 +01:00
3abc375984 Re-encrypt for spaceapiccc 2026-01-27 09:46:47 +01:00
c8edde4d11 Pretty up 2026-01-26 00:20:27 +01:00
ca20721f04
add missing grafana.grafana collection dependency 2026-01-25 23:55:57 +01:00
42b23eb181
get collections from repos directly instead of using Ansible Galaxy
As Ansible Galaxy is currently down, switch to using the repos directly.
This avoids reliancy on Ansible Galaxy in the future as well.
2026-01-25 23:55:48 +01:00
0f3cd2c70a amcedns to enable Let's Encrypt DNS-01 challenges 2026-01-25 22:41:42 +01:00
c33ae36af3 Enable IPv6 by default 2026-01-25 22:40:36 +01:00
2cd0811b29 Fix warning 2026-01-25 22:40:36 +01:00
6a92aa68c1
light: fix tls cert expiring and not renewing 2026-01-25 22:36:30 +01:00
5693989c38
add alloy to the z9 hosts and some cleanup 2026-01-25 21:44:49 +01:00
c7d51af5b4
rollout Alloy to replace prometheus_node_exporter
With the new network we need to deploy a push based solution in order to get metrics into prometheus
2026-01-25 21:44:49 +01:00
995dbb06e2
wip: alloy 2026-01-25 21:44:49 +01:00
11779ab21d
grafana: get alertmanager to be more chill
a bit of help to deal with alert fatigue
2026-01-25 21:41:20 +01:00
8f7990acc0
docs: add ansible_pull_hosts to the desired minimum roles/groups 2026-01-25 21:17:28 +01:00
c6c0272448
docs: add section on conf. monitoring with Gatus (status.hamburg.ccc.de) 2026-01-25 21:16:38 +01:00
1523b15952
docs: improve formatting and wording a bit to make things clearer 2026-01-25 21:11:07 +01:00
a5d291cea8
spaceapiccc(host): setup ansible-pull 2026-01-25 20:58:57 +01:00
652aa32e21
docker_compose(role): document new build and pull arguments 2026-01-25 20:49:39 +01:00
0939771d08
public-reverse-proxy(host): add entries for cpu.ccc.de 2026-01-25 20:22:44 +01:00
c285694aaa Add age private key 2026-01-25 15:47:41 +01:00
d35f1cc779 GPG must be installed for the docker role to be able to add the repo 2026-01-25 15:31:42 +01:00
cee1fe970a Add spaceapiccc as a replacement for erfafoo 2026-01-25 14:03:54 +01:00
0c782caee7 Explain what all needs to be added for a new host 2026-01-25 14:03:34 +01:00
f887de25c5 make building and pulling configurable 2026-01-25 13:26:20 +01:00
664b9115b8 Fix warning 2026-01-25 13:01:52 +01:00
b492472179 Explain how to add age key for ansible pull 2026-01-25 12:12:30 +01:00
ddaa069204
status(host): configure Gatus to store more results and events
Also see:
https://github.com/TwiN/gatus?tab=readme-ov-file#storage
2026-01-18 21:39:23 +01:00
fi
28f80a85f3 status(host): Switch to nekover.se user for personal token
As access token now apparently expire with matrix authentication services,
use a nekover.se user where we can get a long-lived personal token.
2026-01-18 19:49:59 +01:00
d514688574
systemd_networkd(role),router(host): support global config to fix forw.
With the router upgrade to Debian 13 the systemd version got upgraded as
well breaking the current configuration for IP forwarding.
Add a variable for global systemd-networkd configuration and use that to
enable IPv4 and IPv6 forwarding on the router.

The systemd_networkd role could be a bit nicer, not deploying/deleting
the global configuration, if the variable is empty and
reloading/restarting systemd-networkd at appropriate times. But as is
works for now.
2026-01-18 19:21:33 +01:00
d7b463ecb9
status(host): fix token not working by using a new one 2026-01-18 04:54:31 +01:00
0b6847493c Update actions/checkout action to v6 2026-01-18 03:30:42 +00:00
744dc00ae5 Update https://github.com/ansible/ansible-lint action to v26 2026-01-18 03:01:35 +00:00
fe52127e82
status(host): configure external status page and uptime monitoring host 2026-01-18 01:26:52 +01:00
51bbdd42a2
dooris(host): make certbot work 2026-01-13 16:55:22 +01:00
428b5c70bc
pretalx(host): roll back to pretalx v2025.1.0 for celery as well 2026-01-13 14:19:57 +01:00
92601ab9ea
renovate: add package rule for pretalx reclassifying major updates
So that v2025.1.0 to v2025.2.2 counts as a major, not a minor, update.
2026-01-13 03:48:34 +01:00
3e0fdfa8de
pretalx(host): roll back to pretalx v2025.1.0 as v2025.2.2 doesn't work 2026-01-13 03:43:28 +01:00
951ec7ebcd
netbox(role): fix oidc integration by no longer using is_staff
is_staff got removed in 4.5.0.
See: https://github.com/netbox-community/netbox/releases/tag/v4.5.0
2026-01-13 02:25:06 +01:00
a92e144cfc
base_config(role): ensure base set of admin tools is installed
See:
https://git.hamburg.ccc.de/CCCHH/nix-infra/src/branch/main/config/common/admin-environment.nix
2026-01-13 00:41:06 +01:00
c638790819 Update all stable non-major dependencies 2026-01-12 02:30:47 +00:00
70461c98ba
first run ansible_pull for router, then for all other hosts
Do this to avoid a restarting router affecting playbook runs on other
hosts.
2026-01-12 03:29:06 +01:00
968e29ccb8
do v6-only for internal proxy protocol communication
Since we want to do v6-only internally, only listen on v6 for proxy
protocol.
This is also needed as we only have set_real_ip_from pointing to a v6.
2026-01-12 03:02:09 +01:00
255327952e
ntfy(host): move to new network and hostname 2026-01-11 03:57:11 +01:00
1971598e71
pretalx(host): move to new network and hostname 2026-01-11 03:23:18 +01:00
372f264bcb
ccchoir(host): move to new network and hostname 2026-01-11 03:23:14 +01:00
2fbb37db18
grafana(host): move to new network and hostname 2026-01-11 03:23:01 +01:00
bb30e88404
router(host): allowlist only certain icmpv6 types 2026-01-11 00:29:16 +01:00
a41b07949c
zammad(host): move to new network and hostname 2026-01-11 00:22:37 +01:00
ff550cbd8a
tickets(host): move to new network and hostname 2026-01-11 00:00:18 +01:00
49e3ecb986
netbox(host): move to new network and hostname 2026-01-09 03:05:29 +01:00
a622f21b54
renovate(host): move to new network and hostname 2026-01-07 18:46:27 +01:00
40b67c6bc3
sunders(host): move to new network and hostname 2026-01-07 18:46:16 +01:00
fbd3ea5496
base_config: disable cloud-init ssh module to avoid hostkey regeneration
It should run once on first boot anyway and since it apparently runs for
every change in the Proxmox cloud init config, disable it, so it
doesn't, since it's annoying to have "random" hostkey changes.
2026-01-07 18:09:48 +01:00
80ddb2efc9
router: enable a DHCP server for the v4-NAT network as well
As the hosts don't really need a static v4, just do DHCP.
2026-01-07 17:25:27 +01:00
a328e92971 Should be compatible with trixie/13 2026-01-03 14:03:26 +01:00
25db54b8ad Make sure pip is installed 2026-01-03 14:02:56 +01:00
944c8cde82
onlyoffice(host): move to new network and hostname 2025-12-17 03:34:39 +01:00
366456eff8
keycloak(host): move to new network and hostname
Also just listen on port 8443 for keycloak-admin proxy protocol.
2025-12-16 21:50:40 +01:00
1ca71a053e
pad(host): move to new network and hostname 2025-12-16 21:12:21 +01:00
b9add5bda3
cloud(host): set correct new proxy protocol reverse proxy ip 2025-12-16 20:59:15 +01:00
570600fce3
eh22-wiki(host): move to new network and hostname 2025-12-16 20:58:05 +01:00
5a476f2103
cloud(host): move to new network and hostname 2025-12-16 20:47:44 +01:00
b72dee0d6d
wiki(host): actually have nginx listen on v6 2025-12-16 19:52:24 +01:00
8b94a49f5e
wiki(host): move to new network and internal hostname 2025-12-16 19:23:33 +01:00
5f98dca56c
router(host): expose public v6 networks
Also prepare for exposing public v4 networks later.
2025-12-16 19:03:36 +01:00
66ee44366b public-reverse-proxy: New IP of wiki VM 2025-12-14 15:39:03 +01:00
183b91b9f2
router(host): add nftables config for basic router functionality 2025-12-13 22:07:38 +01:00
d0618e3820
nftables(role): introduce role for deploying nftables 2025-12-13 22:07:37 +01:00
a9e394da06
router(host): add systemd-networkd-based network config 2025-12-13 22:07:37 +01:00
d6ba70523c
systemd_networkd(role): introd. role for deploy. systemd-networkd config 2025-12-13 22:07:35 +01:00
766aa125c4
router(host): introduce router 2025-12-13 22:07:07 +01:00
c39cb0e390
we dont need to set a specific alloy version 2025-12-06 22:11:53 +01:00
df3710f019
grafana: set alloy to version v1.11.3
1.12.0 is buggy
2025-12-02 22:55:29 +01:00
0eaaf9227c Update all stable non-major dependencies 2025-11-19 13:30:39 +00:00
ddab157600
don't pin digests anymore
The benefit of digest pinning isn't that great for this project really
and it comes at the cost of more issues and additional renovate noise,
so just don't anymore.
Adjust renovate config accordingly as well.
2025-11-18 14:24:21 +01:00
80acd5fdc6
grafana: store date for up to 28 days 2025-11-11 23:03:59 +01:00
5f6000adca
ssh_config: also enable sntrup761x25519-sha512 for Debain 13
tldr: PQC algorithms are complex but sntrup still is not brocken
2025-11-11 22:47:42 +01:00
6fea98ffd2 Redirect to 39c3 instead of eh22 2025-11-07 20:09:02 +01:00
63917722ff
fix foobazdmx role
poetry is available via apt now so we install it that way
2025-11-06 21:19:20 +01:00
aeec08fce8
remove distribution checks
Signed-Off-By: june
2025-11-06 21:16:42 +01:00
cffe5c2b16
dooris: use hostname instead of IP 2025-11-06 18:25:29 +01:00
d690f81e3d
deploy_ssh_server_config: setup ssh pq cryptography 2025-11-05 23:08:28 +01:00
ae60d6fea6
docker_compose(role): use community.docker.docker_compose_v2 module
Use the community.docker.docker_compose_v2 module as it supports proper
changed handling out of the box, making the roles code more
straightforward and work. Also just do a docker compose restart instead
of having the custom docker compose reload script.

https://docs.ansible.com/ansible/latest/collections/community/docker/docker_compose_v2_module.html
2025-11-02 23:13:20 +01:00
9f8d2d89cd
docker_compose(role): move argument documentation to README
Do this to match newer roles and since reading documentation from
argument_specs is quite unergonomic.
2025-11-02 22:32:20 +01:00
e390b7c202
docker_compose(role): remove unnecessary hosts section from README
The hosts section isn't really relevant for that role, so remove it.
2025-11-02 22:32:20 +01:00
8cefd07618
docker_compose(role): remove distribution check
The distribution check isn't really needed in our setup anyway and just
adds unnecessary noise.
2025-11-02 22:32:20 +01:00
c3f71b1f08 sunders: replace password in healthcheck with dynamic secret
CCCHH/ansible-infra#55

Co-authored-by: ViMaSter <vincent@mahn.ke>
Co-committed-by: ViMaSter <vincent@mahn.ke>
2025-11-02 20:24:55 +01:00
dc6c7cbfb7
sunders(host): deploy sunders using docker compose
https://git.hamburg.ccc.de/CCCHH/sunders
2025-11-01 17:53:08 +01:00
a11ccaf16c
disable digest pinning for our images, since Forgejo cleans them up
Since Forgejo seems to clean up older tag versions, so older digests,
disable digest pinning for our images.
While generally resulting in undeployable config, with ansible-pull the
breakage is especially noticeable.
2025-10-30 05:50:42 +01:00
0f4fb68c97
netbox(role): don't try to deploy removed housekeeping service and timer
https://github.com/netbox-community/netbox/releases/tag/v4.4.0
https://github.com/netbox-community/netbox/issues/18349
2025-10-30 05:25:26 +01:00
ea5b4b8d69 Update dependency netbox to v4.4.5 2025-10-30 04:17:13 +00:00
23ea666906
renovate(role): always pull and use full image source
Ensure we're always running the latest Renovate version.
2025-10-30 05:13:23 +01:00
f7918e7b6f
add renovate comment for custom regex matcher to inventory version vars 2025-10-30 05:01:02 +01:00
83fd868977
docker(role): use full image sources 2025-10-30 04:49:44 +01:00
a979fccd12
renovate: add custom regex manager for inventory vars dependencies
Inspiration taken from/documentation:
https://docs.renovatebot.com/presets-customManagers/#custommanagersdockerfileversions
https://docs.renovatebot.com/modules/manager/regex/
2025-10-30 04:47:10 +01:00
a03ed9a362 Update all stable non-major dependencies 2025-10-29 23:45:38 +00:00
01890fecbd Update all digest updates 2025-10-29 00:30:36 +00:00
df32e1cac8
zammad(host): move to latest upstream compose file version (v14.1.1)
It hopefully fixes bugs we had in the past, so removing the workarounds
and it also comes with default values now, so removing all variables set
to those defaults.
2025-10-24 22:57:03 +02:00
747e5b2d4c
zammad(host): change to .env configuration
Align the compose.yaml to upstreams v11.2.0 version.
This is a first step to hopefully then just use the upstreams version
directly and not vendor it.
2025-10-24 22:15:48 +02:00
3840553f9d
docker_compose(role): add support for deploying optional .env file
This is needed for situations, where one wants to use a vendor-provided
compose file and configure it using environment variables.
Like for example:
https://github.com/zammad/zammad-docker-compose
2025-10-24 22:05:54 +02:00
839a9b2c0a
renovate: group all digest updates together
https://docs.renovatebot.com/presets-group/#groupalldigest
2025-10-24 19:59:35 +02:00
37cedb1ad0
renovate: label all PRs with the "renovate" label 2025-10-24 19:28:49 +02:00
658a50d19b
renovate: use rebase stale PRs preset to rebase once base branch updated
Use this configuration to always have the fast-forward option.

https://docs.renovatebot.com/presets-default/#rebasestaleprs
2025-10-24 19:18:04 +02:00
b2961c5664
renovate: disable rate-limiting 2025-10-24 18:59:58 +02:00
a13d23c7ea Update actions/checkout action to v5 2025-10-23 13:45:41 +00:00
2f8897751b Pin dependencies 2025-10-23 12:15:38 +00:00
a60946b3b8 Update https://github.com/ansible/ansible-lint action to v25 2025-10-22 21:50:08 +00:00
8f612d1d9c
renovate: add persistent volume for base (and therefore cache) dir 2025-10-22 19:42:20 +02:00
d0d517d97d
renovate: add custom package rule for pretix calendar versioning
Add custom package rule accounting for pretix calendar versioning to not
have Renovate classify month updates as minor version updates, but major
version updates instead.
2025-10-22 16:42:02 +02:00
78a6be6f5d
renovate: disable semantic commits 2025-10-22 00:47:05 +02:00
43fac32424
use full image source and set version for all Chaosknoten compose images
Use a full image source and set and explicit version for all images in
Chaosknoten (docker-)compose files.
With Renovate now set up, it is feasible to explicitly set versions.
2025-10-21 23:59:56 +02:00
282e82728b
renovate: match file compose jinja2 templates (.j2) as well 2025-10-21 23:12:34 +02:00
f842723e9a
remove daily schedule for Renovate (for now?) 2025-10-21 23:03:02 +02:00
7de516dc43
introduce first Renovate configuration
Introduce pretty basic first Renovate configuration with a package rule
for grouping all stable non-major dependency updates together.
2025-10-21 02:37:10 +02:00
94e1920388
setup ansible-pull for all Chaosknoten hosts
Additionally setup ansible-pull for: ccchoir, tickets, keycloak, lists,
mumble, pad, public-reverse-proxy, zammad, ntfy
2025-10-20 21:25:56 +02:00
f3902b43b1
update keycloak and nextcloud 2025-10-20 21:11:28 +02:00
425d302fa9
zammad(host): fix compose by using different elasticsearch image
Also execute manual update steps as outlined here:
https://github.com/zammad/zammad-docker-compose/releases/tag/v14.0.0

Note that this is updating only a part of the compose file and other
parts still are out-of-date and should be updated (like the Postgres).
2025-10-20 01:36:00 +02:00
b46747d251
deploy_ssh_server_config(role): add Debian 13 sshd_config reference 2025-10-17 21:27:29 +02:00
2aa55770d9
renovate(host): update keys adding renovate for group_vars/all.sops.yaml 2025-10-17 16:05:04 +02:00
8a8fdf5f97
renovate(host): set platform to forgejo 2025-10-17 01:26:18 +02:00
cad2f036e5
renovate(host): replace non-working GitHub token with working one
Replace the token with one created from a new CCCHH GitHub service
account.
2025-10-17 01:18:17 +02:00
4b1c64b615
renovate(host): remove deprecated and no longer working logLevel option
Remove deprecated and no longer working logLevel config option. Debug
output can be enabled by using the LOG_LEVEL environment variable on
demand.
2025-10-16 18:08:29 +02:00
e76c66d74c
renovate(host): set up Renovate using role and exisiting config
Set up Renovate using role and existing config from current
Forgejo/GitHub Actions-based deployment.
2025-10-16 17:52:30 +02:00
a32998d8da
renovate(host): initialize renovate host 2025-10-16 17:44:23 +02:00
8388657d33
renovate(role): introduce first basic Renovate role
Sets up Renovate using Docker and systemd service and timer to run
regularly.
Also add accompanying host group and playbook play.
2025-10-16 17:42:13 +02:00
dce4e7c4d4
ansible_pull(role): add git as a dependency to ensure is installed 2025-10-16 09:40:34 +02:00
f646cc0bf2
fix creation rules for eh22-wiki, sunders and wiki hosts
Also update the keys of the secret files accordingly.
This should then fix ansible-pull on these hosts.
2025-10-15 10:45:54 +02:00
dea66771e0
ansible_pull(role): ensure SOPS is installed
Also add the SOPS community collection as a requirement for this repo.
2025-10-15 02:33:42 +02:00
9afbc71801
ansible_pull(role): ensure role and collection dependencies are present 2025-10-15 02:18:07 +02:00
1d6d1094bc
setup ansible-pull for 7 more hosts
Setup for: cloud, eh22-wiki, grafana, onlyoffice, pretalx, sunders and
wiki.
2025-10-15 01:59:29 +02:00
eadae7a09b
ansible_pull(role): add failure notifications 2025-10-14 22:20:27 +02:00
17fd71f079
define common msmtp configuration for chaosknoten inventory hosts
Define common configuration as it is the same for all hosts.
2025-10-14 01:45:44 +02:00
afceb886dc
msmtp(role): introduce msmtp role
Introduce msmtp role for setting up msmtp for mail sending.
Also add accompanying host group and playbook play.
2025-10-14 01:40:46 +02:00
18dda95c46
remove max expired key 2025-10-13 22:12:31 +02:00
1f394a08dd
refactor .sops.yaml to make it less verbose
Make it less verbose by introducing an anchor for the admin_gpg_keys.
2025-10-13 20:51:31 +02:00
f943e95e2e
fix ansible_lint issues
Use prefix for role variables, have an ending newline at the end of
files and use changed_when for command.
Also exclude *.sops.yaml files from ansible-lint.
2025-10-13 17:43:00 +02:00
9b8e14f3c4
remove duplicate ansible_pull_hosts inventory group entry 2025-10-13 17:37:13 +02:00
952fbf85c5
ansible_pull(role): add ExecStartPost step rebooting the hosts, if nec.
Add ExecStartPost step rebooting the hosts, if necessary.
2025-10-13 17:23:08 +02:00
bd281713f1
netbox(host): setup ansible_pull for host 2025-10-13 16:59:42 +02:00
648489ed09
define common ansible_pull configuration for chaosknoten inventory hosts
Define common configuration as it should be the same for all hosts, just
the ansible_pull__age_private_key needs to be set per host then.
2025-10-13 16:58:30 +02:00
434ddfc955
ansible_pull(role): introduce ansible_pull role
Introduce ansible_pull role for setting up automatic ansible_pull runs.
Also add accompanying host group and playbook play.
2025-10-13 16:56:18 +02:00
8cb6ab3d04
reboot(role): intro. reboot role, which handles local conns. gracefully
Also use this role instead of plain ansible.builtin.reboot.
This is in preparation for using ansible_pull as we don't want to have
ansible.builtin.reboot fail local playbook runs.
2025-10-13 16:56:18 +02:00
1322bcec58
reverse proxy configuration for element-admin 2025-10-12 20:20:02 +02:00
1eaf85501f
reverse proxy configuration for matrix authentication service 2025-10-12 05:28:43 +02:00
dec68ab994
sunders(host): initialize sunders host 2025-10-11 20:52:26 +02:00
2ae8692603
grafana: set 2m for DHCP check
so that service restart dont create a alert
2025-09-12 13:21:23 +02:00
1355d4d834
grafana: make alerts better for fux 2025-09-09 19:30:53 +02:00
592afdced9 add waybackproxy 2025-09-06 11:39:05 +02:00
3751 changed files with 386390 additions and 3704 deletions

View file

@ -3,4 +3,11 @@ skip_list:
- "name[casing]"
exclude_paths:
- .ansible/
- .forgejo/
- "**/*.sops.yaml"
- ansible_collections/
- collections/
- galaxy_roles/
- docs/
- resources/

View file

@ -0,0 +1,24 @@
on:
pull_request:
types:
- closed
jobs:
cleanup-staging:
runs-on: docker
container:
image: code.forgejo.org/oci/node:22-bookworm
steps:
- name: Pipeline info PR
run: |
echo "Run triggered by ${{ github.event_name }} (${{ github.event.action }}) on ref ${{ github.ref_name }}"
- name: Staging Deployment - Prepare keys
run: |
echo "${{ secrets.SSH_DEPLOY_KEY }}" > deploykey.priv
chmod 400 deploykey.priv
echo "${{ vars.SSH_KNOWN_HOSTS }}" > ./known_hosts
- name: Staging Deployment - Remove PR from staging
run: |
ssh -i deploykey.priv -o 'UserKnownHostsFile ./known_hosts' infra-docs-deploy@public-web-static.hosts.hamburg.ccc.de -t "rm -r /var/www/staging.infra-docs.hamburg.ccc.de/pr${{ github.event.pull_request.number }}/"

View file

@ -0,0 +1,75 @@
on:
push:
branches:
- main
pull_request:
env:
TZ: Europe/Berlin
jobs:
build:
runs-on: docker
container:
image: docker.io/library/python:3.14-trixie
steps:
- name: Pipeline info
run: |
echo "Run triggered by ${{ github.event_name }} (${{ github.event.action }}) on ref ${{ github.ref_name }}"
- name: Install packages
run: |
apt update
apt -y install nodejs git rsync openssh-client
pip install --upgrade pip
- uses: actions/checkout@v7
- name: Install Python packages
run: |
pip install -r docs_requirements.txt
- name: Build website - prod
if: github.event_name != 'pull_request'
run: |
mkdocs build
- name: Build website - staging
if: github.event_name == 'pull_request'
run: |
sed -i "s#site_url: https://infra-docs.hamburg.ccc.de#site_url: https://staging.infra-docs.hamburg.ccc.de/pr${{ github.event.pull_request.number }}/#" mkdocs.yml
mkdocs build
- name: Deploy - Prepare keys
run: |
echo "${{ secrets.SSH_DEPLOY_KEY }}" > deploykey.priv
chmod 400 deploykey.priv
echo "${{ vars.SSH_KNOWN_HOSTS }}" > ./known_hosts
- name: Deploy - Upload PR to staging
if: github.event_name == 'pull_request'
run: |
echo "Deploying to staging.infra-docs.hamburg.ccc.de/pr${{ github.event.pull_request.number }}"
rsync -v -r --delete -e "ssh -i deploykey.priv -o 'UserKnownHostsFile ./known_hosts'" site/ infra-docs-deploy@public-web-static.hosts.hamburg.ccc.de:/var/www/staging.infra-docs.hamburg.ccc.de/pr${{ github.event.pull_request.number }}/
- name: Deploy - Add comment to PR with staging URL
if: github.event_name == 'pull_request' && github.event.action == 'opened'
run: |
curl \
-X POST \
${{ github.event.pull_request.base.repo.url }}/issues/${{ github.event.pull_request.number }}/comments \
-H "Content-Type: application/json" \
-H "Authorization: token $FORGEJO_TOKEN" \
--data '{ "body": "You can view your changes at https://staging.infra-docs.hamburg.ccc.de/pr${{ github.event.pull_request.number }}/" }'
- name: Deploy - Upload to prod
if: github.event_name != 'pull_request'
run: |
rsync -v -r --delete -e "ssh -i deploykey.priv -o 'UserKnownHostsFile ./known_hosts'" site/ infra-docs-deploy@public-web-static.hosts.hamburg.ccc.de:/var/www/infra-docs.hamburg.ccc.de/
- uses: actions/upload-artifact@v3
if: github.event_name == 'pull_request'
with:
name: docs-build
path: site/
retention-days: 3

View file

@ -10,7 +10,7 @@ jobs:
name: Ansible Lint
runs-on: docker
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
- name: Install pip
run: |
apt update
@ -24,7 +24,7 @@ jobs:
# work in our environmnet.
# Rather manually setup python (pip) before instead.
- name: Run ansible-lint
uses: https://github.com/ansible/ansible-lint@v24.10.0
uses: https://github.com/ansible/ansible-lint@v26.6.0
with:
setup_python: "false"
requirements_file: "requirements.yml"

3
.gitignore vendored
View file

@ -1 +1,4 @@
.ansible/
**/__pycache__
**/.DS_store

View file

@ -1,226 +1,295 @@
keys:
- &admin_gpg_djerun EF643F59E008414882232C78FFA8331EEB7D6B70
- &admin_gpg_stb F155144FC925A1BEA1F8A2C59A2A4CD59BFDC5EC
- &admin_gpg_jtbx 18DFCE01456DAB52EA38A6584EDC64F35FA1D6A5
- &admin_gpg_yuri 87AB00D45D37C9E9167B5A5A333448678B60E505
- &admin_gpg_june 057870A2C72CD82566A3EC983695F4FCBCAE4912
- &admin_gpg_haegar F38C9D4228FC6F674E322D9C3326D914EB9B8F55
- &admin_gpg_dario 5DA93D5C9D7320E1BD3522C79C78172B3551C9FD
- &admin_gpg_echtnurich 8996B62CBD159DCADD3B6DC08BB33A8ABCF7BC4A
- &admin_gpg_max 9DFA033E3DAEBAD7FDD71B056C7AAA54BE05F7BA
- &admin_gpg_c6ristian B71138A6A8964A3C3B8899857B4F70C356765BAB
- &admin_gpg_lilly D2E9C0807BF681F5E164DAFC5EE1B61CD90954CD
- &admin_gpg_langoor 878FEA3CB6A6F6E7CD80ECBE28506E3585F9F533
admins: &admin_keys
pgp: &admin_pgp_keys
- &admin_pgp_djerun EF643F59E008414882232C78FFA8331EEB7D6B70
- &admin_pgp_stb 21C9579E6503CA815A68ABD8541F9408A813C8B7
- &admin_pgp_fi 9633412309CCB83BFA39BA5F2FEF746201D7FCFE
- &admin_pgp_june 057870A2C72CD82566A3EC983695F4FCBCAE4912
- &admin_pgp_haegar F38C9D4228FC6F674E322D9C3326D914EB9B8F55
# - &admin_pgp_dario 5DA93D5C9D7320E1BD3522C79C78172B3551C9FD # expired
- &admin_pgp_echtnurich 8996B62CBD159DCADD3B6DC08BB33A8ABCF7BC4A
- &admin_pgp_c6ris B71138A6A8964A3C3B8899857B4F70C356765BAB
- &admin_pgp_lilly D2E9C0807BF681F5E164DAFC5EE1B61CD90954CD
- &admin_pgp_langoor 878FEA3CB6A6F6E7CD80ECBE28506E3585F9F533
- &admin_pgp_bitwhisker 41FFAF3D519CF5C039FBD8414BCC213729AF0E49
age: &admin_age_keys
- &admin_age_jtbx ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIBQgnQAq6FUSDK8bxtYPjx3oRCAKG+xy9J3Gas2ztJk
- &admin_age_c6ris age1yubikey1qv7jkffslarpma2fxjm9gnq43xfvwdws0m6y3u58h033edwdyg0uzt8jl5n
hosts:
chaosknoten:
age: &host_chaosknoten_age_keys
- &host_netbox_ansible_pull_age_key age1ss82zwqkj438re78355p886r89csqrrfmkfp8lrrf8v23nza492qza4ey3
- &host_cloud_ansible_pull_age_key age1gdfhx5hy829uqkw4nwjwlpvl7zqvljguzsnjv0dpwz5q5u7dtf6s90wndt
- &host_eh22_wiki_ansible_pull_age_key age13nm6hfz66ce4wpn89fye05mag3l3h04etvz6wj7szm3vzrdlfupqhrp3fa
- &host_grafana_ansible_pull_age_key age1jtusr294t8mzar2qy857v6s329ret9s353y4kuulxwnlyy4dvpjsvyl67m
- &host_onlyoffice_ansible_pull_age_key age1a27euccw8j23wec76ls8vmzp7mntfcn4v8tkyegmg8alzfhk3suqwm6vgv
- &host_pretalx_ansible_pull_age_key age133wy6sxhgx3kkwxecra6xf9ey2uhnvtjpgwawwfmpvz0jpd0s5dqe385u3
- &host_sunders_ansible_pull_age_key age1na0nh9ndnr9cxpnlvstrxskr4fxf4spnkw48ufl7m43f98y40y7shhnvgd
- &host_wiki_ansible_pull_age_key age1sqs05anv4acculyap35e6vehdxw3g6ycwnvh6hsuv8u33re984zsnqfvqv
- &host_renovate_ansible_pull_age_key age18qam683rva3ee3wgue7r0ey4ws4jttz4a4dpe3q8kq8lmrp97ezq2cns8d
- &host_ccchoir_ansible_pull_age_key age19rg2cuj9smv8nzxmr03azfqe69edhep53dep6kvh83paf08zv58sntm0fg
- &host_tickets_ansible_pull_age_key age16znyzvquuy8467gg27mdwdt8k6kcu3fjrvfm6gnl4nmqp8tuvqaspqgcet
- &host_jitsi_ansible_pull_age_key age187zdk64205lx7r83a4m26pfa8hq6khc8sf83k266jasngeq08v3sfqswfg
- &host_keycloak_ansible_pull_age_key age1azkgwrcwqhc6flj7gturptpl2uvay6pd94cam4t6yuk2n4wlnsqsj38hca
- &host_lists_ansible_pull_age_key age17x20h3m6wgfhereusc224u95ac8aj68fzlkkj5ptvs9c5vlz3usqdu7crq
- &host_mumble_ansible_pull_age_key age1wnympe3x8ce8hk87cymmt6wvccs4aes5rhhs44hq0s529v5z4g5sfyphwx
- &host_pad_ansible_pull_age_key age172pk7lyc6p4ewy0f2h6pau5d5sz6z8cq66hm4u4tpzx3an496a2sljx7x5
- &host_public_reverse_proxy_ansible_pull_age_key age1p7pxgq5kwcpdkhkh3qq4pvnltrdk4gwf60hdhv8ka0mdxmgnjepqyleyen
- &host_zammad_ansible_pull_age_key age1sv7uhpnk9d3u3je9zzvlux0kd83f627aclpamnz2h3ksg599838qjgrvqs
- &host_ntfy_ansible_pull_age_key age1dkecypmfuj0tcm2cz8vnvq5drpu2ddhgnfkzxvscs7m4e79gpseqyhr9pg
- &host_spaceapiccc_ansible_pull_age_key age1mdtnk78aeqnwqadjqje5pfha04wu92d3ecchyqajjmy434kwq98qksq2wa
- &host_acmedns_ansible_pull_age_key age16pxqxdj25xz6w200sf8duc62vyk0xkhzc7y63nyhg29sm077vp8qy4sywv
- &host_draupnir_ansible_pull_age_key age1hv7m3xypesdfm0dfzwgctde8v307g9xaunnfu2687y0lagcs5q7s3eg0kj
- &host_diday_staging_runner_ansible_pull_age_key age1522f3qzddm82w63j7ajdkr0khvced6ht7tzp3grvp0j3hewtvesssr5kpf
- &host_auth_dns_ansible_pull_age_key age18zgt4y2sd75hxnpe333zz39048ctxpr0q8a3uqh3jajjkyawsdrq8yg5ve
- &host_forgejo_runner_ansible_pull_age_key age1az0k6cadssk6r8qcqxfr8cyu5mndy59pwt8yqq6w065ew6au4ezsmg2vkf
- &host_forgejo_runner_external_ansible_pull_age_key age1pq1jqrcp3te50xugmv5wst3s9ahj0d38rfktxt43wlcqz7vnwyn3y2h7kyfr6rckrvmuk9m7yvp4efjnfsuxx6d8r9gn222r2eal5593arywrjwrgeypf745wyuvf3z2xk9tm5fgnwckftuvdggk66fph59rw69nt5dpjeewuww4vzt9gs4xelre952s7zjz56qv8tvesg2c89sp8rmy9dvhwfd6tucjhs6sjr6yp2njjra2u6w7c7f0sch3rwkw3wf2dc9su9aaa9q2f22sh5yf0fqejxa2qqpq4pg752589st5xsa5g8tpkjglj4tn35gd4hjj0xet9cjwhydmkmmkffy3nr8zdtctqu6pqsyf7aphvktryez39ru3qe7m6nvr465ffxr0ltvr85nddzxvcwpwpac64nu5tdfrxgjfqzc99vr3zxv8carpsw5evmruqlvrq6v6a4m2cwsz5gqw7nyk3jlj75kp5cnafzjn5dyrf8ppfhp5g5s34zsl7pejmmx2uuudjt7ru2y7as9mtagykrgqgt80fvp3eeh4gsmmd3ujgtp0ranq28aq9x0xdekqh49pfhhprjj6zqdfac5gxtjj736kh5jktc4ls4mjs3p33rzt6ze54uqsfept3qhua2pmugypup6hm6j2ek5sgxjnwvqyfj2l8vz4yfgkaxf699v7jqlwf7g68ang5kzqrjsu78lyardm4zen8zhrr24j334qdgs4zr8dhsfsnmvx9cdvu0swx27tcz8txs46zds9kekgmua7w7fnw3l2lf6zla956ssycac4zjy87rawr4thusxtcqgfzfzh2za9np0s34e5dwkp2l2k06cq09myxqfe7ze6a53d8sl5j43qcekh6kfvl9k0t7903q99pc35630zwm3hwxgnw354du5gngnz56skq9zx3pcnkr5eyh8r8t0dqudmvrrwmxreu6tgrklxw7yvu3zkjgt3gyjhc8kqcrevlukay45sz4k9zqxx9yrs88hzt4h52r2g74alf3cedes3atufy06q4lfq3nxdlnve0kqcwstzr6z6u7fqpqvacezdrr62ycteju6dqawkpthu0drtlxj547htfjcsnrmhgvhskwtuhk6yp7wp30p7qc5vkk8fegg6qx5kc9xs4trx7hj9xgydu7vd30hkceuxsczywjs9v2fl3svkwfypg62882yq6ltv7gfj4ajuy8ezd76g0z7juwspe7q6zs5ceshd6038tvvh2nlpjty6rg6a9qfzhgmjx9s6hynyk7xnq9zra6hxstg8p58x75hapd2mk6rapfunlnnkz5dsxjf4ud4dsvgjfjpzxcdy7sp8dzxtengrsdyu4824mqlw8p63d7m2z4mcyme4tm2qkugtdgrkyphe7akk2geukf6xkfkzd2pkdq5s3qm9fkvfkgrv6yw5kdgjak8xcgesg6tumans4fs8yrxtqlvv2z3emdvwchrjfq4xpzsj27yt4gdg8pknwz9tqpjkjxq6lysutrvwkvt2fwyj8wvv8wtmdl6fk6rsd9kq9a6wkhuq7vvrgwgj3xg2s229sprj4g2vzhy2dfesrp403gs64jqkrjuezwm4zd6uw2x4e2qkj8xqcf7c0zprdzu959x23u878vqqetgpjwt0z3kedt8l6dgpm0rf5dmrya5h3wgzfa0jjvgjphyxgxrwlrzpv4czgal933zs64tn90ks66ejjdaw4t67sch8r3q0kljeqnpdgmw0cpj6arc6k46wcqaccygczy76zt9362vslakvzqqv33tv3sjldp6qxprharmpm9uykgpx66343wuur5xj2aw0rgutpm4ztjzycn3a8d2jq2zpdzwmevezm7mkp9dmndkc3qz0kklgkxq9yehrk5ayfly97umhws0jll8qqg0r7gzxgw5vv76
- &host_matrix_sync_external_ansible_pull_age_key age1q7kz3pnfq6cvtn56rlfgs52efcvtcmaq4xny0va3x5wxj4vpgccsenwxk6
- &host_hta_ansible_pull_age_key age1n44q80zmsnq8dehnkm8g78u0ku48zafrq4vg5pzz8ft9jkqja5jsamwxhn
external:
age: &host_external_age_keys
- &host_status_ansible_pull_age_key age1p546j6whqsyfkjuf674lawrnk2ex653fuvwhcwt46gkrspkq59sqzm5y87
z9:
age: &host_z9_age_keys
- &host_dooris_ansible_pull_age_key age1j0876shgsn7f2thxh9kx9x5uwnh45z6sy2jlk2qz5jhgedm26g5srn9kax
- &host_light_ansible_pull_age_key age1llkxtfx4dgnezmukj4ganx4ql9k4ga4ca9zuanf5r568jfp8peeqal490q
- &host_waybackproxy_ansible_pull_age_key age197tmckjll9999v5apqh5h70dktdxzxn92uyzce5j7jmesvnneecs9p7m5j
- &host_yate_ansible_pull_age_key age1yc9s8r7zt6tc7scfyxc3345khdwqrx0lwj4z6yp56h6rmauev50s5yqr22
- &host_z9_router_ansible_pull_age_key age1tx03yh67f052jzehvtvzmhe5ja6ca0rlugw8pr9v7q67z38w2ahs2a4alp
creation_rules:
- path_regex: inventories/chaosknoten/host_vars/cloud.*
## group vars
- path_regex: "inventories/chaosknoten/group_vars/.+\\.sops\\..+"
key_groups:
- pgp:
- *admin_gpg_djerun
- *admin_gpg_stb
- *admin_gpg_jtbx
- *admin_gpg_yuri
- *admin_gpg_june
- *admin_gpg_haegar
- *admin_gpg_dario
- *admin_gpg_echtnurich
- *admin_gpg_max
- *admin_gpg_c6ristian
- *admin_gpg_lilly
- *admin_gpg_langoor
- path_regex: inventories/chaosknoten/host_vars/keycloak.*
- age:
*host_chaosknoten_age_keys
merge:
- *admin_keys
- path_regex: "inventories/external/group_vars/.+\\.sops\\..+"
key_groups:
- pgp:
- *admin_gpg_djerun
- *admin_gpg_stb
- *admin_gpg_jtbx
- *admin_gpg_yuri
- *admin_gpg_june
- *admin_gpg_haegar
- *admin_gpg_dario
- *admin_gpg_echtnurich
- *admin_gpg_max
- *admin_gpg_c6ristian
- *admin_gpg_lilly
- *admin_gpg_langoor
- path_regex: inventories/chaosknoten/host_vars/grafana.*
- age:
*host_external_age_keys
merge:
- *admin_keys
- path_regex: "inventories/z9/group_vars/.+\\.sops\\..+"
key_groups:
- pgp:
- *admin_gpg_djerun
- *admin_gpg_stb
- *admin_gpg_jtbx
- *admin_gpg_yuri
- *admin_gpg_june
- *admin_gpg_haegar
- *admin_gpg_dario
- *admin_gpg_echtnurich
- *admin_gpg_max
- *admin_gpg_c6ristian
- *admin_gpg_lilly
- *admin_gpg_langoor
- path_regex: inventories/chaosknoten/host_vars/pad.*
- age:
*host_z9_age_keys
merge:
- *admin_keys
## host vars
# chaosknoten hosts
- path_regex: "inventories/chaosknoten/host_vars/acmedns\\.sops\\..+"
key_groups:
- pgp:
- *admin_gpg_djerun
- *admin_gpg_stb
- *admin_gpg_jtbx
- *admin_gpg_yuri
- *admin_gpg_june
- *admin_gpg_haegar
- *admin_gpg_dario
- *admin_gpg_echtnurich
- *admin_gpg_max
- *admin_gpg_c6ristian
- *admin_gpg_lilly
- *admin_gpg_langoor
- path_regex: inventories/chaosknoten/host_vars/ccchoir.*
- age:
- *host_acmedns_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/cloud\\.sops\\..+"
key_groups:
- pgp:
- *admin_gpg_djerun
- *admin_gpg_stb
- *admin_gpg_jtbx
- *admin_gpg_yuri
- *admin_gpg_june
- *admin_gpg_haegar
- *admin_gpg_dario
- *admin_gpg_echtnurich
- *admin_gpg_max
- *admin_gpg_c6ristian
- *admin_gpg_lilly
- *admin_gpg_langoor
- path_regex: inventories/chaosknoten/host_vars/pretalx.*
- age:
- *host_cloud_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/jitsi\\.sops\\..+"
key_groups:
- pgp:
- *admin_gpg_djerun
- *admin_gpg_stb
- *admin_gpg_jtbx
- *admin_gpg_yuri
- *admin_gpg_june
- *admin_gpg_haegar
- *admin_gpg_dario
- *admin_gpg_echtnurich
- *admin_gpg_max
- *admin_gpg_c6ristian
- *admin_gpg_lilly
- *admin_gpg_langoor
- path_regex: inventories/chaosknoten/host_vars/netbox.*
- age:
- *host_jitsi_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/keycloak\\.sops\\..+"
key_groups:
- pgp:
- *admin_gpg_djerun
- *admin_gpg_stb
- *admin_gpg_jtbx
- *admin_gpg_yuri
- *admin_gpg_june
- *admin_gpg_haegar
- *admin_gpg_dario
- *admin_gpg_echtnurich
- *admin_gpg_max
- *admin_gpg_c6ristian
- *admin_gpg_lilly
- *admin_gpg_langoor
- path_regex: inventories/chaosknoten/host_vars/tickets.*
- age:
- *host_keycloak_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/grafana\\.sops\\..+"
key_groups:
- pgp:
- *admin_gpg_djerun
- *admin_gpg_stb
- *admin_gpg_jtbx
- *admin_gpg_yuri
- *admin_gpg_june
- *admin_gpg_haegar
- *admin_gpg_dario
- *admin_gpg_echtnurich
- *admin_gpg_max
- *admin_gpg_c6ristian
- *admin_gpg_lilly
- *admin_gpg_langoor
- path_regex: inventories/chaosknoten/host_vars/onlyoffice.*
- age:
- *host_grafana_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/pad\\.sops\\..+"
key_groups:
- pgp:
- *admin_gpg_djerun
- *admin_gpg_stb
- *admin_gpg_jtbx
- *admin_gpg_yuri
- *admin_gpg_june
- *admin_gpg_haegar
- *admin_gpg_dario
- *admin_gpg_echtnurich
- *admin_gpg_max
- *admin_gpg_c6ristian
- *admin_gpg_lilly
- *admin_gpg_langoor
- path_regex: inventories/chaosknoten/host_vars/zammad.*
- age:
- *host_pad_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/ccchoir\\.sops\\..+"
key_groups:
- pgp:
- *admin_gpg_djerun
- *admin_gpg_stb
- *admin_gpg_jtbx
- *admin_gpg_yuri
- *admin_gpg_june
- *admin_gpg_haegar
- *admin_gpg_dario
- *admin_gpg_echtnurich
- *admin_gpg_max
- *admin_gpg_c6ristian
- *admin_gpg_lilly
- *admin_gpg_langoor
- path_regex: inventories/chaosknoten/host_vars/ntfy.*
- age:
- *host_ccchoir_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/pretalx\\.sops\\..+"
key_groups:
- pgp:
- *admin_gpg_djerun
- *admin_gpg_stb
- *admin_gpg_jtbx
- *admin_gpg_yuri
- *admin_gpg_june
- *admin_gpg_haegar
- *admin_gpg_dario
- *admin_gpg_echtnurich
- *admin_gpg_max
- *admin_gpg_c6ristian
- *admin_gpg_lilly
- *admin_gpg_langoor
- path_regex: inventories/z9/host_vars/dooris.*
- age:
- *host_pretalx_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/netbox\\.sops\\..+"
key_groups:
- pgp:
- *admin_gpg_djerun
- *admin_gpg_stb
- *admin_gpg_jtbx
- *admin_gpg_yuri
- *admin_gpg_june
- *admin_gpg_haegar
- *admin_gpg_dario
- *admin_gpg_echtnurich
- *admin_gpg_max
- *admin_gpg_c6ristian
- *admin_gpg_lilly
- *admin_gpg_langoor
- path_regex: inventories/z9/host_vars/yate.*
- age:
- *host_netbox_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/hta\\.sops\\..+"
key_groups:
- pgp:
- *admin_gpg_djerun
- *admin_gpg_stb
- *admin_gpg_jtbx
- *admin_gpg_yuri
- *admin_gpg_june
- *admin_gpg_haegar
- *admin_gpg_dario
- *admin_gpg_echtnurich
- *admin_gpg_max
- *admin_gpg_c6ristian
- *admin_gpg_lilly
- *admin_gpg_langoor
- key_groups:
- pgp:
- *admin_gpg_djerun
- *admin_gpg_stb
- *admin_gpg_jtbx
- *admin_gpg_yuri
- *admin_gpg_june
- *admin_gpg_haegar
- *admin_gpg_dario
- *admin_gpg_echtnurich
- *admin_gpg_max
- *admin_gpg_c6ristian
- *admin_gpg_lilly
- *admin_gpg_langoor
- age:
- *host_hta_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/tickets\\.sops\\..+"
key_groups:
- age:
- *host_tickets_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/onlyoffice\\.sops\\..+"
key_groups:
- age:
- *host_onlyoffice_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/zammad\\.sops\\..+"
key_groups:
- age:
- *host_zammad_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/ntfy\\.sops\\..+"
key_groups:
- age:
- *host_ntfy_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/eh22-wiki\\.sops\\..+"
key_groups:
- age:
- *host_eh22_wiki_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/sunders\\.sops\\..+"
key_groups:
- age:
- *host_sunders_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/wiki\\.sops\\..+"
key_groups:
- age:
- *host_wiki_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/renovate\\.sops\\..+"
key_groups:
- age:
- *host_renovate_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/lists\\.sops\\..+"
key_groups:
- age:
- *host_lists_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/mumble\\.sops\\..+"
key_groups:
- age:
- *host_mumble_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/public-reverse-proxy\\.sops\\..+"
key_groups:
- age:
- *host_public_reverse_proxy_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/spaceapiccc\\.sops\\..+"
key_groups:
- age:
- *host_spaceapiccc_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/draupnir\\.sops\\..+"
key_groups:
- age:
- *host_draupnir_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/diday-staging-runner\\.sops\\..+"
key_groups:
- age:
- *host_diday_staging_runner_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/auth-dns\\.sops\\..+"
key_groups:
- age:
- *host_auth_dns_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/forgejo-runner\\.sops\\..+"
key_groups:
- age:
- *host_forgejo_runner_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/forgejo-runner-external\\.sops\\..+"
key_groups:
- age:
- *host_forgejo_runner_external_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/chaosknoten/host_vars/matrix-sync\\.sops\\..+"
key_groups:
- age:
- *host_matrix_sync_external_ansible_pull_age_key
merge:
- *admin_keys
# external hosts
- path_regex: "inventories/external/host_vars/status\\.sops\\..+"
key_groups:
- age:
- *host_status_ansible_pull_age_key
merge:
- *admin_keys
# z9 hosts
- path_regex: "inventories/z9/host_vars/dooris\\.sops\\..+"
key_groups:
- age:
- *host_dooris_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/z9/host_vars/light\\.sops\\..+"
key_groups:
- age:
- *host_light_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/z9/host_vars/waybackproxy\\.sops\\..+"
key_groups:
- age:
- *host_waybackproxy_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/z9/host_vars/yate\\.sops\\..+"
key_groups:
- age:
- *host_yate_ansible_pull_age_key
merge:
- *admin_keys
- path_regex: "inventories/z9/host_vars/z9-router\\.sops\\..+"
key_groups:
- age:
- *host_z9_router_ansible_pull_age_key
merge:
- *admin_keys
# general
- path_regex: ".+\\.sops\\..+"
key_groups:
- *admin_keys
stores:
yaml:
indent: 2

View file

@ -2,5 +2,7 @@
"search.exclude": {
"/playbooks/roles/": true,
"/playbooks/resources/": true,
"/ansible_collections/": true,
"/galaxy-roles/": true,
},
}

View file

@ -1,5 +1,6 @@
rules:
brackets:
forbid: false
min-spaces-inside: 1
max-spaces-inside: 1
min-spaces-inside-empty: 1

View file

@ -2,31 +2,21 @@
Folgende Geräte und Server werden duch dieses Ansible Repository verwaltet:
* Diverse VMs auf dem ThinkCCCluster
* Diverse VMs im z9 (PVE Cluster)
* Diverse VMs auf dem Chaosknoten
Host-spezifische Konfigurationsdateien liegen unter `resources/` und werden für jeweils über eine `host_vars`-Datei im Inventory geladen.
## Galaxy-Collections und -Rollen installieren
## Galaxy-Collections und -Rollen
Für einige Aspekte verwenden wir Rollen aus Ansible Galaxy. Die müssen zunächst installiert werden:
Für einige Aspekte verwenden wir Collections und Rollen aus Ansible Galaxy. Diese werden in [`ansible_collections`](./ansible_collections/) bzw. [`galaxy-roles`](./galaxy-roles/) hier im Repo vorgehalten.
Um unsere gevendorte Version zu aktualisieren, kann man folgendes machen:
```bash
ansible-galaxy install -r requirements.yml
ansible-galaxy role install -r requirements.yml
```
## Secrets
Generally try to avoid secrets (e.g. use SSH keys instead of passwords).
Because secrets are nonetheless needed sometimes, we use [SOPS](https://github.com/getsops/sops) to securely store secrets in this repository.
SOPS encrypts secrets according to "creation rules" which are defined in the `.sops.yaml`.
Generally all secrets get encrypted for all GPG-keys of all members of the infrastructure team.
Ansible then has access to the secrets with the help of the [`community.sops.sops` vars plugin](https://docs.ansible.com/ansible/latest/collections/community/sops/docsite/guide.html#working-with-encrypted-variables), which is configured in this repository.
A local Ansible run then uses the locally available GPG-key to decrypt the secrets.
For a tutorial on how to set up secrets using SOPS for a new host, see [Setting Up Secrets Using SOPS for a New Host](./docs/setting_up_secrets_using_sops_for_a_new_host.md).
## Playbook nur für einzelne Hosts ausführen
Ein paar der Hosts haben den selben Namen, was es etwas schwieriger macht, das Playbook nur für einen der Hosts auszuführen, z. B. `public-reverse-proxy`. Die Kombination aus `--inventory` und `--limit` führt zum Erfolg:
@ -35,22 +25,6 @@ Ein paar der Hosts haben den selben Namen, was es etwas schwieriger macht, das P
ansible-playbook playbooks/deploy.yaml --inventory inventories/chaosknoten/hosts.yaml --limit public-reverse-proxy
```
## Neuen Web-Service hinzufügen
Wir deployen Web-Services auf dem Chaosknoten hinter dem `public-reverse-proxy`. Der Service-Name `service.hamburg.ccc.de` sollte ein CNAME für `public-reverse-proxy.hamburg.ccc.de` und die Service-VM unter `service-intern.hamburg.ccc.de` mit einer `172.31.17.x`-Adresse erreichbar sein.
Im Ansible-Repo müssen diese Sachen hinzugefügt werden:
* `inventories/chaosknoten/hosts.yaml`:
* SSH-Config für die neue VM unter all/children/debian_12/hosts
* Einträge für die Rollen, die dieser Host haben soll, min. `certbot_hosts`, `nginx_hosts`, ggf. `docker_compose_hosts`
* `inventories/chaosknoten/host_vars/`*host*`.yaml`: config vars für den neuen Host
* `resources/chaosknoten/public-reverse-proxy/nginx/acme_challenge.conf`: Liste der Hostnamen um den neuen Host erweitern, die hinter dem Reverse-Proxy stehen
* `resources/chaosknoten/public-reverse-proxy/nginx/nginx.conf`: Liste der Hostnamen um den neuen Host erweitern, die hinter dem Reverse-Proxy stehen
* `resources/chaosknoten/`*host*`/nginx/`*host*`.hamburg.ccc.de.conf`: Server auf dem Service-Host
* Individuelle Config für den Service. Wenn Docker Compose, hier weiterleiten auf den eigentlichen Dienst in Compose.
* Cert-Dateinamen anpassen
* `resources/chaosknoten/`*host*`/docker_compose/compose.yaml.j2`: Config für Docker Compose (wenn verwendet)
## License
This CCCHH ansible-ccchh repository is licensed under the [MIT License](./LICENSE).

View file

@ -2,3 +2,6 @@
inventory = ./inventories/z9/hosts.yaml
pipelining = True
vars_plugins_enabled = host_group_vars,community.sops.sops
collections_path = ./
roles_path = ./galaxy-roles
interpreter_python = python3

View file

@ -0,0 +1,30 @@
---
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
skip_list:
# Ignore rules that make no sense:
- galaxy[tags]
- galaxy[version-incorrect]
- meta-runtime[unsupported-version]
- no-changed-when
- sanity[cannot-ignore] # some of the rules you cannot ignore actually MUST be ignored, like yamllint:unparsable-with-libyaml
- yaml # we're using yamllint ourselves
- run-once[task] # wtf???
# To be checked and maybe fixed:
- ignore-errors
- key-order[task]
- name[casing]
- name[missing]
- name[play]
- name[template]
- no-free-form
- no-handler
- risky-file-permissions
- risky-shell-pipe
- var-naming[no-reserved]
- var-naming[no-role-prefix]
- var-naming[pattern]
- var-naming[read-only]

View file

@ -0,0 +1,9 @@
<!--
Copyright (c) Ansible Project
GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
SPDX-License-Identifier: GPL-3.0-or-later
-->
## Azure Pipelines Configuration
Please see the [Documentation](https://github.com/ansible/community/wiki/Testing:-Azure-Pipelines) for more information.

View file

@ -0,0 +1,280 @@
---
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
trigger:
batch: true
branches:
include:
- main
- stable-*
pr:
autoCancel: true
branches:
include:
- main
- stable-*
schedules:
- cron: 0 9 * * *
displayName: Nightly
always: true
branches:
include:
- main
- cron: 0 12 * * 0
displayName: Weekly (old stable branches)
always: true
branches:
include:
- stable-4
variables:
- name: checkoutPath
value: ansible_collections/community/docker
- name: coverageBranches
value: main
- name: entryPoint
value: tests/utils/shippable/shippable.sh
- name: fetchDepth
value: 0
resources:
containers:
- container: default
image: quay.io/ansible/azure-pipelines-test-container:7.0.0
pool: Standard
stages:
### Sanity & units
- stage: Ansible_devel
displayName: Sanity & Units devel
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
targets:
- name: Sanity
test: 'devel/sanity/1'
- name: Units
test: 'devel/units/1'
- stage: Ansible_2_20
displayName: Sanity & Units 2.20
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
targets:
- name: Sanity
test: '2.20/sanity/1'
- name: Units
test: '2.20/units/1'
- stage: Ansible_2_19
displayName: Sanity & Units 2.19
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
targets:
- name: Sanity
test: '2.19/sanity/1'
- name: Units
test: '2.19/units/1'
- stage: Ansible_2_18
displayName: Sanity & Units 2.18
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
targets:
- name: Sanity
test: '2.18/sanity/1'
- name: Units
test: '2.18/units/1'
### Docker
- stage: Docker_devel
displayName: Docker devel
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
testFormat: devel/linux/{0}
targets:
- name: Fedora 42
test: fedora42
- name: Ubuntu 22.04
test: ubuntu2204
- name: Ubuntu 24.04
test: ubuntu2404
- name: Alpine 3.22
test: alpine322
groups:
- 4
- 5
- stage: Docker_2_20
displayName: Docker 2.20
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
testFormat: 2.20/linux/{0}
targets:
- name: Fedora 42
test: fedora42
- name: Alpine 3.22
test: alpine322
groups:
- 4
- 5
- stage: Docker_2_19
displayName: Docker 2.19
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
testFormat: 2.19/linux/{0}
targets:
- name: Fedora 41
test: fedora41
- name: Alpine 3.21
test: alpine321
groups:
- 4
- 5
- stage: Docker_2_18
displayName: Docker 2.18
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
testFormat: 2.18/linux/{0}
targets:
- name: Fedora 40
test: fedora40
- name: Ubuntu 22.04
test: ubuntu2204
- name: Alpine 3.20
test: alpine320
groups:
- 4
- 5
### Community Docker
- stage: Docker_community_devel
displayName: Docker (community images) devel
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
testFormat: devel/linux-community/{0}
targets:
- name: Debian 11 Bullseye
test: debian-bullseye/3.9
- name: Debian 12 Bookworm
test: debian-bookworm/3.11
- name: Debian 13 Trixie
test: debian-13-trixie/3.13
- name: ArchLinux
test: archlinux/3.13
groups:
- 4
- 5
### Remote
- stage: Remote_devel
displayName: Remote devel
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
testFormat: devel/{0}
targets:
- name: RHEL 10.0
test: rhel/10.0
- name: RHEL 9.6 with Docker SDK, urllib3, requests from sources
test: rhel/9.6-dev-latest
# For some reason, Ubuntu 24.04 is *extremely* slower than RHEL 9.6
# - name: Ubuntu 24.04
# test: ubuntu/24.04
groups:
- 1
- 2
- 3
- 4
- 5
- stage: Remote_2_20
displayName: Remote 2.20
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
testFormat: 2.20/{0}
targets:
- name: RHEL 9.6
test: rhel/9.6
groups:
- 1
- 2
- 3
- 4
- 5
- stage: Remote_2_19
displayName: Remote 2.19
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
testFormat: 2.19/{0}
targets:
- name: RHEL 9.5
test: rhel/9.5
- name: Ubuntu 22.04
test: ubuntu/22.04
groups:
- 1
- 2
- 3
- 4
- 5
- stage: Remote_2_18
displayName: Remote 2.18
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
testFormat: 2.18/{0}
targets:
- name: RHEL 9.4
test: rhel/9.4
groups:
- 1
- 2
- 3
- 4
- 5
## Finally
- stage: Summary
condition: succeededOrFailed()
dependsOn:
- Ansible_devel
- Ansible_2_20
- Ansible_2_19
- Ansible_2_18
- Remote_devel
- Remote_2_20
- Remote_2_19
- Remote_2_18
- Docker_devel
- Docker_2_20
- Docker_2_19
- Docker_2_18
- Docker_community_devel
jobs:
- template: templates/coverage.yml

View file

@ -0,0 +1,28 @@
#!/usr/bin/env bash
# Aggregate code coverage results for later processing.
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
set -o pipefail -eu
agent_temp_directory="$1"
PATH="${PWD}/bin:${PATH}"
mkdir "${agent_temp_directory}/coverage/"
if [[ "$(ansible --version)" =~ \ 2\.9\. ]]; then
exit
fi
options=(--venv --venv-system-site-packages --color -v)
ansible-test coverage combine --group-by command --export "${agent_temp_directory}/coverage/" "${options[@]}"
if ansible-test coverage analyze targets generate --help >/dev/null 2>&1; then
# Only analyze coverage if the installed version of ansible-test supports it.
# Doing so allows this script to work unmodified for multiple Ansible versions.
ansible-test coverage analyze targets generate "${agent_temp_directory}/coverage/coverage-analyze-targets.json" "${options[@]}"
fi

View file

@ -0,0 +1,64 @@
#!/usr/bin/env python
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
"""
Combine coverage data from multiple jobs, keeping the data only from the most recent attempt from each job.
Coverage artifacts must be named using the format: "Coverage $(System.JobAttempt) {StableUniqueNameForEachJob}"
The recommended coverage artifact name format is: Coverage $(System.JobAttempt) $(System.StageDisplayName) $(System.JobDisplayName)
Keep in mind that Azure Pipelines does not enforce unique job display names (only names).
It is up to pipeline authors to avoid name collisions when deviating from the recommended format.
"""
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import os
import re
import shutil
import sys
def main():
"""Main program entry point."""
source_directory = sys.argv[1]
if '/ansible_collections/' in os.getcwd():
output_path = "tests/output"
else:
output_path = "test/results"
destination_directory = os.path.join(output_path, 'coverage')
if not os.path.exists(destination_directory):
os.makedirs(destination_directory)
jobs = {}
count = 0
for name in os.listdir(source_directory):
match = re.search('^Coverage (?P<attempt>[0-9]+) (?P<label>.+)$', name)
label = match.group('label')
attempt = int(match.group('attempt'))
jobs[label] = max(attempt, jobs.get(label, 0))
for label, attempt in jobs.items():
name = 'Coverage {attempt} {label}'.format(label=label, attempt=attempt)
source = os.path.join(source_directory, name)
source_files = os.listdir(source)
for source_file in source_files:
source_path = os.path.join(source, source_file)
destination_path = os.path.join(destination_directory, source_file + '.' + label)
print('"%s" -> "%s"' % (source_path, destination_path))
shutil.copyfile(source_path, destination_path)
count += 1
print('Coverage file count: %d' % count)
print('##vso[task.setVariable variable=coverageFileCount]%d' % count)
print('##vso[task.setVariable variable=outputPath]%s' % output_path)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,28 @@
#!/usr/bin/env bash
# Check the test results and set variables for use in later steps.
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
set -o pipefail -eu
if [[ "$PWD" =~ /ansible_collections/ ]]; then
output_path="tests/output"
else
output_path="test/results"
fi
echo "##vso[task.setVariable variable=outputPath]${output_path}"
if compgen -G "${output_path}"'/junit/*.xml' > /dev/null; then
echo "##vso[task.setVariable variable=haveTestResults]true"
fi
if compgen -G "${output_path}"'/bot/ansible-test-*' > /dev/null; then
echo "##vso[task.setVariable variable=haveBotResults]true"
fi
if compgen -G "${output_path}"'/coverage/*' > /dev/null; then
echo "##vso[task.setVariable variable=haveCoverageData]true"
fi

View file

@ -0,0 +1,105 @@
#!/usr/bin/env python
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
"""
Upload code coverage reports to codecov.io.
Multiple coverage files from multiple languages are accepted and aggregated after upload.
Python coverage, as well as PowerShell and Python stubs can all be uploaded.
"""
import argparse
import dataclasses
import pathlib
import shutil
import subprocess
import tempfile
import typing as t
import urllib.request
@dataclasses.dataclass(frozen=True)
class CoverageFile:
name: str
path: pathlib.Path
flags: t.List[str]
@dataclasses.dataclass(frozen=True)
class Args:
dry_run: bool
path: pathlib.Path
def parse_args() -> Args:
parser = argparse.ArgumentParser()
parser.add_argument('-n', '--dry-run', action='store_true')
parser.add_argument('path', type=pathlib.Path)
args = parser.parse_args()
# Store arguments in a typed dataclass
fields = dataclasses.fields(Args)
kwargs = {field.name: getattr(args, field.name) for field in fields}
return Args(**kwargs)
def process_files(directory: pathlib.Path) -> t.Tuple[CoverageFile, ...]:
processed = []
for file in directory.joinpath('reports').glob('coverage*.xml'):
name = file.stem.replace('coverage=', '')
# Get flags from name
flags = name.replace('-powershell', '').split('=') # Drop '-powershell' suffix
flags = [flag if not flag.startswith('stub') else flag.split('-')[0] for flag in flags] # Remove "-01" from stub files
processed.append(CoverageFile(name, file, flags))
return tuple(processed)
def upload_files(codecov_bin: pathlib.Path, files: t.Tuple[CoverageFile, ...], dry_run: bool = False) -> None:
for file in files:
cmd = [
str(codecov_bin),
'--name', file.name,
'--file', str(file.path),
]
for flag in file.flags:
cmd.extend(['--flags', flag])
if dry_run:
print(f'DRY-RUN: Would run command: {cmd}')
continue
subprocess.run(cmd, check=True)
def download_file(url: str, dest: pathlib.Path, flags: int, dry_run: bool = False) -> None:
if dry_run:
print(f'DRY-RUN: Would download {url} to {dest} and set mode to {flags:o}')
return
with urllib.request.urlopen(url) as resp:
with dest.open('w+b') as f:
# Read data in chunks rather than all at once
shutil.copyfileobj(resp, f, 64 * 1024)
dest.chmod(flags)
def main():
args = parse_args()
url = 'https://ansible-ci-files.s3.amazonaws.com/codecov/linux/codecov'
with tempfile.TemporaryDirectory(prefix='codecov-') as tmpdir:
codecov_bin = pathlib.Path(tmpdir) / 'codecov'
download_file(url, codecov_bin, 0o755, args.dry_run)
files = process_files(args.path)
upload_files(codecov_bin, files, args.dry_run)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,23 @@
#!/usr/bin/env bash
# Generate code coverage reports for uploading to Azure Pipelines and codecov.io.
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
set -o pipefail -eu
PATH="${PWD}/bin:${PATH}"
if [[ "$(ansible --version)" =~ \ 2\.9\. ]]; then
exit
fi
if ! ansible-test --help >/dev/null 2>&1; then
# Install the devel version of ansible-test for generating code coverage reports.
# This is only used by Ansible Collections, which are typically tested against multiple Ansible versions (in separate jobs).
# Since a version of ansible-test is required that can work the output from multiple older releases, the devel version is used.
pip install https://github.com/ansible/ansible/archive/devel.tar.gz --disable-pip-version-check
fi
ansible-test coverage xml --group-by command --stub --venv --venv-system-site-packages --color -v

View file

@ -0,0 +1,38 @@
#!/usr/bin/env bash
# Configure the test environment and run the tests.
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
set -o pipefail -eu
entry_point="$1"
test="$2"
read -r -a coverage_branches <<< "$3" # space separated list of branches to run code coverage on for scheduled builds
export COMMIT_MESSAGE
export COMPLETE
export COVERAGE
export IS_PULL_REQUEST
if [ "${SYSTEM_PULLREQUEST_TARGETBRANCH:-}" ]; then
IS_PULL_REQUEST=true
COMMIT_MESSAGE=$(git log --format=%B -n 1 HEAD^2)
else
IS_PULL_REQUEST=
COMMIT_MESSAGE=$(git log --format=%B -n 1 HEAD)
fi
COMPLETE=
COVERAGE=
if [ "${BUILD_REASON}" = "Schedule" ]; then
COMPLETE=yes
if printf '%s\n' "${coverage_branches[@]}" | grep -q "^${BUILD_SOURCEBRANCHNAME}$"; then
COVERAGE=yes
fi
fi
"${entry_point}" "${test}" 2>&1 | "$(dirname "$0")/time-command.py"

View file

@ -0,0 +1,29 @@
#!/usr/bin/env python
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
"""Prepends a relative timestamp to each input line from stdin and writes it to stdout."""
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import sys
import time
def main():
"""Main program entry point."""
start = time.time()
sys.stdin.reconfigure(errors='surrogateescape')
sys.stdout.reconfigure(errors='surrogateescape')
for line in sys.stdin:
seconds = time.time() - start
sys.stdout.write('%02d:%02d %s' % (seconds // 60, seconds % 60, line))
sys.stdout.flush()
if __name__ == '__main__':
main()

Some files were not shown because too many files have changed in this diff Show more