UbuntuServer-AD-JOIN/ansible
2026-01-09 19:19:11 +01:00
..
roles/ad_join Add Ansible deployment and systemd-resolved DNS support 2026-01-09 19:19:11 +01:00
README.md Add Ansible deployment and systemd-resolved DNS support 2026-01-09 19:19:11 +01:00
site.yml Add Ansible deployment and systemd-resolved DNS support 2026-01-09 19:19:11 +01:00

Ansible deployment

This repo includes an Ansible role that deploys and runs ad-join-script.sh in a non-interactive way by passing all inputs as variables.

Files

  • ansible/site.yml: example playbook using the role
  • ansible/roles/ad_join: role that copies and runs the script

Variables

Required:

  • ad_join_hostname: short hostname (without domain)
  • ad_join_domain_name: AD domain (e.g. corp.example.com)
  • ad_join_admin_user: account used to join the domain
  • ad_join_admin_password: password for ad_join_admin_user
  • ad_join_dns_servers: DNS server IPs used to validate domain resolution (list preferred; also accepts a comma-separated string)
  • ad_join_dns_server: single DNS server IP (backward compatible)
  • ad_join_ad_group: AD group to grant sudo access (written to /etc/sudoers)

Optional:

  • ad_join_force (default: false): run even if realm list already shows the domain
  • ad_join_run (default: true): set to false to only deploy the script

Semaphore setup notes

  • Point Semaphore to the playbook at ansible/site.yml.
  • Define the variables above in the task template (use a secret variable for ad_join_admin_password).

Run (example)

ansible-playbook -i inventory.ini ansible/site.yml \
  -e ad_join_hostname=ubuntuhost01 \
  -e ad_join_domain_name=corp.example.com \
  -e ad_join_admin_user=JoinUser \
  -e ad_join_admin_password='***' \
  -e 'ad_join_dns_servers=["192.0.2.53","192.0.2.54"]' \
  -e ad_join_ad_group='LinuxAdmins'

Important behavior

  • The script attempts to configure DNS via systemd-resolved first, then falls back to writing /etc/resolv.conf. If DNS is managed elsewhere, you may need to adapt DNS configuration for your environment.
  • The role runs the join step only when the host is not already joined (unless ad_join_force: true).