2015-12-17 13 views
9

Chcę udostępnić hosta Windows, który jest w podsieci dostępnej tylko z hostem skoku Linux.Jak sprawić, aby ansibli łączyło się z hostem Windows za linuxowym serwerem skoku

Urządzenie z systemem Windows korzysta z metody połączenia Winrm. Serwer skoku Linux jest dostępny przez SSH.

mam żadnego problemu z dostępem do komputera z Windows, jeśli dostępne bezpośrednio z:

ansible_connection: winrm 

Gdy próbuję przekazać zadanie do serwera skoku Linux (który ma bezpośredni dostęp do systemu Windows) przez:

- name: Ping windows 
    hosts: windows_machines 
    tasks: 
    - name: ping 
     win_ping: 
     delegate_to: "{{ item }}" 
     with_items: "{{ groups['jump_servers'][0] }}" 

próbuje nawiązać połączenie, aby ustanowić połączenie WINRM z hostem skoku. Nie dokładnie to, co miałem na myśli.

Zauważ, że dla grupy windows_machines Mam group_vars zdefiniowane:

ansible_port: 5986 
ansible_connection: winrm 
ansible_winrm_server_cert_validation: ignore 

jak mam przepis gospodarze Windows za pomocą hosta bastion?

Odpowiedz

4

Moim priorytetem było posiadanie całej konfiguracji w jednym miejscu i nie rozdzielanie części Ansible na hosta bastion/jump. Poszedłem do utworzenia tunelu ssh dla portu 5986. Oto pełna zadanie:

- name: Tunneled configuration of Windows host in a subnet 
    hosts: windows 
    connection: local #This is the trick to connect to localhost not actual host 
    gather_facts: no 
    tasks: 
    - name: First setup a tunnel 
     local_action: command ssh -Nf -4 -o ControlPersist=1m -o ControlMaster=auto -o ControlPath="~/.ssh/mux2win-%[email protected]%h:%p" -o StrictHostKeyChecking=no -o PasswordAuthentication=no -o UserKnownHostsFile="/dev/null" -i {{ hostvars[item].ansible_ssh_private_key_file }} {{ hostvars[item].ansible_ssh_user }}@{{ hostvars[item].ansible_host }} -L {{ ansible_port }}:{{ actual_host }}:{{ ansible_port }} 
     with_items: 
     - "{{ groups['jump_servers'][0] }}" #I know my topology so I know which host to use 
    - name: (optional) Second ensure it is up 
     local_action: command ssh -O check -S "~/.ssh/mux2win-%[email protected]%h:%p" {{ hostvars[item].ansible_ssh_user }}@{{ hostvars[item].ansible_host }} 
     with_items: 
     - "{{ groups['jump_servers'][0] }}" 

    # ------- actual windows tasks (from ansible examples) ------------ 
    - name: Ping 
     connection: local 
     win_ping: 
    - name: test raw module- run ipconfig 
     raw: ipconfig 
     register: ipconfig 
    - debug: var=ipconfig 

    - name: Test stat module- test stat module on file 
     win_stat: path="C:/Windows/win.ini" 
     register: stat_file 

    - debug: var=stat_file 

    - name: Check stat_file result 
     assert: 
      that: 
      - "stat_file.stat.exists" 
      - "not stat_file.stat.isdir" 
      - "stat_file.stat.size > 0" 
      - "stat_file.stat.md5" 
    # ------- end of actual windows tasks ------------ 

    - name: Stop the tunnel. It would stop anyway after 1m. 
     local_action: command ssh -O stop -S "~/.ssh/mux2win-%[email protected]%h:%p" {{ hostvars[item].ansible_ssh_user }}@{{ hostvars[item].ansible_host }} 
     with_items: 
     - "{{ groups['jump_servers'][0] }}" 

Aby to działało musiałem zmodyfikować nieco plik zapasy:

[windows] 
windows1 ansible_host=127.0.0.1 ansible_ssh_user=Administrator actual_host=192.168.0.2 (...) 

ansibl można podłączyć poprzez dostęp do portu 5986 na lokalnym komputerze, więc ansible_host musi być ustawiona na 127.0.0.1, a dla informacji o rzeczywistym IP komputera z systemem Windows ustawiona jest zmienna niestandardowa actual_host.

3

To nie jest to, co robi opcja delegate_to w zadaniu.

Zamiast tego, delegate_to upewni się, że zadanie działa tylko w odniesieniu do określonego węzła, a nie do grupy wymienionej w roli/liście odtwarzania.

Na przykład możesz mieć rolę, która konfiguruje MySQL na klastrze skrzynek, które są zdefiniowane w sposób ogólny, ale potem chcesz wykonać określoną konfigurację/zadania na samym systemie głównym, pozostawiając urządzenie główne, aby następnie je zreplikować niewolnikom .

Możesz wykonać SSH proxying, gdzie przesyłasz połączenia SSH przez hosta bastion/jump, ale to oczywiście wymaga, aby twoje połączenie było SSH, przez co nie pomaga.

Jedyne, co mogę w tym pomóc, to użyć Ansible bezpośrednio z hosta bastion/jump, który prawdopodobnie zostanie wywołany przez Ansible (lub cokolwiek innego) z twojej maszyny poza strefą chronioną.

Powiązane problemy