Tạo người dùng không root và vô hiệu hóa SSH gốc trong Ansible


10

Tôi đang cố gắng viết một Playbook Ansible để bootstrap các máy chủ của tôi. Theo mặc định trên Linode tôi chỉ có thể đăng nhập bằng root bằng mật khẩu, do đó, playbook của tôi đăng nhập bằng root, tạo người dùng không root bằng khóa SSH và vô hiệu hóa root và mật khẩu SSH.

Đây là một vấn đề vì bây giờ tôi không thể chạy lại playbook đó vì đăng nhập root bị vô hiệu hóa! Tôi muốn playbook là idempotent và không phải thêm và xóa các máy chủ sau khi bootstrapping chúng.


1
Bạn có thể tìm thấy một số cảm hứng ở đây .
Konstantin Suvorov

Câu trả lời:


5

Tôi thích làm theo cách này:

- hosts: all
  remote_user: root
  gather_facts: no
  tasks:
    - name: Check ansible user
      command: ssh -q -o BatchMode=yes -o ConnectTimeout=3 ansible@{{ inventory_hostname }} "echo OK"
      delegate_to: 127.0.0.1
      changed_when: false
      failed_when: false
      register: check_ansible_user
    - block:
      - name: Create Ansible user
        user:
          name: ansible
          comment: "Ansible user"
          password: $6$u3GdHI6FzXL01U9q$LENkJYHcA/NbnXAoJ1jzj.n3a7X6W35rj2TU1kSx4cDtgOEV9S6UboZ4BQ414UDjVvpaQhTt8sXVtkPvOuNt.0
          shell: /bin/bash
      - name: Add authorized key
        authorized_key:
          user: ansible
          key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
          exclusive: yes
      - name: Allow sudo for ansible
        copy:
          content: ansible ALL=(ALL) ALL
          dest: /etc/sudoers.d/ansible
          mode: 0600
      when: check_ansible_user | failed

Tôi cố gắng kết nối với máy chủ từ xa với người dùng ansible của tôi. Nếu điều này là không thể (trong lần chạy đầu tiên), tôi kết nối với quyền root và tạo người dùng ansible cùng với authorized_keystệp và sudoquyền của nó .

Trong các lần chạy tiếp theo, kết nối với tư cách là người dùng có thể hoạt động, do đó, khối tác vụ có thể bị bỏ qua.

Khi máy chủ từ xa được khởi động, tôi có thể tiếp tục với người dùng ansible và become:

- hosts: all
  remote_user: ansible
  become: yes
  roles:
    - ...

Bạn có tự thay đổi remote_usertrong playbook của mình sau lần chạy đầu tiên không? Đó không phải là idempotent. Tôi hy vọng tôi đang thiếu một cái gì đó.
Deefour

1
Bạn làm, tôi không thay đổi bất cứ điều gì bằng tay. Hai bộ mã đại diện cho hai vở kịch khác nhau (có thể giúp tưởng tượng chúng như được gọi bootstrap.ymlsite.yml, site.ymlbao gồm bootstrap.ymltrước mọi thứ khác). Nếu nhiệm vụ đầu tiên bootstrap.ymlthất bại, tất cả các nhiệm vụ khác của trò chơi này sẽ bị bỏ qua và site.ymltiếp quản.
Michael Trojanek

sao chép-dán đoạn mã, nhưng bỏ qua khối nhiệm vụ : "skip_reason": "Conditional result was False". Chạy vở kịch với -vvvchương trình trả về cuộc gọi ssh"msg": "non-zero return code", "rc": 255,
Rafa

Tôi đã sửa đổi whenđiều kiện:when: not "OK" in check_ansible_user.stdout
Rafa

2

Tôi sẽ làm như sau:

  • tạo một vai trò (giống như 'cơ sở') trong đó bạn (trong số những thứ khác), tạo một người dùng phù hợp (và quy tắc sudo) để có thể sử dụng
  • tạo hoặc điều chỉnh vai trò của bạn cho SSH, để quản lý sshd_config(Tôi có xu hướng khuyên bạn nên quản lý toàn bộ tệp, sử dụng một template, nhưng điều đó tùy thuộc vào bạn) và vô hiệu hóa thông tin đăng nhập gốc
  • làm cho vai trò SSH của bạn phụ thuộc vào vai trò cơ bản, ví dụ: sử dụng meta.

Đối với vai trò đầu tiên (cơ sở), tôi có xu hướng sử dụng một cái gì đó như:

 name: base | local ansible user | create user
  user:
    name: "{{ local_ansible_user }}"
    group: "{{ local_ansible_group }}"
    home: "/home/{{ local_ansible_user }}"
    state: present
    generate_ssh_key: "{{ local_ansible_generate_key }}"
    ssh_key_bits: 4096
    ssh_key_type: rsa
  tags:
    - ansible
    - local_user

- name: base | local ansible user | provision authorised keys
  authorized_key:
    user: "{{ local_ansible_user }}"
    state: present
    key: "{{ item }}"
  with_items: "{{ local_ansible_authorised_keys }}"
  tags:
    - ansible
    - authorised_keys

Đối với cấu hình SSH, tôi sẽ sử dụng:

- name: openssh | server | create configuration
  template:
    src: sshd_config.j2
    dest: /etc/ssh/sshd_config
    owner: root
    group: root
    mode: "0640"
    validate: "/usr/sbin/sshd -tf %s"
  notify:
    - openssh | server | restart
  tags:
    - ssh
    - openssh

Phụ thuộc vai trò của Ansible được ghi lại ở đây .

Bạn cũng có thể chỉ cần sử dụng thứ tự trong playbook của bạn để làm điều này.

Tôi có một số nội dung có thể tìm thấy trên github (từ đó đã thực hiện phần trên), nếu bạn muốn xem nó trong ngữ cảnh


2

Nếu bạn tạo các máy chủ của bạn trên Linode với mô-đun linode bạn có thể đăng ký return valuecác linodenhiệm vụ và bao gồm các nhiệm vụ bootstrap với một điều kiện kiểm tra outout của nhiệm vụ linode. Đó là idempotent. Hãy thử một cái gì đó như thế này:

- linode:
    api_key: 'longStringFromLinodeApi'
    name: linode-test1
    plan: 1
    datacenter: 2
    distribution: 99
    password: 'superSecureRootPassword'
    private_ip: yes
    ssh_pub_key: 'ssh-rsa qwerty'
    swap: 768
    wait: yes
    wait_timeout: 600
    state: present
  register: linode_node

- include: bootstrap.yml
  when: linode_node.changed

bootstrap.yml sẽ chứa tất cả các tác vụ cần thiết để vô hiệu hóa đăng nhập gốc ssh, v.v.


-1

Có lẽ bạn chỉ có thể sửa đổi ansible_ssh_usertrong kho sau khi bạn đã khởi động máy chủ?

[targets]

other1.example.com ansible_connection=ssh ansible_ssh_user=root # new host
other2.example.com ansible_connection=ssh ansible_ssh_user=user # bootstrapped host
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.