สถานะปัจจุบันของการจัดการผู้ใช้ด้วย Ansible คืออะไร


10

ฉันใช้ Ansible ไปสู่ความสำเร็จเป็นเวลาประมาณ 3 ปีในการจัดการระบบลินุกซ์ที่เพิ่มขึ้นเรื่อย ๆ ก่อนที่จะดำน้ำในคำถามของฉันฉันต้องกำหนดบริบท

เป็นส่วนหนึ่งของงานประจำวันของฉันฉันทำการออกแบบระบบการปรับใช้และการบำรุงรักษาสำหรับ บริษัท ต่าง ๆ ที่ดำเนินงานภายใต้ บริษัท เดียวหรือ บริษัท ศูนย์บ่มเพาะ มีการผสมข้ามสายพันธุ์จำนวนมากในกลุ่ม บริษัท ผลงานของเราและดังนั้นเราจึงไม่สามารถพูดได้ว่ามีเพียงผู้ใช้ A, B และ C เท่านั้นที่จะต้องเข้าถึงระบบของ บริษัท X พวกเขาอาจต้องเข้าถึงระบบของ บริษัท Y เช่นกัน สิ่งนี้มีความซับซ้อนเนื่องจากข้อเท็จจริงที่ว่าสภาพแวดล้อมที่เข้าใจได้ของแต่ละ บริษัท นั้นอาศัยอยู่ในที่เก็บ git ที่แตกต่างกัน ซึ่งหมายความว่ามีการทำสำเนารหัสจำนวนมากสำหรับการปรับใช้ผู้ใช้กับระบบของ บริษัท ต่าง ๆ ฉันสิ้นสุดการคัดลอก / วางบล็อคของรหัสเช่นนี้เพื่อนำผู้ใช้ไปใช้กับระบบของ บริษัท :

- name: add several users
  user: >
    name={{ item.name }}
    state=present
    groups={{ item.groups }}
    uid={{ item.uid }}
    password={{ item.password }}
    shell=/bin/bash
  with_items:
    - { name: 'user1', groups: 'ssh-access,sudo', uid: '501', password: '<redacted>' }
    - { name: 'user2', groups: 'ssh-access,sudo', uid: '502', password: '<redacted>' }
  tags: users

- name: authorized_keys - user1 
  action: authorized_key user=user1 key="{{ lookup('file', 'pubkeys/user1') }}" manage_dir=yes
  tags:
    - pubkeys
    - users

- name: authorized_keys - user2 
  action: authorized_key user=user2 key="{{ lookup('file', 'pubkeys/user2') }}" manage_dir=yes
  tags:
    - pubkeys
    - users

สิ่งนี้ใช้ได้ผลเมื่อฉันมีผู้ใช้ <5 คนที่จะจัดการ แต่เมื่อฐานผู้ใช้เติบโตขึ้นเรื่อย ๆ มันก็ยิ่งมีภาระมากขึ้นในการติดตามการหมุนของกุญแจรหัสผ่านใหม่ ฯลฯ

ด้วย backstory และบริบทตั้งอยู่กับคำถามของฉัน:

สมมติว่าการใช้ระบบการรับรองความถูกต้องจากส่วนกลาง (LDAP และอื่น ๆ ) ไม่ใช่ตัวเลือกฉันจะจัดการกับการสร้างฐานข้อมูลผู้ใช้จากส่วนกลางที่ playbooks ที่มีความหลากหลายและสามารถบริโภคได้อย่างไร ฉันชอบที่จะสามารถรักษารายชื่อผู้ใช้ส่วนกลาง uids รหัสผ่านแฮชคีย์สาธารณะและจากนั้นสามารถปรับใช้ผู้ใช้ (ด้วยการเป็นสมาชิกแบบกลุ่มต่อโฮสต์ที่กำหนดเอง) กับโฮสต์ของแต่ละ บริษัท

ฉันจินตนาการโครงสร้างการเล่นบางอย่างเช่น:

- name: Deploy users
  user_management:
    - { name: "user1", groups: "sudo" }
    - { name: "user1", groups: "sudo" }

... ที่ซึ่งผู้ใช้ของผู้ใช้แต่ละคนโพสต์แฮชและกุญแจสาธารณะจะถูกดึงจากรายการส่วนกลางและปรับใช้ตามปกติ

ฉันมีทางเลือกอะไรบ้าง? ฉันครุ่นคิดเรื่องนี้มาระยะหนึ่งแล้วและไม่สามารถทำอะไรได้ดีไปกว่าสิ่งที่ฉันทำไปแล้ว ฉันสามารถทำบางสิ่งกับไฟล์ข้อมูลที่กำหนดเองเพื่อเก็บฐานข้อมูลผู้ใช้ได้หรือไม่

คำตอบ:


8

คุณต้องแยกการเล่นและข้อมูลของคุณ

ฉันมี repo เพียงหนึ่งเดียวที่มีบทบาทข้อเท็จจริงและอื่น ๆ ทั้งหมดที่ปรับใช้กับระบบลูกค้าที่หลากหลาย ฉันแน่ใจว่าบทบาททั้งหมดสามารถกู้คืนได้และไม่มีข้อมูล ในhost_vars/fqdn.ymlหรือgroup_vars/customer_name.ymlฉันกำหนดข้อมูลที่ไม่ซ้ำกับลูกค้าหรือระบบระยะไกล

บทบาทส่วนใหญ่ของฉันจะขยายตัวตามกาลเวลาตามความจำเป็นและแทนที่จะทำทุกอย่างที่from roles/foo/main.ymlฉันมีroles/foo/debian-foo.ymlและroles/foo/openbsd-foo.ymlจะรวมอยู่ในระบบปฏิบัติการหรือเงื่อนไขอื่นเท่านั้น

แบบง่ายroles/adduser/main.ymlอาจรวมถึงสิ่งนี้:

- user: name={{ item.name }} ...
  with_items:
  - customer_users

และgroup_vars/ACME.ymlอาจรวมถึงสิ่งนี้:

customer_users:
- name: sausage
   uid: 32153
- name: beans
   uid: 1024

ในกรณีของคุณมันอาจจะโอเคที่จะแยกสภาพแวดล้อมที่แยกกันไม่ออกในแต่ละ repit git ตราบใดที่โฟลเดอร์ role คือ submodule ที่ใช้ร่วมกันซึ่งเหมือนกันกับลูกค้าทั้งหมดของคุณ


นี่ชี้ไปในทิศทางที่ถูกต้อง ขอบคุณอเล็กซ์! ฉันยังจะต้องแยกแยะวิธีรักษาฐานข้อมูลชื่อผู้ใช้ / คีย์ / uids / etc ที่ฉันสามารถอ้างอิงจากบทบาทและ / หรือกลุ่มต่าง ๆ แต่ฉันคิดว่าฉันมีความคิดบางอย่างเกี่ยวกับวิธีที่ฉันสามารถทำได้
EEAA

1
@EEAA โปรดจำไว้ว่า role / all สามารถเป็นไดเร็กตอรี่พร้อมไฟล์เพื่อให้คุณสามารถรวมบทบาท / all / staff.yml, role / all / foo.yml, ฯลฯ ได้อย่างง่ายดาย
Alex Holst
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.