Ansible 在“收集主機”時失敗可能是因為 SSH 連接速度很慢。設置“UseDNS no”可以解決問題
我遇到了似乎與 DNS 相關的問題,希望能得到一些幫助來解決。
我正在使用 Ansible 在我的 Proxmox 伺服器上配置 Kubernetes 集群。該項目以兩種方式工作,讓使用者修改
site.yml
以使用Linux Containers (LXC)或來自 CentOS7 qcow2 映像的虛擬機進行部署。使用 LXC 進行部署時,項目沒有遇到任何問題並正確引導 Kubernetes 集群。但是,在使用該
qcow2
圖像時,我遇到了似乎與 DNS 相關的問題。當配置我的虛擬機的劇本與第一次連接到它們以準備它們的劇本之間發生轉換時,就會發生這種情況。發生的情況是,該
Gathering Facts
階段最終超時並且 Ansible 拋出以下錯誤:TASK [Gathering Facts] ******************************************************************************************************************************************************************************************************************************************************* fatal: [pluto.sol.milkyway]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host pluto.sol.milkyway port 22: Operation timed out\r\n", "unreachable": true} fatal: [ceres.sol.milkyway]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host ceres.sol.milkyway port 22: Operation timed out\r\n", "unreachable": true} fatal: [eris.sol.milkyway]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host eris.sol.milkyway port 22: Operation timed out\r\n", "unreachable": true} fatal: [haumea.sol.milkyway]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host haumea.sol.milkyway port 22: Operation timed out\r\n", "unreachable": true}
如果發生這種情況後,我嘗試手動 SSH 連接到伺服器,我可以驗證 SSH 連接需要很長時間。在這一點上,我想提醒您,使用相同的主機名、IP 地址和名稱伺服器的 LXC 實例不會發生這種情況。
然後可以通過在每台伺服器上的
UseDNS no
我的文件中設置指令來解決該問題。sshd_config
並在重新啟動後再次執行劇本sshd.service
。所以,很自然,這看起來像是一個 DNS 問題。但是,由於 LXC 不會發生這種情況,我對此表示懷疑。所以這裡有一些關於我的 DNS 配置的數據點。
**1)**他們都使用的 DNS 伺服器是 BIND 並且安裝在
IO.Sol.Milkyway
名為192.168.1.10
. 我的 homelab 中沒有 VNet 或子網或任何東西,網關已正確設置到我的路由器,192.168.1.1
因此該伺服器沒有路由問題。**2)**這是我的 BIND 伺服器上 DNS 區域的相關部分。
**3)**以下是從 Proxmox 伺服器執行的一些
nslookup
s,並附加了time
命令以證明我的 BIND 伺服器在 <= .01 秒內正確響應。$> time nslookup pluto.sol.milkyway Server: 192.168.1.100 Address: 192.168.1.100#53 Name: pluto.sol.milkyway Address: 192.168.1.170 nslookup pluto.sol.milkyway 0.00s user 0.02s system 39% cpu 0.042 total
-和-
$> time nslookup 192.168.1.170 Server: 192.168.1.100 Address: 192.168.1.100#53 170.1.168.192.in-addr.arpa name = pluto.sol.milkyway. nslookup 192.168.1.170 0.01s user 0.01s system 96% cpu 0.013 total
**4)**最後,您可以通過此處
cloud-init
的第104、115、126 和 137 行在VM 上正確配置我的名稱伺服器。其中引用了此處定義的變數。—–以下編輯—–
**5)**我能夠從以下成功執行正向和反向 nslookup。每個響應需要 < 1.5 秒:
- 我的個人工作站(執行 Ansible)
- 我的 Proxmox 伺服器(執行 Ansible 命令和虛擬機)
- 4 台虛擬機
這是Kubernetes 主伺服器的範例。
我發現了問題。看來我生成的虛擬機包含一個由 qemu 自動引入的附加名稱伺服器。當創建 VM 並且未為其指定網路設備時,會發生這種情況。來自 Proxmox 文件
qm
:網
$$ n $$:$$ model= $$ $$ ,bridge= $$ $$ ,firewall=<1|0> $$ $$ ,link_down=<1|0> $$ $$ ,macaddr= $$ $$ ,queues= $$ $$ ,rate= $$ $$ ,tag= $$ $$ ,trunks= $$ $$ ,= $$
指定網路設備。 bridge=
將網路設備連接到的網橋。Proxmox VE 標準網橋稱為 vmbr0。
如果不指定網橋,我們會創建一個 kvm 使用者(NATed)網路設備,它提供 DHCP 和 DNS 服務。使用以下地址:
10.0.2.2 網關
10.0.2.3 DNS 伺服器
10.0.2.4 SMB 伺服器
DHCP 伺服器從 10.0.2.15 開始為訪客分配地址。
我的程序如下:
**1)**通過 Proxmox_KVM Ansible 模組使用 Proxmox API 創建 VM。
**2)**從這個虛擬機複製四個 Kubernetes 虛擬機。
**3)**依次配置每個Kubernetes VM。
實際上,在*步驟 1)中,我確實聲明了一座橋。但是,在第 2 步)中我沒有,因為它是一個簡單的
qm clone
. 根據文件,它不支持net[n]
傳遞標誌。正是在這一點上引入了隨機名稱伺服器。然後,當步驟 3)*出現時,我通過 設置了一個名稱伺服器,它將它作為第二個名稱伺服器cloud-init
附加到我的文件中。/etc/resolv.conf
我目前正在修改我的劇本以嘗試通過在*步驟 1)和步驟 2)*之間執行以下任務來解決此問題:
- name: Setting the name server for the template to ensure that QEMU doesn't automatically configure the clones to use 10.0.2.3. shell: > qm set {{ proxmox_template_id }} --ipconfig0 gw={{ k8s_master_gw }},ip={{ k8s_master_ip }}{{ k8s_master_sn }} --nameserver {{ k8s_master_ns }} --searchdomain {{ k8s_master_sd }}
交叉手指說這將解決問題。
- - -編輯 - - -
它沒有。並且在執行
qm clone
. 這意味著我將不得不重新編寫我的劇本以提供四個單獨的實例,而不是從模板中複製。—–編輯2—–
蹩腳的 Proxmox_kvm Ansible 模組似乎也不支持與 cloudinit 相關的 API 東西。這意味著我將不得不通過 shell 命令和槓桿來做所有事情
qm
。:(—–編輯3—–
看起來該名稱伺服器實際上在預設情況下位於基本圖像中。WTF CENTOS?
root@hypervisor-1:/rpool/data# modprobe nbd max_part=8 root@hypervisor-1:/rpool/data# qemu-nbd --connect=/dev/nbd0 /tmp/CentOS7.qcow2c root@hypervisor-1:/rpool/data# fdisk -l /dev/nbd0 Disk /dev/nbd0: 8 GiB, 8589934592 bytes, 16777216 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x000b2638 Device Boot Start End Sectors Size Id Type /dev/nbd0p1 * 2048 16777215 16775168 8G 83 Linux root@hypervisor-1:/rpool/data# mount /dev/nbd0p1 /mnt/tmp root@hypervisor-1:/rpool/data# cd /mnt/tmp root@hypervisor-1:/mnt/tmp# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@hypervisor-1:/mnt/tmp# cat etc/resolv.conf # Generated by NetworkManager nameserver 10.0.2.3