// Package parser описывает структуры плейбука, инвентаря и ролей // и умеет загружать их из YAML. Никакой логики выполнения тут нет — // только данные и их загрузка с диска. package parser // Task — один шаг плейбука или роли. type Task struct { Name string `yaml:"name"` Module string `yaml:"-"` // заполняется при разборе (имя ключа модуля) Args map[string]interface{} `yaml:"-"` // аргументы этого модуля When string `yaml:"when,omitempty"` Loop interface{} `yaml:"loop,omitempty"` Tags []string `yaml:"tags,omitempty"` Register string `yaml:"register,omitempty"` Notify []string `yaml:"notify,omitempty"` AllowShell bool `yaml:"allow_shell,omitempty"` // After/Before — явные зависимости по имени таска в пределах того же // списка (play.Tasks или role.Tasks), как require/before в Puppet. // Без них порядок остаётся тем же, что в файле (см. internal/executor // graph.go — стабильная топологическая сортировка не переставляет // таски без объявленных зависимостей). After []string `yaml:"after,omitempty"` Before []string `yaml:"before,omitempty"` // Raw хранит исходную YAML-map таска — из неё вычленяется Module/Args // на этапе UnmarshalYAML, см. parser.go. Raw map[string]interface{} `yaml:"-"` } // Play — один play плейбука: на каких хостах, какими переменными, какие роли/таски. type Play struct { Name string `yaml:"name"` Hosts string `yaml:"hosts"` Vars map[string]interface{} `yaml:"vars,omitempty"` Roles []string `yaml:"roles,omitempty"` Tasks []Task `yaml:"tasks,omitempty"` } // Role — загруженная с диска роль: taskи + defaults/vars/handlers/templates. type Role struct { Name string Tasks []Task Defaults map[string]interface{} Vars map[string]interface{} Handlers []Task Dir string // корневая директория роли, нужна для поиска templates/files } // Playbook — верхнеуровневая единица: список play + резолвленные роли. type Playbook struct { Plays []Play Roles map[string]*Role // имя роли → загруженная роль Dir string // директория, где лежит сам playbook.yml (для relative include) } // Host — один хост инвентаря. type Host struct { Name string Vars map[string]interface{} } // Group — группа хостов, может содержать дочерние группы (children). type Group struct { Name string Hosts map[string]*Host Vars map[string]interface{} Children []string } // Inventory — весь инвентарь: группы + пути к group_vars/host_vars на диске. type Inventory struct { Groups map[string]*Group Dir string // директория инвентаря, для поиска group_vars/host_vars }