Skip to main content

Ansible-vault och Nornir

Det går att kombinera hemliga variablar med hjälp av Ansible vault i ett Nornir-jobb.

De synliga, icke hemliga variablarna placerar man som vanligt i inventory/hosts.yaml och inventory/groups.yaml. Hemliga variablar kan man sedan placera i inventory/secrets.yaml.

Man kommer sedan att kombinera dessa när jobbet körs, så det är viktigt att hierarkin är exakt lika i samtliga filer.

Har man exempelvis följande i hosts.yaml:

nxos:
  data:
    routed_underlay:
      ISIS_NET: 49.1337.0000.0000.0001.00

Och ett lösenord ska användas för ISIS som anropas av Python-jobbet på samma ställe ska då secrets.yaml se ut såhär:

nxos:
  data:
    routed_underlay:
      ISIS_PASSWORD: s0000pers3333cret

För att sedan använda sig av ansible vault behövs följande:

Kryptera filen med ansible-vault encrypt secrets.yaml. Redigering med edit eller decrypt (glöm inte encrypt efteråt).

Skapa en lokal fil på servern där krypteringslösenordet finns, använd chmod 400 på den.

Följande moduler behövs:

from ansible.parsing.vault import VaultLib, VaultSecret
from ansible.constants import DEFAULT_VAULT_ID_MATCH
from ansible.parsing.dataloader import DataLoader

 

Anropa sedan i jobbet:

def load_vault_password(path="~/.ansible_losen"):
    path = Path(path).expanduser()
    return path.read_bytes().strip()

I def main() behövs följande för att låsa upp filen och använda den:

    vault_password = load_vault_password()

    loader = DataLoader()
    vault = VaultLib([(DEFAULT_VAULT_ID_MATCH, VaultSecret(vault_password))])
    loader.set_vault_secrets(vault.secrets)

    data = loader.load_from_file("inventory/secrets.yaml")

    for host, host_data in data.items():
        if host in nr.inventory.hosts:
            nr.inventory.hosts[host].data.update(host_data)