Documentation
¶
Overview ¶
Package discover, sanallaştırma platformundan makine keşfi.
⚠️ KAYNAK ARAYÜZ ARKASINDA ve bu ilk günden böyle. Bugün tek uygulaması Proxmox; vSphere aynı arayüzü dolduracak. Arayüzü sonradan çıkarmak, Proxmox'a özel varsayımların keşif mantığının içine dağılmasından SONRA olurdu — ve o noktada ikinci kaynağı eklemek, birinciyi yeniden yazmak demek olurdu.
⚠️ KEŞİF ERİŞİM VERMEZ, HEDEF VE ROL YARATIR. Bir makinenin postern'de hedef olması, kimsenin oraya girebildiği anlamına gelmiyor: erişim yalnızca rolden geliyor ve rolü insanlara bağlamak ayrı, bilinçli bir adım. Keşif o adımı yapmıyor.
Index ¶
Constants ¶
const UnknownRole = "unknown"
* UnknownRole, rol etiketi olmayan makinelerin düştüğü rol. * * ⚠️ model.UnknownGroup ile AYNI KELİME ve bu kasıtlı: operatör aynı * anlamı iki farklı adla öğrenmek zorunda kalmasın. Orada "kaynak * cevap verdi ama grup söylemedi", burada "makine var ama rolü * söylenmemiş" — ikisi de "bilmiyoruz, ama sakladık" demek.
Variables ¶
This section is empty.
Functions ¶
func RoleFromTags ¶
* RoleFromTags, etiketlerden rol adını çıkarır. * * ⚠️ ANAHTAR ETİKETİN İÇİNDE, ayrı bir alan değil. Proxmox etiketleri * anahtar/değer çifti DEĞİL, düz dizeler ("prod", "role=ops"). Bu * yüzden operatörden bir "etiket anahtarı" istiyoruz ve onu etiketin * içinde arıyoruz: `role=ops` ya da `role:ops`. * * İki ayraç da kabul ediliyor çünkü ikisi de yaygın ve hangisinin * kullanıldığını keşif sırasında öğrenmek, kurulumu yeniden * etiketlemekten ucuz. * * ⚠️ ANAHTARSIZ MAKİNE HATA DEĞİL. Etiketi olmayan ya da anahtarı * taşımayan makine `unknown` rolüne düşüyor — kaynağın hiçbir grup * söylemediği kullanıcının düştüğü yerin aynısı (model.UnknownGroup). * Sebebi aynı: "bilmiyorum" ile "hiçbiri" ayrı şeyler ve bilmediğimiz * makineyi sessizce dışarıda bırakmak, onu envanterden düşürürdü.
* ⚠️ EŞLEŞME ÖN EKLE, "İLK AYIRICIDA BÖL" DEĞİL. * * Alt çizgi hem anahtarın hem değerin İÇİNDE geçebiliyor: * "role_name_os-admins" etiketi, anahtar "role_name" iken değer * "os-admins" demek. İlk ayırıcıda bölen bir uygulama burada anahtarı * "role" sanır, eşleşmez, ve makine sessizce unknown'a düşer — yani * alt çizgiyi desteklemek TEK BAŞINA yetmiyor. * * Anahtar bilindiği için doğru olan onu ön ek olarak aramak; geriye * kalan her şey değerdir ("role_web_prod" + anahtar "role" = * "web_prod").
func SortOutcomes ¶
func SortOutcomes(out []Outcome)
SortOutcomes, raporu okunur bir sıraya koyar: önce atlananlar (asıl bakılacak olan onlar), sonra rol, sonra ad.
func ValidRoleName ¶
* ValidRoleName, etiketten gelen değerin rol adı olarak kullanılabilir * olduğu. * * ⚠️ ETİKET GÜVENİLMEYEN GİRDİ. Hipervizöre makine ekleyebilen herkes * etiket yazabiliyor ve o değer burada bir ROL ADINA dönüşüyor — * yani erişim modelinin bir parçasına. Boşluk, virgül ya da yol * ayracı taşıyan bir ad, sonradan liste ayrıştıran her yerde * belirsizlik üretir.
Types ¶
type Machine ¶
type Machine struct {
// Name, platformdaki adı. Hedef adı olarak kullanılıyor.
Name string
/*
* Host, SSH için kullanılacak adres.
*
* Boş olabilir: Proxmox'ta adresi öğrenmek konuk aracısına
* (guest agent) bağlı ve o her makinede kurulu değil. Boşken
* makinenin ADI adres olarak deneniyor — kurumların çoğunda
* makine adı zaten çözülüyor. Çözülmezse makine ATLANIYOR ve
* sebebi raporda yazıyor; uydurma bir adres yazmak, bir gün
* başka bir makineye açılan bir hedef bırakırdı.
*/
Host string
// Tags, platformdaki etiketler. Rol bunlardan çıkarılıyor.
Tags []string
// Running, makine çalışıyor mu. Kapalı makinenin host anahtarı
// taranamaz; rapor bunu ayrı bir sebep olarak söylüyor.
Running bool
// Ref, platformdaki kimliği (teşhis için: "qemu/101").
Ref string
}
Machine, bir kaynağın bildirdiği tek bir makine.
type Outcome ¶
type Outcome struct {
Machine Machine
Role string
// Tagged: rol etiketten mi geldi (yoksa unknown'a mı düştü).
Tagged bool
// Skipped doluysa makine için hiçbir şey yazılmadı ve sebebi bu.
Skipped string
/*
* KeyUnchecked doluysa makine ZATEN KAYITLIYDI ama host anahtarı bu
* turda doğrulanamadı (ağ). Rol bağı yine de yenilendi.
*
* ⚠️ SESSİZ GEÇMİYOR: "kontrol ettim ve aynıydı" ile "kontrol
* edemedim" farklı şeyler, ve ikincisini birincisi gibi göstermek
* değişmiş bir makineyi değişmemiş sanmaya yol açar.
*/
KeyUnchecked string
// Aşağıdakiler yalnızca uygulama (apply) turunda dolar.
CreatedRole bool
CreatedTarget bool
Granted bool
// Existing: hedef zaten vardı ve DOKUNULMADI.
Existing bool
}
Outcome, tek bir makine için keşfin sonucu.
type Planner ¶
type Planner struct {
DB *store.Store
// TagKey, rol adını taşıyan etiket anahtarı ("role").
TagKey string
// Port, hedeflerin SSH portu.
Port int
// Actor, denetim kaydına yazılacak kim.
Actor string
}
Planner, keşfi postern'e uygular.
func (Planner) Run ¶
* Run, makineleri işler. * * apply=false ise HİÇBİR yazma yapılmıyor; dönen Outcome listesi yine * de "ne olurdu"yu tam olarak anlatıyor — host anahtarı taraması dahil, * çünkü taramanın başarısız olması bir makinenin atlanmasının en sık * sebebi ve onu önizlemede göstermemek, önizlemeyi yalancı yapardı.
type Proxmox ¶
type Proxmox struct {
// contains filtered or unexported fields
}
Proxmox, ProxmoxConfig ile konuşan Source.
func NewProxmox ¶
func NewProxmox(cfg ProxmoxConfig) (*Proxmox, error)
NewProxmox, yapılandırmayı doğrular ve istemciyi kurar.
type ProxmoxConfig ¶
type ProxmoxConfig struct {
// BaseURL, "https://pve.example:8006" biçiminde.
BaseURL string
/*
* TokenID ve TokenSecret, API jetonu ("user@pam!keşif").
*
* ⚠️ PAROLA/TICKET YOLU BİLEREK YOK. Jeton kapsamı daraltılabiliyor
* ve iptali tek tıklık; kullanıcı parolası ise hipervizörün tamamına
* açılan bir anahtar. postern'in kendi kapısında verdiği kararın
* aynısı: makine işi için makine kimliği.
*/
TokenID string
TokenSecret string
// CAFile, hipervizörün sertifikasını doğrulayacak kök. Boşsa
// sistemin kök deposu.
CAFile string
/*
* Insecure, TLS doğrulamasını KAPATIR.
*
* ⚠️ VARSAYILAN DEĞİL VE OLMAYACAK. Proxmox kurulumlarının çoğu
* kendi imzaladığı sertifikayla geliyor, dolayısıyla bunu tamamen
* yasaklamak özelliği kullanılamaz yapardı. Ama açık olduğunda
* araya giren biri hipervizörün cevabını — yani hangi makinenin
* hangi role gideceğini — yazabilir. Bu yüzden açan kişi bunu
* komut satırında yazmak zorunda ve denetim kaydına düşüyor.
* Doğru yol CAFile.
*/
Insecure bool
// Node boşsa küme genelinde arıyor.
Node string
Timeout time.Duration
}
ProxmoxConfig, Proxmox'a bağlanmak için gerekenler.
type Source ¶
type Source interface {
// Name, raporda ve denetim kaydında görünen ad ("proxmox").
Name() string
// Machines, platformdaki makineleri döner.
Machines(ctx context.Context) ([]Machine, error)
}
Source, makineleri sayabilen bir platform.
type VSphere ¶
type VSphere struct {
// contains filtered or unexported fields
}
VSphere, VSphereConfig ile konuşan Source.
func NewVSphere ¶
func NewVSphere(cfg VSphereConfig) (*VSphere, error)
NewVSphere, yapılandırmayı doğrular ve istemciyi kurar.
type VSphereConfig ¶
type VSphereConfig struct {
// BaseURL, "https://vcenter.example" biçiminde.
BaseURL string
/*
* Username ve Password.
*
* ⚠️ PROXMOX'TAN FARKLI OLARAK JETON YOK ve bu bir tercih değil:
* vCenter'ın API jetonu diye ayrı bir kavramı yok, oturum kullanıcı
* kimliğiyle açılıyor. Karşılığında kullanılacak hesabın
* YALNIZCA OKUMA yetkisi olmalı — bu koddaki hiçbir çağrı
* değiştirmiyor, ama yetkiyi daraltmak koda değil operatöre bağlı.
*/
Username string
Password string
CAFile string
// Insecure, TLS doğrulamasını kapatır. Gerekçesi ProxmoxConfig'te.
Insecure bool
Timeout time.Duration
}
VSphereConfig, vCenter'a bağlanmak için gerekenler.