我想配置只能通过Linux跳转主机访问子网的Windows主机。
Windows机器使用winrm连接方法。 Linux跳转服务器可以通过SSH获得。
如果可以直接使用,我可以访问Windows主机:
ansible_connection: winrm
如果我尝试通过以下方式将任务委派给Linux跳转服务器(可直接访问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主机?
答案 0 :(得分:6)
我的首要任务是将所有配置放在一个地方,而不是将Ansible的一部分分配给堡垒/跳转主机。我去为5986端口建立ssh隧道。 这是完整的任务:
- 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] }}"
为此,我不得不略微修改库存文件:
[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
并将有关Windows机器实际ip的信息设置为自定义变量{{1}已设置。
答案 1 :(得分:3)
这不是任务delegate_to
选项的作用。
相反,delegate_to
将确保该任务仅针对特定节点而不是角色/剧本中列出的组运行。
因此,例如,您可能有一个角色,即在一般定义的框的集群上设置MySQL,然后只想在主服务器上执行特定的配置/任务,然后让主服务器将这些配置/任务复制到从服务器。
您可以通过堡垒/跳转主机转发SSH连接SSH proxying,但显然需要您的连接是SSH,这对您没有帮助。
我能想到的唯一能帮助你的方法是直接从堡垒/跳转主机使用Ansible,这可能是由受保护区域外的机器的Ansible(或其他任何其他东西)触发的。