2015-10-09 15 views
5

Jak mogę połączyć zawartość kilku plików w zmienną?Ansible - jak łączyć zawartość plików w zmienną

Oto problem: próbuję ustawić klucze publiczne dla użytkownika na komputerze zdalnym. Przykład z authorized_key documentation że prawie działa:

- name: Set up authorized_keys for the deploy user 
    authorized_key: user=deploy 
        key="{{ item }}" 
    with_file: 
    - public_keys/doe-jane 
    - public_keys/doe-john 

Ale rzeczywiście muszę używać exclusive=yes, więc po aktualizacji wszystkich nie-pod warunkiem klucze publiczne są usuwane.

Jeśli dostarczono exclusive=yes, w pliku .ssh/authorized_keys pozostaje tylko ostatni klucz publiczny (również zgłoszony jako bug).

Moje obecne podejście:

- name: create empty temporary keys file 
    local_action: "shell > /tmp/auth_keys" 

- name: concat keys to temporary file 
    local_action: "shell echo {{ item }} >> /tmp/auth_keys" 
    with_file: 
    - public_keys/doe-jane 
    - public_keys/doe-john 

- name: set up authorized_keys 
    authorized_key: user=deploy 
        key="{{ lookup('file', '/tmp/auth_keys') }}" 
        exclusive=yes 

To działa, ale pierwsze dwa polecenia zawsze produkować „zmieniony”. Uważam też, że musi istnieć bardziej eleganckie rozwiązanie.

Czy istnieje sposób łączenia zawartości kilku plików w zmienną? Czy istnieje ogólnie lepsze podejście do tego zadania?

+0

Myśląc o tym, aby pozbyć się "zmienionego" statusu 'changed_when: False' można dołączyć do dwóch pierwszych poleceń, ale nadal nie jestem zadowolony z wyniku. –

Odpowiedz

6

Nic nie jest zbyt źle z pierwszą opcją, a następnie, jak wspomina twój komentarz, po prostu używając changed_when: False, aby potwierdzić, że nie jest to coś, co zależy ci na wyniku zmiany, jest ważną opcją.

Aby odpowiedzieć na rzeczywiste tytułowe pytanie można, jak wspomniano w GitHub "issue" jesteś połączony, po prostu złączyć wyszukiwań bezpośrednio w zadaniu tak:

- name: set up authorized_keys 
    authorized_key: user=deploy 
        key="{{ lookup('file', 'public_keys/doe-jane') + lookup('file', 'public_keys/doe-john')}}" 
        exclusive=yes 

Jednak czystsze rozwiązaniem może być wykorzystanie assemble module połączyć klucze.

To wtedy zmienić dotychczasowe podejście do czegoś więcej jak:

- name: create concatenated keys file 
    local_action: "assemble src=roles/ssh_keys/files/ssh_keys/ dest=/tmp/ssh_keys_file" 

- name: set up authorized_keys 
    authorized_key: user=deploy 
        key="{{ lookup('file', '/tmp/ssh_keys_file' }}" 
        exclusive=yes 

To będzie oznaczone tylko jako zmieniony, jeżeli plik docelowy został zmieniony w ogóle więc działa to w kółko pozostawia piękny mur zielony .

To zależy od kluczy ssh, wszystkie pliki będące w tym samym folderze (zazwyczaj służy do przekształcania katalogów stylu conf.d w pojedynczy plik .conf dla programów, które nie używają konfiguracji stylu conf.d) ale jest to prawdopodobnie najbardziej rozsądny sposób ich utrzymania.

Zaletą tego jest to, że można po prostu dodawać/usuwać klucze ssh z określonego folderu, a zostanie ono pobrane podczas następnej gry bez potrzeby dodawania/usuwania kluczy, które są jawnie zdefiniowane w samym zadaniu.

+0

Dzięki, to ma sens. Chociaż nadal chciałbym np. Zdefiniuj jedną listę kluczy do przemieszczania, jedną do testowania i jedną listę dla produkcyjnych grup hostów bez potrzeby duplikowania kluczy w repozytorium. Nieważne, cieszę się, że nie ma "zbyt oczywistego" rozwiązania, którego nie mogłem się dowiedzieć;) –

+2

Jak wspomniano przy pierwszym bloku kodu, można po prostu połączyć wszystkie odnośniki w zmiennej bezpośrednio i to będzie praca. Wygląda to okropnie i nie jestem przekonany, że to dobry sposób na zarządzanie nimi, ale zrobiłby dokładnie to, co chciałeś.Osobiście wolę mieć różne katalogi pełne kluczy publicznych, które są stosowane w różnych typach środowisk, nawet jeśli istnieje dublowanie kluczy. W ten sposób, jeśli zobaczysz "doe-jane" w obu folderach dev i testach, od razu wiesz, że Jane Doe ma dostęp do dev i testów. – ydaetskcoR