สร้างผู้ใช้ที่ไม่ใช่รูทและปิดใช้งานรูท SSH ใน Ansible


9

ฉันพยายามเขียนเพลย์บุ๊ค Ansible เพื่อบูตเซิร์ฟเวอร์ของฉัน ตามค่าเริ่มต้นบน Linode ฉันสามารถลงชื่อเข้าใช้ด้วยรูทด้วยรหัสผ่านเท่านั้นดังนั้น playbook ของฉันจะล็อกอินเป็นรูทสร้างผู้ใช้ที่ไม่ใช่รูทด้วยคีย์ SSH และปิดใช้งานรูทและรหัสผ่าน SSH

นี่เป็นปัญหาเพราะตอนนี้ฉันไม่สามารถเรียกใช้ playbook นั้นอีกครั้งได้เนื่องจากการล็อกอินรูทถูกปิดใช้งาน! ฉันต้องการให้ playbook เป็น idempotent และไม่ต้องเพิ่มและลบโฮสต์หลังจากทำการบูตพวกเขา


1
คุณอาจพบแรงบันดาลใจบางที่นี่
Konstantin Suvorov

คำตอบ:


5

ฉันชอบที่จะทำแบบนี้:

- 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

ฉันพยายามเชื่อมต่อกับโฮสต์ระยะไกลกับผู้ใช้ที่ไม่สามารถพูดได้ของฉัน หากสิ่งนี้เป็นไปไม่ได้ (ในการเรียกใช้ครั้งแรก) ฉันจะเชื่อมต่อเป็นรูทและสร้างผู้ใช้ที่ไม่น่าเชื่อถือพร้อมกับauthorized_keysไฟล์และsudoสิทธิ์ของมัน

ในการรันครั้งต่อไปการเชื่อมต่อในฐานะผู้ใช้ที่ทำงานได้จริงจึงสามารถข้ามบล็อกงานได้

เมื่อรีโมตโฮสต์บูตแล้วฉันสามารถใช้กับผู้ใช้ ansible และbecome:

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

คุณเปลี่ยนremote_userplaybook ของคุณด้วยตนเองหลังจากเริ่มเล่นครั้งแรกหรือไม่? นั่นไม่ใช่ idempotent ฉันหวังว่าฉันขาดอะไรไป
Deefour

1
คุณทำฉันจะไม่เปลี่ยนแปลงอะไรด้วยตนเอง ทั้งสอง codesamples แทนละครสองแตกต่างกัน (บางทีมันอาจจะช่วยให้พวกเขาเป็นจินตนาการที่ถูกเรียกว่าbootstrap.ymlและsite.ymlที่site.ymlรวมถึงbootstrap.ymlก่อนสิ่งอื่นใด) หากภารกิจแรกของการbootstrap.ymlล้มเหลวงานอื่น ๆ ทั้งหมดของการเล่นนี้จะถูกข้ามและsite.ymlเข้าครอบครอง
Michael Trojanek

คัดลอกวางข้อมูลโค้ด "skip_reason": "Conditional result was False"แต่ข้ามเบิ้ลที่บล็อกของงาน: วิ่งเล่นด้วยการ-vvvแสดงผลตอบแทน ssh โทร"msg": "non-zero return code", "rc": 255,
Rafa

ฉันแก้ไขการเปลี่ยนแปลงwhenเงื่อนไข:when: not "OK" in check_ansible_user.stdout
Rafa

2

ฉันจะทำต่อไปนี้:

  • สร้างบทบาท (เช่น 'ฐาน') ที่คุณ (เหนือสิ่งอื่นใด) สร้างผู้ใช้ที่เหมาะสม (และกฎ sudo) เพื่อให้สามารถใช้งานได้
  • สร้างหรือปรับเปลี่ยนบทบาทของคุณสำหรับ SSH เพื่อจัดการsshd_config(ฉันมักจะแนะนำให้คุณจัดการไฟล์ทั้งหมดโดยใช้ a templateแต่ขึ้นอยู่กับคุณ) และปิดใช้งานการเข้าสู่ระบบรูท
  • ทำให้บทบาท SSH ของคุณขึ้นอยู่กับบทบาทพื้นฐานเช่นการใช้เมตา

สำหรับบทบาทแรก (ฐานแรก) ฉันมักจะใช้สิ่งที่ชอบ:

 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

สำหรับการกำหนดค่า SSH ฉันจะใช้:

- 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

เบิ้ลของการอ้างอิงบทบาทมีเอกสารที่นี่

คุณสามารถใช้การสั่งซื้อภายใน playbook เพื่อทำสิ่งนี้

ฉันมีสิ่งที่เข้าใจได้ใน gitHub (จากที่กล่าวมาข้างต้น) ถ้าคุณต้องการที่จะเห็นมันในบริบท


2

หากคุณสร้างเซิร์ฟเวอร์ของคุณบน Linode ด้วยโมดูล linodeคุณสามารถลงทะเบียนreturn valueของlinodeงานและรวมถึงงาน bootstrap ด้วยเงื่อนไขการตรวจสอบ outout ของงาน linode นั่นควรเป็น idempotent ลองสิ่งนี้:

- 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 จะมีงานทั้งหมดที่จำเป็นในการปิดการใช้งานล็อกอิน ssh และอื่น ๆ


-1

บางทีคุณอาจจะเพียงแค่ปรับเปลี่ยนansible_ssh_userในสินค้าคงคลังหลังจากที่คุณบูตโฮสต์โฮสต์?

[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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.