Làm cách nào để tạo mật khẩu sử dụng Ansible nếu khóa bị từ chối?


14

Các phiên bản máy chủ mới của tôi được cấu hình để đăng nhập vào root thông qua ssh bằng mật khẩu. Tôi muốn Playbook Ansible của tôi cấu hình lại nó để sử dụng các khóa thay vào đó và vô hiệu hóa đăng nhập root bằng mật khẩu trong lần chạy đầu tiên, vì vậy tôi cần một cái gì đó như thế này:

  • cố gắng đăng nhập bằng chìa khóa
  • nếu không thể đăng nhập bằng khóa:

    • đăng nhập bằng mật khẩu
    • thêm khóa vào ủy quyền
    • vô hiệu hóa đăng nhập root bằng mật khẩu
    • tùy chọn kết nối lại bằng phím
  • làm các nhiệm vụ khác

Làm thế nào tôi có thể hoàn thành nó?

EDIT : Để rõ ràng, tôi không hỏi làm thế nào để thêm khóa hoặc vô hiệu hóa root, đó chỉ là cho ngữ cảnh. Tôi đang hỏi làm thế nào để sao lưu mật khẩu nếu nó không thể xác thực bằng khóa. Với --ask-passhoặc ansible_ssh_passđược đặt, Ansible thậm chí sẽ không thử sử dụng xác thực khóa chung


Câu hỏi hay, bạn đã thử những gì cho đến nay?
dawud

1
Tôi đã đưa cấu hình ssh vào một playbook riêng và tôi chạy nó với tùy chọn -k, sau đó tôi chạy playbook chính mà không có -k (sử dụng khóa từ tác nhân). Tôi đã hy vọng nó có thể được gói trong một
vở kịch

@ petr0 Điều này hoạt động với tôi khi mật khẩu hỏi-mật dành cho người dùng khác với khóa (tức là khi bạn chuyển người dùng từ xa sau khi tắt ssh mật khẩu). Không chắc nó sẽ giúp ích.
DylanYoung

Câu trả lời:


6

Bạn có thể thử PreferredAuthenticationstùy chọn, đặt nó thành publickey,password. Mặc định bao gồm những thứ tự này theo thứ tự này, cùng với các tùy chọn khác, do đó, có thể cài đặt này. Thêm nó thông qua -ohoặc khách hàng ssh_configcó thể ngăn chặn điều này.

Bạn có thể sử dụng một tập lệnh bao bọc. Ví dụ: với cái này trong key_or_password.shpass.shcung cấp mật khẩu, việc chạy bash key_or_password.sh root@hostsẽ thử một khóa công khai theo sau là đăng nhập mật khẩu không tương tác.

export DISPLAY=dummy:0
export SSH_ASKPASS=$PWD/pass.sh
exec setsid ssh -v -o 'PreferredAuthentications publickey,password' "$@"

Nhật ký cho biết phương pháp nào đã thành công với, vd

debug1: Authentication succeeded (publickey).

7

Đây là những gì tôi làm nếu ansible_userkhác với 'lần chạy đầu tiên' của Playbook (ví dụ: nếu bạn chỉ có một rootngười dùng và bạn sẽ thiết lập một người dùng mới bằng khóa SSH):

  • Lưu trữ mật khẩu ansible_passnhư bạn muốn nếu bạn đang sử dụng thông tin đăng nhập mật khẩu (hãy nhớ sử dụng Vault) đây sẽ là mật khẩu của người dùng bạn đang sử dụng cho 'lần chạy đầu tiên' của Playbook.
  • Đặt ansible_userthành tên người dùng của người dùng bạn muốn sử dụng sau lần chạy đầu tiên khi bạn có người dùng thiết lập chính xác trên máy chủ.
  • ansible_user_first_runVí dụ, đặt một biến cho người dùng bạn sẽ sử dụng cho 'lần chạy đầu tiên' của Playbook root.
  • Sử dụng lệnh cục bộ để cố gắng kết nối với máy chủ bằng khóa SSH chính xác, sử dụng ignore_errorschanged_when: False
  • Nếu thất bại, hãy cập nhật ansible_usergiá trị củaansible_user_first_run

Đây là mã:

---
- name: Check if connection is possible
  command: ssh -o User={{ ansible_user }} -o ConnectTimeout=10 -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes {{ inventory_hostname }} echo "Worked"
  register: result
  connection: local
  ignore_errors: yes
  changed_when: False
- name: If no connection, change user_name
  connection: local
  set_fact:
    ansible_user: "{{ ansible_user_first_run }}"
  when: result|failed

Lưu ý: Đáng để thiết lập transport = sshvì paramiko có thể bất ngờ không thể đăng nhập vào máy chủ trong một số cấu hình (ví dụ: khi máy chủ được thiết lập không chấp nhận mật khẩu và trước tiên bạn đang thử bằng một khóa sau đó là mật khẩu ... kỳ lạ!) Ngoài ra vận chuyển ssh là nhanh hơn, vì vậy dù sao nó cũng có giá trị.

Lưu ý thêm: Nếu bạn đang sử dụng phương pháp này, bạn cần chỉ định gather_facts: falsetrong tệp định nghĩa Playbook để các tác vụ thu thập thiết lập / thực tế không tự động chạy trước khi bạn đến giai đoạn kiểm tra mật khẩu. Nếu bạn cần bất kỳ sự thật có thể tìm thấy nào, bạn sẽ cần gọi rõ ràng setupvai trò của mình trước khi truy cập bất kỳ dữ liệu nào có sẵn ở những nơi như ansible_devices, v.v. Một cách tốt để làm điều này là gọi setupvới một whenmệnh đề kiểm tra xem thực tế bạn đang sử dụng có trống hay không trước khi bạn gọi nó trong vai trò của mình.


Giải pháp của bạn là tốt nhưng bạn phải thêm một gather_facts: nođiểm dừng để cố gắng kết nối khi khởi chạy playbook :)
k4cy

Bạn nói đúng. Tôi đã tập hợp_facts được tắt cho tất cả các sách phát của mình để tôi phải gọi 'thiết lập' một cách rõ ràng. Tôi quên đề cập đến điều này trong câu trả lời, tôi sẽ cập nhật nó ngay bây giờ.
Tom Bull

5

Bạn có thể sử dụng --ask-passkhi chạy ansible-playbook.

Đối với các nhiệm vụ khác mà bạn yêu cầu, có thể đạt được bằng nhiều cách khác nhau, ví dụ: mô-đun sao chép.
Vô hiệu hóa đăng nhập root cũng có thể được thực hiện, ví dụ. bằng cách tạo khuôn sshd_confhoặc chèn dòng trong tập tin conf.


--ask-pass (giống như -k) là những gì tôi đang làm và tôi đã viết về nó trong phần bình luận ở trên
petr0
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.