Bagaimana keadaan terkini untuk manajemen pengguna dengan Ansible?

10

Saya telah menggunakan Ansible, untuk kesuksesan besar, selama ~ 3 tahun sekarang untuk mengelola kawanan sistem linux yang terus berkembang. Sebelum menyelam ke pertanyaan saya, saya perlu mengatur beberapa konteks.

Sebagai bagian dari pekerjaan saya sehari-hari, saya melakukan perancangan sistem, penyebaran, dan pemeliharaan untuk berbagai perusahaan yang semuanya beroperasi di bawah payung perusahaan satu usaha / inkubator. Ada banyak penyerbukan silang di antara perusahaan portofolio kami, dan karena itu, kami tidak dapat mengatakan bahwa hanya pengguna A, B, dan C yang akan memerlukan akses ke sistem perusahaan X. Mereka juga mungkin memerlukan akses ke sistem perusahaan Y juga. Ini diperumit oleh fakta bahwa lingkungan yang memungkinkan masing-masing perusahaan hidup dalam repositori git yang berbeda. Ini berarti ada banyak duplikasi kode untuk menempatkan pengguna ke sistem perusahaan yang berbeda. Saya akhirnya menyalin / menempel blok kode seperti ini untuk menyebarkan pengguna ke sistem perusahaan tertentu:

- 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

Ini berfungsi dengan baik ketika saya memiliki <5 pengguna untuk dikelola, tetapi seiring dengan pertumbuhan basis pengguna, menjadi semakin sulit untuk terus memperbarui informasi dengan rotasi tombol, kata sandi baru, dll.

Dengan latar belakang dan konteks diatur, dilanjutkan dengan pertanyaan saya:

Dengan asumsi bahwa menggunakan sistem otentikasi terpusat (LDAP, dll.) Bukanlah suatu pilihan, bagaimana saya bisa menangani membuat database pengguna terpusat yang dapat dikonsumsi oleh berbagai buku pedoman yang mungkin? Saya ingin dapat mempertahankan satu daftar pusat pengguna, uids, kata sandi hash, dan kunci publik, dan kemudian dapat menyebarkan pengguna (dengan keanggotaan grup kustom per-host) ke host masing-masing perusahaan.

Saya membayangkan semacam struktur permainan seperti:

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

... di mana setiap pengguna uid, hash, dan kunci publik akan ditarik dari daftar pusat dan digunakan seperti biasa.

Jadi, opsi apa yang saya miliki? Saya telah merenungkan hal ini selama beberapa waktu, dan belum dapat menemukan sesuatu yang lebih baik dari apa yang sudah saya lakukan. Bisakah saya melakukan sesuatu dengan file fakta khusus untuk menampung basis data pengguna saya?

EEAA
sumber

Jawaban:

8

Anda perlu memisahkan permainan dan data Anda.

Saya memiliki satu repo dengan semua peran, fakta, dll, yang digunakan untuk berbagai sistem pelanggan. Saya memastikan semua peran resuable dan bebas dari data. Di host_vars/fqdn.ymlatau group_vars/customer_name.ymlsaya mendefinisikan data yang unik untuk pelanggan atau sistem jarak jauh.

Sebagian besar peran saya diperluas dari waktu ke waktu sesuai kebutuhan dan alih-alih melakukan semua yang from roles/foo/main.ymlsaya miliki roles/foo/debian-foo.ymldan roles/foo/openbsd-foo.ymlitu hanya termasuk ketika OS atau kondisi lain cocok.

Sederhana, roles/adduser/main.ymldapat mencakup ini:

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

dan group_vars/ACME.ymldapat mencakup ini:

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

Dalam kasus Anda, boleh saja memiliki lingkungan yang terpisah di setiap repositori git mereka asalkan folder peran adalah submodule bersama yang identik di semua pelanggan Anda.

Alex Holst
sumber
Ini menunjukkan saya ke arah yang benar. Terima kasih Alex! Saya masih perlu memilah cara mempertahankan satu basis data nama pengguna / kunci / uids / dll yang dapat saya rujuk dari berbagai peran dan / atau kelompok, tetapi saya rasa saya memiliki beberapa ide tentang bagaimana saya dapat mencapainya.
EEAA
1
@EEAA Ingat peran / semua bisa menjadi direktori dengan file sehingga Anda dapat dengan mudah memusatkan peran / semua / staff.yml, peran / semua / foo.yml, dll
Alex Holst