Làm cách nào để tạo khóa SSH máy chủ thông qua ansible?


11

Tôi đang cố gắng tạo lại khóa máy chủ ssh trên một số ít máy chủ từ xa thông qua ansible (và ssh-keygen), nhưng các tệp dường như không hiển thị. Playbook chạy OK, nhưng các tập tin trên remote không bị thay đổi.

Tôi cần phải dùng đến biện pháp echo -ehack vì các điều khiển từ xa này đang chạy Ubuntu 14.04 và không phải là phiên bản chính xác python-pexpectcó sẵn (theo ansible).

Tôi đang thiếu gì? Playbook và đầu ra của tôi dưới đây:

vở kịch

---
- hosts: all
  become: true
  gather_facts: false

  tasks:
    - name: Generate /etc/ssh/ RSA host key
      command : echo -e 'y\n'|ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -C "" -N ""
      register: output
    - debug: var=output.stdout_lines

    - name: Generate /etc/ssh/ DSA host key
      command : echo -e 'y\n'|ssh-keygen -q -t dsa -f /etc/ssh/ssh_host_dsa_key -C "" -N ""
      register: output
    - debug: var=output.stdout_lines

    - name: Generate /etc/ssh/ ECDSA host key
      command : echo -e 'y\n'|ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -C "" -N ""
      register: output
    - debug: var=output.stdout_lines

đầu ra

$ ansible-playbook ./playbooks/ssh-hostkeys.yml -l myhost.mydom.com, 
SUDO password: 

PLAY [all] **********************************************************************************************

TASK [Generate /etc/ssh/ RSA host key] ******************************************************************
changed: [myhost.mydom.com]

TASK [debug] ********************************************************************************************
ok: [myhost.mydom.com] => {
    "output.stdout_lines": [
        "y", 
        "|ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -C  -N "
    ]
}

TASK [Generate /etc/ssh/ DSA host key] ******************************************************************
changed: [myhost.mydom.com]

TASK [debug] ********************************************************************************************
ok: [myhost.mydom.com] => {
    "output.stdout_lines": [
        "y", 
        "|ssh-keygen -q -t dsa -f /etc/ssh/ssh_host_dsa_key -C  -N "
    ]
}

TASK [Generate /etc/ssh/ ECDSA host key] ****************************************************************
changed: [myhost.mydom.com]

TASK [debug] ********************************************************************************************
ok: [myhost.mydom.com] => {
    "output.stdout_lines": [
        "y", 
        "|ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -C  -N "
    ]
}

PLAY RECAP **********************************************************************************************
myhost.mydom.com : ok=6    changed=3    unreachable=0    failed=0  

Câu trả lời:


14

Theo như tôi biết lý do duy nhất tại sao bạn cần chuyển một 'y' sang ssh-keygen, là nếu lệnh của bạn thay thế một tệp hiện có. Theo tôi đây không phải là một cách tốt để làm một cái gì đó từ một công cụ quản lý cấu hình.

Bạn nên điều chỉnh các nhiệm vụ của mình để làm cho chúng bình thường. Cụ thể nếu bạn thêm creates: filenamelệnh vào lệnh của mình, thì các khóa mới sẽ chỉ được tạo khi chúng chưa tồn tại, thay vì được thay thế mỗi khi bạn chạy playbook đó.

---
- hosts: all
  become: true
  gather_facts: false

  tasks:
  - name: Generate /etc/ssh/ RSA host key
    command : ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -C "" -N ""
    args:
      creates: /etc/ssh/ssh_host_rsa_key

  - name: Generate /etc/ssh/ DSA host key
    command : ssh-keygen -q -t dsa -f /etc/ssh/ssh_host_dsa_key -C "" -N ""
    args:
      creates: /etc/ssh/ssh_host_dsa_key

  - name: Generate /etc/ssh/ ECDSA host key
    command : ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -C "" -N ""
    args:
      creates: /etc/ssh/ssh_host_ecdsa_key

Nếu vì một lý do nào đó, bạn muốn thay thế các khóa đó chẳng hạn nếu chúng quá cũ hoặc một cái gì đó bạn có thể muốn thêm một tác vụ khác để xóa chúng. Đây là một xóa đơn giản

- file:
    state: absent:
    path: "{{item}}"
  loop:
  - /etc/ssh/ssh_host_rsa_key
  - /etc/ssh/ssh_host_dsa_key
  - /etc/ssh/ssh_host_ecdsa_key

Nếu bạn muốn xóa các tệp được tạo trước một thời gian nhất định, bạn có thể sử dụng mô-đun stat để truy xuất chi tiết về các tệp này và whenđiều kiện thiết lập để loại bỏ có chọn lọc nếu chúng cũ hơn một ngày nào đó hoặc một cái gì đó.


Ví dụ tuyệt vời và cảm ơn về những suy nghĩ về việc duy trì sự bình tĩnh. Đối với trường hợp sử dụng của tôi, tôi đang cung cấp Máy ảo nhân bản để luôn có các phím để ghi đè. Tôi cần loại tùy chọn hạt nhân để loại bỏ và thay thế.
Lỗi máy chủ

Nếu bạn luôn muốn loại bỏ nó, thì có lẽ tôi sẽ thực hiện file: state:absent ...phương pháp tiếp cận công cụ đường ống đến ssh-keygen. Mặc dù có lẽ không có nhiều sự khác biệt.
Zoredache

À, được rồi Điều đó có ý nghĩa hơn. Tôi đã không biết về absentmột vài ngày trước. Hiệu quả sẽ xóa tập tin trước khi tạo lại khóa. Đó là một cách tiếp cận rõ ràng hơn nhiều. Cảm ơn.
Lỗi máy chủ

6

commandMô-đun ansible không truyền lệnh qua shell . Điều này có nghĩa là bạn không thể sử dụng các toán tử vỏ như đường ống và đó là lý do tại sao bạn nhìn thấy biểu tượng đường ống trong đầu ra. Theo như ansible có liên quan, nó đã thực thi lệnh echovới tất cả phần còn lại của dòng làm đối số echo.

Nếu bạn cần dòng lệnh được xử lý bởi shell, sử dụngshell thay vì command.

Và, phải có một cách tốt hơn để tạo lại khóa máy chủ ssh, nhưng tôi không thể tìm thấy ngay bây giờ ...


Cảm ơn shell và mẹo lệnh (hiện đang hoạt động tốt) Tôi không biết - vẫn còn khá mới đối với ansible
Server Fault

Về câu lệnh cuối cùng (ít nhất là trên CentOS / RHEL) nếu bạn loại bỏ các khóa cũ và khởi động lại các khóa máy chủ daemon được tạo lại cho bạn. Bạn sẽ cần phải khởi động lại dịch vụ này vì vậy điều này chắc chắn có vẻ tốt hơn.
Aaron Copley

@AaronCopley Tôi đã đề cập nhiều hơn đến vai trò Ansible hơn là dịch vụ phân phối. Tôi biết rằng hầu hết các phân phối chính đều có dịch vụ systemd tạo khóa máy chủ ssh. Thật không may, dịch vụ này có những khác biệt cụ thể về phân phối (thậm chí nó khác nhau giữa CentOS và Fedora). Một vai trò sẽ là một cách hay để gói gọn tất cả những thứ đó, nhưng tôi không thể tìm thấy một cách thủ công.
Michael Hampton

Đừng lo lắng, chỉ cần nghĩ rằng tôi sẽ đề cập đến nó. (Bạn có thể biết, nhưng OP có thể không.)
Aaron Copley

@AaronCopley - tình cờ, đây là những gì tôi đã làm. các echo ...chút không làm việc sau một giây (Tôi đã được thử nghiệm trong /tmp/đó các phím không tồn tại lần đầu tiên xung quanh). Tôi đã sử dụng để loại bỏ các khóa máy chủ trước tiên, như bạn đã đề cập, và tạo ra các khóa mới. Theo như các khóa tự động được phục hồi, điều này phụ thuộc vào phân phối của bạn, đúng không? Không phải tất cả các bản phân phối Linux đều sử dụng systemd.
Lỗi máy chủ

2

Sử dụng mô-đun đặc biệt cho nhiệm vụ này:

- name: Generate an OpenSSH keypair with the default values (4096 bits, rsa)
  openssh_keypair:
    path: /home/youruser/.ssh/id_rsa
    owner: youruser
    group: youruser

- name: Fix owner of the generated pub key
  file:
    path: /home/youruser/.ssh/id_rsa.pub
    owner: youruser
    group: youruser

Đó không phải là khóa máy chủ ssh
KumZ

1

xin lỗi, nhưng tôi không thể sử dụng "tạo" trong một nhiệm vụ. tôi nhận được lỗi sau:

ERROR! 'creates' is not a valid attribute for a Task

Thông thường, tôi sử dụng các tác vụ sau:

- name: remove existing ssh_host keys
  file: path={{ item }} state=absent
  with_items:
    - "/etc/ssh/ssh_host_rsa_key"
    - "/etc/ssh/ssh_host_dsa_key"
    - "/etc/ssh/ssh_host_ecdsa_key"

- name: Generate /etc/ssh/ RSA host key
  command : ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -C "" -N ""

- name: Generate /etc/ssh/ DSA host key
  command : ssh-keygen -q -t dsa -f /etc/ssh/ssh_host_dsa_key -C "" -N ""

- name: Generate /etc/ssh/ ECDSA host key
  command : ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -C "" -N ""

2
Sử dụng phiên bản hiện tại của Ansible.
Michael Hampton

Bạn nói đúng, phiên bản Ansible của tôi hơi cũ: 2.0.0.2 ... (Trên Ubuntu 16.04). Tôi phải thay đổi !
MaxiReglisse

1

@Zoredache có câu trả lời đúng nhưng không thành công (được ghi chú bởi @MaxiReglisse) cho các phiên bản gần đây của Ansible. Sử dụng mã sau đây thay thế:

---
- hosts: all
  become: true
  gather_facts: false

  tasks:
  - name: Generate /etc/ssh/ RSA host key
    command : ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -C "" -N ""
    args:
      creates: /etc/ssh/ssh_host_rsa_key

1

Một lựa chọn khác là sử dụng mô-đun người dùng . Mặt tích cực của điều này là bạn sẽ nhận được một nhiệm vụ bình thường. Dưới đây là một ví dụ về cách tạo khóa ssh trên localhost:

- name: Generate ssh keys
  local_action:
    module: "user"
    name: "{{ lookup('env','USER') }}"
    generate_ssh_key: true
    ssh_key_type: "{{ item.0 }}"
    ssh_key_bits: "{{ item.1 }}"
    ssh_key_file: "{{ playbook_dir }}/{{ item.0 }}_{{ item.1 }}_key"
  with_together:
  - [ 'rsa', 'dsa' ]
  - [ 2048, 1024 ]
  loop_control:
    label: "{{ item.0 }}_{{ item.1 }}_key"

- name: Copy generated ssh keys to remote machine
  copy:
    src: "{{ playbook_dir }}/{{ item.0 }}_{{ item.1 }}_key"
    dest: "/etc/ssh/ssh_host_{{ item.0 }}_key{{ item.1 }}"
  with_nested:
  - [ 'rsa', 'dsa' ]
  - [ '', '.pub' ]
  notify:
  - Restart sshd
  loop_control:
    label: "/etc/ssh/ssh_host_{{ item.0 }}_key{{ item.1 }}"

1
Không phải là cho khóa người dùng, không phải khóa máy chủ?
MadHatter

Bạn cũng có thể sử dụng nó cho các khóa máy chủ vì nó thực sự giống nhau. Chỉ cần đừng quên khôi phục bối cảnh selinux nếu bạn sử dụng SELinux trong chế độ thực thi
HeroFromEarth

Nó không rõ ràng với tôi từ các tài liệu mà bạn có thể. Nếu bạn viết lại câu trả lời của mình để nó hiển thị rõ ràng các khóa máy chủ đang được tạo, tôi sẽ xóa downvote của mình.
MadHatter

Được rồi, có lẽ nó không rõ ràng. Tôi đã thêm một nhiệm vụ khác để giải thích cách sao chép các phím này ở máy từ xa. Và tất nhiên đó chỉ là trường hợp của tôi (tôi cần cùng một khóa trên một số máy cho một cụm vì vậy tôi cần tạo chúng trên localhost) và tôi khá chắc chắn rằng bạn có thể sử dụng mô-đun 'người dùng' để tạo khóa cho máy chủ ssh trên máy từ xa (xem 'ssh_key_file')
HeroFromEarth

Tôi vẫn không chắc chắn đó là bất cứ điều gì khác ngoài hack (nhất là vì nó để lại cho một người dùng một bản sao của khóa riêng của máy chủ!) Nhưng ít nhất đó là thứ sẽ trả lời câu hỏi khi được hỏi, vì vậy tôi đã xóa downvote.
MadHatter

0

Sử dụng mô-đun openssh_key Pair và ủy quyền để tạo và triển khai các khóa cùng một lúc mà không lưu nó vào máy chủ lưu trữ ansible của bạn.

- openssh_keypair:
    group: root
    owner: root
    path: /some/path/in/your/server
    register: ssh_key

- name: Store public key into origin
  delegate_to: central_server_name
  authorized_key:
     key: "{{ssh_key.public_key}}"
     comment: "{{ansible_hostname}}"
     user: any_user_on_central
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.