Как сделать ansible подключиться к хосту windows за Linux jump server

Я хочу подготовить хост Windows, который находится в подсети, доступной только с хостом перехода Linux.

машина Windows использует метод подключения winrm. Linux jump server доступен через SSH.

у меня нет проблем с доступом к хосту windows, если он доступен напрямую с:

ansible_connection: winrm

Если я попытаюсь делегировать задачу серверу Linux jump (который имеет прямой доступ к Windows):

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

он пытается подключиться, чтобы установить соединение WINRM с перейти хост. Не совсем то, что я имел в виду.

обратите внимание, что для группы windows_machines я определил group_vars:

ansible_port: 5986
ansible_connection: winrm
ansible_winrm_server_cert_validation: ignore

как я должен предоставлять хосты Windows через хост бастиона?

2 ответов


моим приоритетом было иметь всю конфигурацию в одном месте и не распространять часть Ansible на хост бастиона/прыжка. Я пошел на создание SSH-туннеля для порта 5986. Вот полная задача:

- 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-%r@%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-%r@%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-%r@%h:%p" {{ hostvars[item].ansible_ssh_user }}@{{ hostvars[item].ansible_host }}
      with_items:
        - "{{ groups['jump_servers'][0] }}"

для этого мне пришлось немного изменить файл inventory:

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

Ansible может подключаться путем доступа 5986 порт на локальном хосте, поэтому ansible_host должен быть установлен в 127.0.0.1 и иметь информацию о фактическом ip-адресе машины Windows пользовательская переменная actual_host установлен.


это не то, что на задание.

вместо delegate_to убедитесь, что задача выполняется только для определенного узла, а не для группы, указанной в ролевой книге.

Так, например, у вас может быть роль, которая настраивает MySQL на кластере ящиков, которые определены в общем смысле, но затем хотят выполнить определенную конфигурацию / задачи на мастере в одиночку, оставив мастера, чтобы затем реплицировать их рабам.

Вы можете do SSH проксирование где вы пересылаете SSH-соединения через хост бастиона / прыжка, но это, очевидно, требует, чтобы ваше соединение было SSH, которое вам не поможет.

единственное, что я могу придумать, чтобы помочь вам здесь, было бы использовать Ansible непосредственно из хоста бастиона/прыжка, возможно, вызванного Ansible (или чем-то еще) с вашей машины за пределами защищенной зоны.