Ansible bị mắc kẹt trong việc thu thập dữ kiện


52

Tôi đang gặp một số vấn đề kỳ lạ với hộp ansible của mình (vagrant).

Tất cả mọi thứ đã làm việc ngày hôm qua và playbook của tôi hoạt động tốt.

Hôm nay, ansible treo trên "sự kiện thu thập"?

Đây là đầu ra dài dòng:

<5.xxx.xxx.xxx> ESTABLISH CONNECTION FOR USER: deploy
<5.xxx.xxx.xxx> REMOTE_MODULE setup
<5.xxx.xxx.xxx> EXEC ['ssh', '-C', '-tt', '-vvv', '-o', 'ControlMaster=auto', '-
o', 'ControlPersist=60s', '-o', 'ControlPath=/home/vagrant/.ansible/cp/ansible-s
sh-%h-%p-%r', '-o', 'Port=2221', '-o', 'KbdInteractiveAuthentication=no', '-o',
'PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o
', 'PasswordAuthentication=no', '-o', 'User=deploy', '-o', 'ConnectTimeout=10',
'5.xxx.xxx.xxx', "/bin/sh -c 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1411372677
.18-251130781588968 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1411372677.18-2
51130781588968 && echo $HOME/.ansible/tmp/ansible-tmp-1411372677.18-251130781588
968'"]

1
Nó treo trong bao lâu? Bạn đã thử vagrant sshvà điều tra trong quá trình treo để xem có gì hữu ích trong psnetstatkhông? Ngoài ra, một trong những nghi phạm đầu tiên bị treo là DNS - kiểm tra xem DNS có phân giải được từ bên trong máy ảo không.
Antonis Christofides

1
Cảm ơn bạn đã bình luận. Giải pháp rất đơn giản, phá hủy mơ hồ và mơ hồ ... Tôi vẫn nghĩ thật lạ khi nó ngừng hoạt động?
Bj Blazkowicz

1
Tôi đã có một vấn đề với Ansible bị đình trệ nếu có gắn kết không thể truy cập (cifs-).
rektide

1
Chỉ cần nó xảy ra, nó đã được gây ra bởi một khóa máy chủ lỗi thời trong tệp know_hosts. Điều kỳ lạ là kết nối không bị lỗi như thường lệ trong trường hợp này.
GnP

Bạn có thể kiểm tra nhật ký sshd trong hộp vagrant không? Bạn có thể cần phải đặt "LogLevel DEBUG" trong / etc / ssh / sshd_config nhưng điều đó có thể cung cấp thêm thông tin về những gì đang diễn ra.
Pablo Martinez

Câu trả lời:


31

Tôi đã gặp vấn đề tương tự với Ansible ping trên Vagrant, nó đột nhiên bị kẹt mà không có lý do và trước đây đã hoạt động rất tốt. Không giống như bất kỳ vấn đề nào khác như ssh hoặc vấn đề liên kết, nó chỉ chết mãi mãi mà không có thời gian chờ.

Một điều tôi đã làm để giải quyết vấn đề này là dọn dẹp ~/.ansiblethư mục và nó chỉ hoạt động trở lại. Tôi không thể tìm hiểu tại sao, nhưng nó đã được giải quyết.

Nếu bạn đã thay đổi để có lại nó, hãy thử làm sạch ~/.ansiblethư mục trước khi bạn làm mới Vagrant.


3
rm -rf ~/.ansibleđã không làm việc cho tôi trên El Captitan
Quanlong

8
rm -rf ~ / .ansible / cp là đủ
melihovv

20

Đối với tôi, mô-đun thiết lập đã bị kẹt trên giá đỡ NFS đã chết.

Nếu bạn thực hiện "df" trên máy của mình và không có gì xảy ra, bạn có thể gặp trường hợp tương tự.

PS: nếu bạn không thể chia sẻ NFS share / mountpoint, hãy cân nhắc sử dụng "umount -l" xấu


yup, đó là nó!
Saurabh Nanda

Tôi nhận được xung quanh vấn đề ban đầu bằng cách thiết lập gather_factsđể Falsenhưng mẹo này thực sự được lưu trong ngày vì đó là vấn đề của tôi quá.
pkaramol

18

Ansible có thể bị treo như thế này vì một số lý do, thường là do sự cố kết nối hoặc do mô-đun thiết lập bị treo. Đây là cách thu hẹp vấn đề để bạn có thể giải quyết.

Ansible không thể kết nối với máy chủ đích

Vấn đề về khóa máy chủ (know_hosts)

1) Trên các phiên bản cũ hơn của Ansible (2.1 trở lên), Ansible sẽ không luôn cho bạn biết nếu khóa máy chủ cho đích không tồn tại trên nguồn hoặc nếu có sự không khớp.

Giải pháp: hãy thử mở kết nối SSH có cùng tham số đến đích đó. Bạn có thể tìm thấy các lỗi SSH bạn cần giải quyết và sau đó lệnh sẽ hoạt động.

2) Đôi khi Ansible hiển thị thông báo kết nối SSH cho bạn ở giữa các trạng thái khác, khiến Ansible "đóng băng" trong tác vụ đó:

Warning: the ECDSA host key for 'myhost' differs from the key for the IP address '10.10.1.10'
Offending key for IP in /etc/ssh/ssh_known_hosts:246
Matching host key in /etc/ssh/ssh_known_hosts:477
Are you sure you want to continue connecting (yes/no)?

Trong trường hợp này, chỉ cần gõ "có" cho nhiều câu hỏi SSH như bạn đã hỏi sẽ cho phép trò chơi tiếp tục. Sau đó, bạn có thể khắc phục các sự cố đã biết của root_hosts.

Vấn đề xác thực khóa riêng

Nếu sử dụng xác thực dựa trên khóa so với mật khẩu, các vấn đề khác bao gồm:

  • Khóa riêng có thể không được thiết lập đúng ở đích
  • Khóa riêng có thể có quyền cục bộ không chính xác (chỉ có thể đọc được bởi người dùng đang chạy công việc Ansible)

Giải pháp: hãy thử chạy ansible -m ping <destination> -kvới máy chủ sự cố - nếu điều đó không hiệu quả, hãy thử các giải pháp Vấn đề chính của Máy chủ ở trên.

Ansible không thể nhanh chóng thu thập sự thật

Các setupmô-đun (khi chạy tự động vào lúc bắt đầu của một ansible-playbookchạy, hoặc khi chạy thủ công như ansible -m setup <host>) thường có thể treo khi thu thập dữ kiện phần cứng (ví dụ nếu nhận được thông tin đĩa từ máy chủ với i cao / o, xấu gắn kết mục, vv).

Giải pháp: hãy thử chạy ansible -m setup -a gather_subset=!all <destination>. Nếu điều này hoạt động, bạn nên xem xét việc thiết lập dòng này trong ansible.cfg:

gather_subset=!hardware

1
Chuyển đến'ather_subset =! Phần cứng 'để thiết lập hoạt động cho một VM cụ thể không phản hồi.
JamesP

2
Đã sửa cho tôi. Điểm gắn kết lộn xộn, tôi nghĩ. Tôi đã có một VM mà tôi đã sử dụng để cung cấp ansible và nó hoạt động cho đến khi tôi thêm một chia sẻ NFS mới. Bây giờ thì không, cho đến khi tôi thêm vào ở trên.
David Boshton

Hóa ra là một vấn đề quan trọng trong trường hợp của tôi. Máy chủ đã được định hình lại, vì vậy lần chạy đầu tiên của tôi không thành công và tôi đã chạy ssh-keygen -Rlệnh được đề xuất để xóa khóa vi phạm. Tôi đã chạy ssh một lần để lấy khóa, nhưng lần chạy thứ hai bị treo. Khi tôi chạy lại ssh, tôi nhận được lời nhắc xác nhận chính không mong muốn. Tôi nhận ra rằng có một khóa vi phạm cần phải được loại bỏ, vì vậy sau khi xóa ssh đó và chạy lại, tôi nhận được Warning: Permanently added the ECDSA host key ...tin nhắn và sau đó chỉ tiếp tục thu thập thực tế.
haridsv

Tôi có thể xác nhận quan sát từ @DavidBoshton. Có vấn đề này trên máy ảo có thư mục NFS được gắn, không có sẵn (vấn đề máy chủ NFS). Sau khi sửa máy chủ NFS, nó đã hoạt động
tschale

7

Tôi đã có một vấn đề tương tự với Ansible treo tại Lathering Fact. Tôi đã giảm kịch bản của mình xuống một dấu nhắc không có nhiệm vụ hoặc vai trò nào và nó vẫn bị treo.

Tôi tìm thấy 12 quy trình treo có thể tìm thấy trong danh sách quy trình của tôi đã tích lũy trong ngày.

/usr/bin/python /tmp/ansible_Jfv4PA/ansible_module_setup.py
/usr/bin/python /tmp/ansible_M2T10L/ansible_module_setup.py

Khi tôi giết chúng, nó bắt đầu hoạt động trở lại.


5

Có nhiều lý do tại sao ansible có thể bị treo khi thu thập thực tế, nhưng trước khi đi xa hơn, đây là thử nghiệm đầu tiên bạn nên thực hiện trong bất kỳ tình huống nào như vậy:

ansible -m ping <hostname>

Thử nghiệm này chỉ kết nối với máy chủ và thực thi đủ mã để trả về:

<hostname> | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

Nếu điều này hoạt động, bạn có thể loại trừ khá nhiều vấn đề thiết lập hoặc kết nối, vì nó chứng minh rằng bạn có thể giải quyết tên máy chủ đích, mở kết nối, xác thực và thực thi mô-đun ansible với trình thông dịch python từ xa.

Bây giờ, đây là một danh sách (không đầy đủ) những điều có thể sai ở phần đầu của một cuốn sách:

Lệnh được thực thi bởi ansible đang chờ một đầu vào tương tác

Tôi có thể nhớ điều này xảy ra trên các phiên bản cũ hơn, trong đó một lệnh sẽ chờ một đầu vào tương tác sẽ không bao giờ đến, chẳng hạn như mật khẩu sudo (khi bạn quên một -Kcông tắc) hoặc chấp nhận dấu vân tay của máy chủ ssh mới (cho mục tiêu mới người dẫn chương trình).

Các phiên bản hiện đại của ansible xử lý cả hai trường hợp này một cách duyên dáng và gây ra lỗi ngay lập tức cho các ứng dụng thông thường, vì vậy trừ khi bạn làm những việc như gọi ssh hoặc sudo cho mình, bạn không nên gặp phải vấn đề này. Và ngay cả khi bạn đã làm, nó sẽ là sau khi thu thập thực tế.

Kết nối chủ ssh chết

Có một số tùy chọn rất thú vị được truyền cho máy khách ssh, trong nhật ký gỡ lỗi được đưa ra ở đây:

  • ControlMaster=auto
  • ControlPersist=60s
  • ControlPath=/home/vagrant/.ansible/cp/ansible-ssh-%h-%p-%r

Các tùy chọn này được ghi lại trong man ssh_config .

Theo mặc định, ansible sẽ thử và thông minh về việc sử dụng kết nối ssh của nó. Đối với một máy chủ nhất định, thay vì tạo một kết nối mới cho mỗi nhiệm vụ trong trò chơi, nó sẽ mở nó một lần và giữ cho nó mở cho toàn bộ playbook (và thậm chí trên các playbook).

Điều đó tốt, vì việc thiết lập một kết nối mới chậm hơn và chuyên sâu về tính toán hơn là sử dụng kết nối đã có sẵn.

Trong thực tế, mọi kết nối ssh sẽ kiểm tra sự tồn tại của ổ cắm tại ~/.ansible/cp/some-host-specific-path. Kết nối đầu tiên không thể tìm thấy nó, vì vậy nó kết nối bình thường, và sau đó tạo ra nó. Mọi kết nối tiếp theo sau đó sẽ chỉ sử dụng ổ cắm này để đi qua kết nối đã được thiết lập.

Ngay cả khi kết nối được thiết lập cuối cùng cũng hết và đóng lại sau khi không được sử dụng đủ lâu, ổ cắm cũng bị đóng và chúng tôi quay lại hình vuông.

Càng xa càng tốt.

Tuy nhiên, đôi khi, kết nối thực sự chết, nhưng máy khách ssh vẫn xem xét nó được thiết lập. Điều này thường xảy ra khi bạn thực hiện Playbook từ máy tính xách tay của bạn và bạn mất kết nối WiFi (hoặc chuyển từ WiFi sang Ethernet, v.v.

Ví dụ cuối cùng này là một tình huống tồi tệ: bạn có thể ssh đến máy đích với cấu hình ssh mặc định, nhưng miễn là kết nối trước đó của bạn vẫn được coi là hoạt động, ansible thậm chí sẽ không thử thiết lập máy mới.

Tại thời điểm này, chúng tôi chỉ muốn thoát khỏi ổ cắm cũ này và cách đơn giản nhất để làm điều đó là loại bỏ nó:

# Delete all the current sockets (may disrupt currently running playbooks)
rm -r ~/.ansible/cp
# Delete only the affected socket (requires to know which one it is)
rm ~/.ansible/cp/<replace-by-your-socket>

Điều này là hoàn hảo cho một sửa chữa một lần, nhưng nếu nó xảy ra quá thường xuyên, bạn có thể cần phải tìm một sửa chữa dài hạn. Dưới đây là một số gợi ý có thể giúp hướng tới mục tiêu này:

  • Bắt đầu chơi từ máy chủ (với cách kết nối mạng ổn định hơn so với máy tính xách tay của bạn)
  • Sử dụng cấu hình ansible hoặc cấu hình máy khách ssh trực tiếp để tắt chia sẻ kết nối
  • Sử dụng cùng một tài nguyên, nhưng để tinh chỉnh thời gian chờ, để sự cố kết nối chính thực sự hết thời gian nhanh hơn

Xin lưu ý rằng tại thời điểm viết, một vài tùy chọn đã thay đổi (ví dụ: lần chạy mới nhất của tôi đã cho tôi ControlPath=/home/toadjaune/.ansible/cp/871b533295), nhưng ý tưởng chung vẫn còn hiệu lực.

Thu thập thực tế mất quá nhiều thời gian

Khi bắt đầu mỗi lần chơi, ansible thu thập rất nhiều thông tin về hệ thống mục tiêu và đưa nó vào Sự kiện . Đây là các biến mà sau đó bạn có thể sử dụng trong Playbook của mình và thường rất tiện dụng, nhưng đôi khi, việc nhận thông tin này có thể rất dài (điểm gắn kết xấu, đĩa có i / o cao, tải trọng cao)

Điều này đang được nói, bạn không thực sự cần sự thật để chạy một cuốn sách và gần như chắc chắn không phải tất cả chúng, vì vậy hãy thử và vô hiệu hóa những gì chúng ta không cần. Một số tùy chọn cho điều đó:

Đối với mục đích gỡ lỗi, thật sự thuận tiện khi gọi mô đun thiết lập trực tiếp từ dòng lệnh:

ansible -m setup <hostname>

Lệnh cuối cùng này sẽ treo cũng như playbook của bạn và cuối cùng là hết thời gian (hoặc thành công). Bây giờ, hãy thực hiện lại mô-đun, vô hiệu hóa mọi thứ chúng ta có thể:

ansible -m setup -a gather_subset='!all' <hostname>

Nếu điều này vẫn bị treo, bạn luôn có thể thử và vô hiệu hóa hoàn toàn mô-đun trong trò chơi của mình, nhưng thực sự có khả năng vấn đề của bạn là ở một nơi khác.

Tuy nhiên, nếu nó hoạt động tốt (và nhanh chóng), thì hãy xem tài liệu mô-đun . Bạn có hai lựa chọn:

  • Giới hạn việc thu thập thực tế vào một tập hợp con, ngoại trừ những gì bạn không cần (xem các giá trị có thể cho gather_subset)
  • gather_timeout cũng có thể giúp bạn khắc phục sự cố của mình bằng cách cho phép thêm thời gian (mặc dù đó sẽ là sửa lỗi hết thời gian chờ chứ không phải treo máy)

Các vấn đề khác

Rõ ràng, những thứ khác có thể đi sai. Một vài gợi ý để giúp gỡ lỗi:

  • Sử dụng mức độ dài tối đa có thể tìm thấy ( -vvvv), vì nó sẽ hiển thị cho bạn mọi lệnh được thực thi
  • Sử dụng pingsetupmô-đun trực tiếp từ dòng lệnh như đã giải thích ở trên
  • Cố gắng ssh bằng tay nếu ansible -m pingkhông hoạt động

4

Dmytro là một cái gì đó!

Ansible sử dụng FQDN của máy chủ. Nếu máy chủ của bạn không thể phân giải được DNS và bạn không có ánh xạ trong /etc/hostsansible sẽ đợi DNS hết thời gian.

Bằng cách thêm ::1 <fqdn>vào tệp máy chủ của các máy bạn đang kết nối Ansible sẽ nhận được FQDN ngay lập tức mà không cần thông qua DNS.

Lưu ý rằng máy chủ nên tra cứu máy chủ từ /etc/hosts, đây là mặc định cho hầu hết, nếu không phải tất cả, các hệ thống linux nhưng nếu việc chỉnh sửa của bạn /etc/nsswitch.confcũng có thể là một vấn đề.


2

Tôi gặp vấn đề tương tự. Không có thông tin hữu ích từ việc chạy ansible trong chế độ dài dòng.

Máy chủ đã được cung cấp lại trước khi chạy playbook.

Xóa máy chủ khỏi danh sách máy chủ đã biết đã sửa lỗi này bằng lệnh bên dưới.

$ ssh-keygen -f "~/.ssh/known_hosts" -R <hostname>
$ ssh-keygen -f "~/.ssh/known_hosts" -R <ip_address>

Lưu ý: Bạn cần xóa cả tên máy chủ và địa chỉ IP


Trong trường hợp của tôi, tôi đã sử dụng lại một địa chỉ IP. Do đó, hai khóa máy chủ đã có mặt trong tệp
know_hosts

1

Tôi không biết nếu bạn đang sử dụng một cuốn sách sudo - nhưng tôi đã và nó được treo trên mật khẩu sudo.

Từ tài liệu - bạn có thể giết nó, và sau đó sử dụng -K.

Chúc may mắn.


1

Có thể Dấu vân tay của hệ thống đích của bạn đã thay đổi, ví dụ như khi bạn cài đặt lại hệ điều hành máy chủ. Bạn cần phải xóa các mục trong known_hosts , ansible sẽ không thông báo rằng một mục không đáng tin cậy là vấn đề, nó sẽ chỉ bị mắc kẹt chính xác như bạn mô tả.


1

Có vẻ như ansible không thể xác thực ... vì vậy hãy sử dụng -k để cho phép ansible yêu cầu mật khẩu máy chủ .... như được hiển thị bên dưới:

ansible-playbook  -K -i hosts playbook.yml -vvvv

0

FQDN và tên máy chủ không khớp cũng có thể gây ra hangout. Tôi đã sử dụng FQDN với tên miền khác với tên miền máy chủ. Sau khi làm cho cả hai bằng nhau , ansible hoạt động hoàn hảo. Có thể so sánh khả năng so sánh FQDN và tên máy chủ trước khi thực hiện các tác vụ trên máy chủ từ xa. Hy vọng nó giúp!


0

Tôi đã giải quyết vấn đề này bằng cách đặt lại hộp vagrant

vagrant destroy
vagrant up

0

Trong trường hợp của tôi, ansible ngừng hoạt động ở giữa một nhiệm vụ. Lý do là vì nhân viên ssh của tôi ngừng hoạt động ( ssh-add -lkhông trả lại bất cứ thứ gì). Tôi khởi động lại mọi thứ và nó hoạt động trở lại. Vì vậy, hãy kiểm tra xem ssh-agent của bạn có hoạt động tốt không ( ssh-add -lkhông bị kẹt).


0

Xóa ~/.ansiblemột mình không làm điều đó cho tôi. Vì vậy, để kiểm tra những gì trong thư mục đó tôi chỉ cần thực hiện một ctrl-z (đặt quá trình vào chế độ ngủ) và kiểm tra, sau đó tiếp tục quá trình tìm kiếm thông qua fg. Tôi đã không xóa bất cứ điều gì trong trường hợp đó. nhưng sau khi nó tiếp tục. Vì vậy, tôi chỉ thử ctrl-z-> fgmột mình và nó cũng hoạt động. Cảm thấy như nhảy mưa, nhưng nếu người khác bị mắc kẹt, xin vui lòng thử nó.


0

Tôi đã khắc phục nguyên nhân của vấn đề này bằng cách làm theo lời khuyên từ Tại sao cuốn sách chơi ansible của tôi bị treo trong tập hợp Sự kiện tập hợp? bài viết trên blog.

Nó có thể được đơn giản hóa để:

  1. Đặt DEFAULT_KEEP_REMOTE_FILES=yesđể bảo vệ các lệnh và kích hoạt-vvvv

  2. Chạy lại playbook.

  3. Khi vở kịch sao chép lệnh shell cuối cùng được in (phần sau /bin/sh -c)

  4. Đăng nhập vào máy chủ thông qua ssh.

  5. Sử dụng straceđể phát lại bước cuối cùng của vở kịch. Lệnh bước được sao chép từ -vvvđầu ra. Ví dụ:strace -f /bin/sh -c "echo BECOME-SUCCESS-ltxvshvezrnmumzdprccoiekhjheuwxt; /usr/bin/python /home/user/.ansible/tmp/ansible-tmp-1527099315.31-224479822965785/setup.py"

  6. Kiểm tra xem cuộc gọi nào "bước" bị kẹt và sửa nó :)

Trong trường hợp của tôi, đó là một ổ đĩa mạng không thể truy cập ...


-1

Mật khẩu của Sudo là vấn đề. Đảm bảo rằng (1) bạn có thể phát hành 'sudo bất cứ thứ gì ' trên thiết bị đầu cuối mới mở (nơi mật khẩu không được lưu trong bộ nhớ cache) mà không cung cấp một (2) con rối đã không đảo ngược các thay đổi 'sudoers' thủ công trước đó của bạn.


1
Con rối? Con rối gì? Đây là một câu hỏi ansible.
Deer Hunter

Vâng tôi biết. Một số người có thể đã cài đặt con rối trên cùng một máy mà sử dụng ansible (đây thực sự là trường hợp của tôi một lần)
witkacy26
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.