Zum Inhalt

JumpHosts mit AWX

Die aktuelle AWX Version(19.2.2) lässt sich nur in einer Kubernetes Cloud sauber betreiben. Die Entwickler haben das ganze in mehrere MicroServices aufgeteilt. Unter anderem gibt es die Execution Environment, das ist nichts anderes als ein Container, in dem Ansible (ansible-runner) läuft. Diese Container kann man relativ schnell und einfach selbst erweiterten (Das aber in einem anderen Artikel.). Das Problem, was sich hier aber für mich ergeben hat: wie bekomme ich AWX dazu, einen JumpHost zu benutzen? Einfach eine .ssh/config erstellen ist leider nicht.

Nach langem Suchen bin ich dann auf eine relativ saubere Lösung gekommen: Das Ganze kann man in AWX selbst einrichten. Zunächst muss man einen eigenen "Credential Type" erstellen. Dieser ist im Grunde dafür da, die Zugangsdaten, aber auch die Verbindungsdaten zu unserem JumpHost zu definieren. Dadurch wird das Ganze auch noch dynamisch!

Zunächst braucht es eine "Input Configuration", ein Yaml File, mit dem wir unseren Dialog erstellen:

Keycloak Login

fields:
  - id: jh_ip
    type: string
    label: IP Adress JumpHost
  - id: jh_ssh_user
    type: string
    label: Username auf dem JumpHost
  - id: jh_ssh_private_key
    type: string
    label: JumpHost User SSH Private Key 
    format: ssh_private_key
    secret: true
    multiline: true
  - id: jh_ssh_private_key_passphrase
    type: string
    label: Optional Passphrase fuer den SSH Private Key am Jumphost
    secret: true
  - id: jh_ssh_port
    type: string
    label: SSH port am JumpHost
  - id: jh_socks_port
    type: string
    label: Port on localhost to map with Jumphost port for socks5 proxy
required:
  - jh_ip
  - jh_ssh_user
  - jh_ssh_private_key
  - jh_ssh_port

Das Ganze ist relativ selbst erklärend. Schwieriger ist da der Injector. Mit diesem wird definiert, wie wir die Informationen aus unserem Dialog in unser Playbook injektieren. Das Ganze sieht so aus:

env:
  JH_SSH_PRIVATE_KEY: '{{tower.filename.jh_ssh_private_key}}'
  JH_SSH_PRIVATE_KEY_PASSPHRASE: '{{ jh_ssh_private_key_passphrase }}'
file:
  template.jh_ssh_private_key: '{{ jh_ssh_private_key }}'
extra_vars:
  jh_ip: '{{ jh_ip }}'
  jh_ssh_port: '{{ jh_ssh_port }}'
  jh_ssh_user: '{{ jh_ssh_user }}'
  jh_socks_port: '{{ jh_socks_port }}'
  jh_ssh_private_key: '{{tower.filename.jh_ssh_private_key}}'

Im Bereich ENV definieren wir Environment Variablen. Darunter "file", hier wird unser SSH_PRIVATE_KEY in ein File geschrieben. Der Filename steht sowohl in der ENV als auch in EXTRA_VARS in jh_ssh_private_key bzw JH_SSH_PRIVATE_KEY

Als Nächstes definieren wir ein Inventory und übergeben dort ein paar Variablen an unser Playbook.

Keycloak Login

ansible_connection: ssh
ansible_ssh_common_args: -o ProxyCommand="ssh -o PreferredAuthentications=publickey -i $JH_SSH_PRIVATE_KEY -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -W %h:%p -q -p {{ jh_ssh_port }} {{jh_ssh_user}}@{{jh_ip}} "

Alle Hosts, die nun in unserem Inventory landen, verwenden jetzt diesen JumpHost! Wichtig dabei, man muss dran denken, in Job Template mehrere Credantials zu importieren!