Bubuka Wayang

Wayang nyaéta sistem manajemen konfigurasi. Hal ieu dipaké pikeun mawa host kana kaayaan anu dipikahoyong sareng ngajaga kaayaan ieu.

Abdi parantos damel sareng Wayang langkung ti lima taun ayeuna. Téks ieu dasarna mangrupikeun kompilasi anu ditarjamahkeun sareng disusun ulang tina titik-titik konci tina dokuméntasi resmi, anu bakal ngamungkinkeun para pemula gancang ngartos hakekat Wayang.

Bubuka Wayang

Inpormasi dasar

Sistem operasi Wayang nyaéta klien-server, sanaos ogé ngadukung operasi tanpa server sareng fungsionalitas terbatas.

Model tarik operasi dianggo: sacara standar, sakali unggal satengah jam, klien ngahubungi server pikeun konfigurasi sareng nerapkeunana. Upami anjeun parantos damel sareng Ansible, teras aranjeunna nganggo modél push anu béda: pangurus ngamimitian prosés nerapkeun konfigurasi, klien sorangan moal nerapkeun nanaon.

Salila komunikasi jaringan, enkripsi TLS dua arah dianggo: server sareng klien gaduh konci pribadi sareng sertipikat anu cocog. Ilaharna server ngaluarkeun sertipikat pikeun klien, tapi prinsipna tiasa nganggo CA éksternal.

Bubuka keur manifestos

Dina terminologi Wayang ka pangladén wayang sambung titik-titik (titik). Konfigurasi pikeun titik ditulis dina manifestos dina basa programming husus - Wayang DSL.

DSL Wayang nyaéta basa déklaratif. Éta ngajelaskeun kaayaan anu dipikahoyong tina titik dina bentuk deklarasi sumberdaya individu, contona:

  • Berkasna aya sareng gaduh eusi khusus.
  • Paket dipasang.
  • jasa geus dimimitian.

Sumber daya tiasa dihubungkeun:

  • Aya katergantungan, aranjeunna mangaruhan tatanan sumber daya anu dianggo.
    Salaku conto, "pasang heula pakét, teras édit file konfigurasi, teras ngamimitian jasa."
  • Aya béwara - upami sumberna parantos robih, éta ngirim béwara ka sumber daya anu ngalanggan éta.
    Salaku conto, upami file konfigurasi robih, anjeun tiasa otomatis ngabalikan deui jasa.

Salaku tambahan, DSL Wayang gaduh fungsi sareng variabel, ogé pernyataan kondisional sareng pamilih. Rupa-rupa mékanisme templating ogé dirojong - EPP sareng ERB.

Wayang ditulis dina Ruby, jadi loba constructs jeung istilah dicokot ti dinya. Ruby ngidinan Anjeun pikeun dilegakeun Wayang - nambahkeun logika kompléks, tipe anyar sumberdaya, fungsi.

Nalika Wayang keur ngajalankeun, manifests pikeun tiap titik husus dina server anu disusun kana diréktori a. pitunjuk mangrupa daptar sumberdaya sarta hubungan maranéhanana sanggeus ngitung nilai fungsi, variabel jeung perluasan pernyataan kondisional.

Sintaksis jeung codestyle

Ieu mangrupikeun bagian tina dokuméntasi resmi anu bakal ngabantosan anjeun ngartos sintaksis upami conto anu disayogikeun henteu cekap:

Ieu conto kumaha manifes katingalina:

# Комментарии пишутся, как и много где, после решётки.
#
# Описание конфигурации ноды начинается с ключевого слова node,
# за которым следует селектор ноды — хостнейм (с доменом или без)
# или регулярное выражение для хостнеймов, или ключевое слово default.
#
# После этого в фигурных скобках описывается собственно конфигурация ноды.
#
# Одна и та же нода может попасть под несколько селекторов. Про приоритет
# селекторов написано в статье про синтаксис описания нод.
node 'hostname', 'f.q.d.n', /regexp/ {
  # Конфигурация по сути является перечислением ресурсов и их параметров.
  #
  # У каждого ресурса есть тип и название.
  #
  # Внимание: не может быть двух ресурсов одного типа с одинаковыми названиями!
  #
  # Описание ресурса начинается с его типа. Тип пишется в нижнем регистре.
  # Про разные типы ресурсов написано ниже.
  #
  # После типа в фигурных скобках пишется название ресурса, потом двоеточие,
  # дальше идёт опциональное перечисление параметров ресурса и их значений.
  # Значения параметров указываются через т.н. hash rocket (=>).
  resource { 'title':
    param1 => value1,
    param2 => value2,
    param3 => value3,
  }
}

Indentation na garis putus teu bagian diperlukeun tina manifest, tapi aya dianjurkeun pituduh gaya. Ringkesan:

  • Dua-spasi indents, tab teu dipaké.
  • Kurung keriting dipisahkeun ku spasi; titik dua henteu dipisahkeun ku spasi.
  • Koma saatos unggal parameter, kalebet anu terakhir. Unggal parameter aya dina garis anu misah. Pangecualian dilakukeun pikeun kasus tanpa parameter sareng hiji parameter: anjeun tiasa nyerat dina hiji garis sareng tanpa koma (ie. resource { 'title': } и resource { 'title': param => value }).
  • Panah dina parameter kedah dina tingkat anu sami.
  • panah hubungan sumberdaya ditulis di hareup aranjeunna.

Lokasi file dina pappetserver

Pikeun katerangan salajengna, kuring bakal ngawanohkeun konsép "root directory". Diréktori akar nyaéta diréktori anu ngandung konfigurasi Wayang pikeun titik khusus.

Diréktori akar béda-béda gumantung kana versi Wayang sareng lingkungan anu dianggo. Lingkungan mangrupikeun set konfigurasi mandiri anu disimpen dina diréktori anu misah. Biasana dianggo dina kombinasi sareng git, dimana lingkunganana diciptakeun tina cabang git. Sasuai, unggal titik lokasina di hiji lingkungan atawa lianna. Ieu tiasa dikonpigurasi dina node sorangan, atanapi di ENC, anu bakal kuring bahas dina tulisan salajengna.

  • Dina versi katilu ("Wayang heubeul") diréktori dasar éta /etc/puppet. Pamakéan lingkungan mangrupa pilihan - contona, urang teu make eta jeung Wayang heubeul. Upami lingkungan dianggo, aranjeunna biasana disimpen dina /etc/puppet/environments, diréktori akar bakal diréktori lingkungan. Upami lingkungan henteu dianggo, diréktori akar bakal janten diréktori dasar.
  • Mimitian ti versi kaopat ("Wayang anyar"), panggunaan lingkungan janten wajib, sareng diréktori dasarna dipindahkeun ka /etc/puppetlabs/code. Sasuai, lingkungan disimpen di /etc/puppetlabs/code/environments, diréktori akar nyaéta diréktori lingkungan.

Kedah aya subdirektori dina diréktori akar manifests, nu ngandung hiji atawa leuwih manifests ngajéntrékeun titik. Sajaba ti éta, kudu aya subdirectory a modules, nu ngandung modul. Kuring gé ngabejaan Anjeun modul naon saeutik engké. Sajaba ti éta, Wayang heubeul ogé bisa boga subdirectory a files, nu ngandung rupa-rupa file nu urang nyalin kana titik. Dina Wayang anyar, sadaya file disimpen dina modul.

File Manifest ngagaduhan ekstensi .pp.

Sababaraha conto tempur

Katerangan ngeunaan titik sareng sumber di dinya

Dina titik server1.testdomain file kudu dijieun /etc/issue kalawan eusi Debian GNU/Linux n l. Berkas kedah dipiboga ku pangguna sareng grup root, hak aksés kudu 644.

Urang nulis manifesto:

node 'server1.testdomain' {   # блок конфигурации, относящийся к ноде server1.testdomain
    file { '/etc/issue':   # описываем файл /etc/issue
        ensure  => present,   # этот файл должен существовать
        content => 'Debian GNU/Linux n l',   # у него должно быть такое содержимое
        owner   => root,   # пользователь-владелец
        group   => root,   # группа-владелец
        mode    => '0644',   # права на файл. Они заданы в виде строки (в кавычках), потому что иначе число с 0 в начале будет воспринято как записанное в восьмеричной системе, и всё пойдёт не так, как задумано
    }
}

Hubungan antara sumberdaya on node

Dina titik server2.testdomain nginx kedah dijalankeun, damel sareng konfigurasi anu disiapkeun sateuacana.

Hayu urang decompose masalah:

  • Bungkusan kedah dipasang nginx.
  • Perlu yén file konfigurasi disalin ti server.
  • Palayanan kedah dijalankeun nginx.
  • Upami konfigurasi parantos diropéa, jasa kedah dibalikan deui.

Urang nulis manifesto:

node 'server2.testdomain' {   # блок конфигурации, относящийся к ноде server2.testdomain
    package { 'nginx':   # описываем пакет nginx
        ensure => installed,   # он должен быть установлен
    }
  # Прямая стрелка (->) говорит о том, что ресурс ниже должен
  # создаваться после ресурса, описанного выше.
  # Такие зависимости транзитивны.
    -> file { '/etc/nginx':   # описываем файл /etc/nginx
        ensure  => directory,   # это должна быть директория
        source  => 'puppet:///modules/example/nginx-conf',   # её содержимое нужно брать с паппет-сервера по указанному адресу
        recurse => true,   # копировать файлы рекурсивно
        purge   => true,   # нужно удалять лишние файлы (те, которых нет в источнике)
        force   => true,   # удалять лишние директории
    }
  # Волнистая стрелка (~>) говорит о том, что ресурс ниже должен
  # подписаться на изменения ресурса, описанного выше.
  # Волнистая стрелка включает в себя прямую (->).
    ~> service { 'nginx':   # описываем сервис nginx
        ensure => running,   # он должен быть запущен
        enable => true,   # его нужно запускать автоматически при старте системы
    }
  # Когда ресурс типа service получает уведомление,
  # соответствующий сервис перезапускается.
}

Jang ngalampahkeun ieu, anjeun peryogi kira-kira lokasi file di handap ieu dina server wayang:

/etc/puppetlabs/code/environments/production/ # (это для нового Паппета, для старого корневой директорией будет /etc/puppet)
├── manifests/
│   └── site.pp
└── modules/
    └── example/
        └── files/
            └── nginx-conf/
                ├── nginx.conf
                ├── mime.types
                └── conf.d/
                    └── some.conf

Jenis Sumberdaya

Daptar lengkep jinis sumberdaya anu dirojong tiasa dipendakan di dieu dina dokuméntasi, Di dieu kuring bakal ngajelaskeun lima jenis dasar, anu dina prakna mah cukup pikeun ngajawab paling masalah.

file

Ngatur file, diréktori, symlink, eusina, sareng hak aksés.

Parameter:

  • ngaran sumberdaya - jalur ka file (opsional)
  • jalan - jalur ka file (upami teu dieusian dina nami)
  • ngajamin - jinis file:
    • absent - mupus file
    • present - kedah aya file tina jinis naon waé (upami teu aya file, file biasa bakal didamel)
    • file - file biasa
    • directory - diréktori
    • link - symlink
  • eusi - eusi file (cocog ngan pikeun file biasa, teu bisa dipaké babarengan jeung sumber atawa tujuan)
  • sumber - tautan ka jalur anu anjeun hoyong nyalin eusi file (teu tiasa dianggo sareng eusi atawa tujuan). Bisa dieusian boh mangrupa URI kalawan skéma a puppet: (lajeng file ti server wayang bakal dipaké), sarta kalawan skéma http: (Kuring miharep éta jelas naon anu bakal kajadian dina hal ieu), komo jeung diagram file: atanapi salaku jalur mutlak tanpa skéma (lajeng file ti FS lokal dina titik bakal dianggo)
  • tujuan - dimana symlink kedah nunjuk (teu tiasa dianggo sareng eusi atawa sumber)
  • nu boga — pangguna anu kedah gaduh file
  • kumpulan - grup nu file kudu milik
  • mode - idin file (salaku string)
  • malikan deui - ngamungkinkeun ngolah diréktori rekursif
  • kosongna - ngamungkinkeun ngahapus file anu henteu dijelaskeun dina Wayang
  • kakuatan - ngamungkinkeun mupus diréktori anu henteu dijelaskeun dina Wayang

paket

Masang sareng ngahapus bungkusan. Bisa nanganan bewara - reinstalls pakét lamun parameter dieusian reinstall_on_refresh.

Parameter:

  • ngaran sumberdaya - Ngaran pakét (opsional)
  • nami - Ngaran pakét (upami henteu disebatkeun dina nami)
  • panyadia - manajer pakét ngagunakeun
  • ngajamin - kaayaan pakét anu dipikahoyong:
    • present, installed - sagala versi dipasang
    • latest - versi panganyarna dipasang
    • absent - dipupus (apt-get remove)
    • purged - dihapus sareng file konfigurasi (apt-get purge)
    • held - Vérsi pakét dikonci (apt-mark hold)
    • любая другая строка — versi anu ditangtukeun dipasang
  • reinstall_on_refresh - upami a true, teras saatos nampi béwara pakét bakal dipasang deui. Mangpaat pikeun distribusi dumasar-sumber, dimana bungkusan ngawangun deui tiasa diperyogikeun nalika ngarobih parameter ngawangun. Default false.

palayanan

Manages jasa. Bisa ngolah béwara - balikan deui jasa.

Parameter:

  • ngaran sumberdaya - jasa pikeun diurus (opsional)
  • nami - jasa anu kedah diurus (upami henteu disebatkeun dina nami)
  • ngajamin - kaayaan jasa anu dipikahoyong:
    • running - dibuka
    • stopped - eureun
  • bisa jadi - ngadalikeun kamampuan pikeun ngamimitian jasa:
    • true - autorun diaktipkeun (systemctl enable)
    • mask - nyamur (systemctl mask)
    • false - autorun ditumpurkeun (systemctl disable)
  • uihan deui - paréntah pikeun ngabalikan deui jasa
  • status — paréntah pikeun mariksa status jasa
  • geus balikan deui — nunjukkeun naha layanan initscript ngarojong balikan deui. Lamun false sarta parameter dieusian uihan deui - nilai parameter ieu dipaké. Lamun false jeung parameter uihan deui teu dieusian - jasa dieureunkeun tur mimitian balikan deui (tapi systemd ngagunakeun paréntah systemctl restart).
  • hasstatus - nunjukkeun naha layanan initscript ngarojong paréntah status. Upami false, lajeng nilai parameter dipaké status. Default true.

exec

Ngajalankeun paréntah éksternal. Lamun anjeun teu nangtukeun parameter nyiptakeun, ngan lamun, kecuali lamun atawa refreshonly, paréntah bakal dijalankeun unggal waktos Wayang dijalankeun. Bisa ngolah béwara - ngajalankeun paréntah.

Parameter:

  • ngaran sumberdaya - paréntah pikeun dieksekusi (opsional)
  • parentah - paréntah pikeun dieksekusi (upami henteu disebatkeun dina nami)
  • jalan - jalur pikeun milarian file anu tiasa dieksekusi
  • ngan lamun - lamun paréntah dieusian dina parameter ieu réngsé kalawan kode enol mulang, paréntah utama bakal dieksekusi
  • kecuali lamun - upami paréntah anu ditunjuk dina parameter ieu réngsé sareng kodeu balik non-enol, paréntah utama bakal dieksekusi
  • nyiptakeun - lamun file dieusian dina parameter ieu teu aya, paréntah utama bakal dieksekusi
  • refreshonly - upami a true, teras paréntahna ngan bakal dijalankeun nalika eksekutif ieu nampi béwara ti sumber anu sanés
  • cwd - diréktori ti mana ngajalankeun paréntah
  • nu make - pamaké ti saha ngajalankeun paréntah
  • panyadia - kumaha ngajalankeun paréntah:
    • posix - prosés anak ngan saukur dijieun, pastikeun pikeun nangtukeun jalan
    • kerang - paréntah dibuka dina cangkang /bin/sh, bisa jadi teu dieusian jalan, anjeun tiasa nganggo globbing, pipa sareng fitur cangkang anu sanés. Biasana dideteksi sacara otomatis upami aya karakter khusus (|, ;, &&, || jsb).

Cron

Ngadalikeun cronjobs.

Parameter:

  • ngaran sumberdaya - ngan sababaraha jenis identifier
  • ngajamin - kaayaan crownjob:
    • present - nyieun lamun teu aya
    • absent - pupus lamun aya
  • parentah - naon paréntah ngajalankeun
  • lingkungan — di lingkungan mana pikeun ngajalankeun paréntah (daptar variabel lingkungan sareng nilaina via =)
  • nu make - ti mana pamaké pikeun ngajalankeun paréntah
  • menit, jam, poe minggu, sasih, poé bulan - nalika ngajalankeun cron. Lamun salah sahiji atribut ieu teu dieusian, nilai na dina crontab bakal *.

Dina Wayang 6.0 Cron siga dikaluarkeun tina kotak di puppetserver, jadi euweuh dokuméntasi dina situs umum. Tapi anjeunna aya dina kotak dina wayang-agén, jadi teu perlu install deui misah. Anjeun tiasa ningali dokuméntasi pikeun éta dina dokuméntasi pikeun versi kalima Wayangatawa dina GitHub.

Ngeunaan sumberdaya sacara umum

Sarat pikeun uniqueness sumberdaya

Kasalahan anu paling umum anu urang tepang nyaéta Duplikat deklarasi. Kasalahan ieu lumangsung nalika dua atawa leuwih sumber tina tipe nu sarua jeung ngaran nu sami muncul dina diréktori.

Ku kituna, kuring bakal nulis deui: Manifes pikeun titik anu sami henteu kedah ngandung sumber daya anu sami sareng judul anu sami!

Kadang-kadang aya anu peryogi pikeun masang bungkusan nganggo nami anu sami, tapi kalayan manajer pakét anu béda. Dina hal ieu, anjeun kedah nganggo parameter namepikeun nyegah kasalahan:

package { 'ruby-mysql':
  ensure   => installed,
  name     => 'mysql',
  provider => 'gem',
}
package { 'python-mysql':
  ensure   => installed,
  name     => 'mysql',
  provider => 'pip',
}

Jenis sumberdaya séjén boga pilihan sarupa pikeun mantuan nyegah duplikasi - name у palayanan, command у exec, teras salajengna.

Metaparameter

Unggal tipe sumberdaya boga sababaraha parameter husus, paduli alam na.

Daptar lengkep parameter meta dina dokuméntasi Wayang.

Daptar pondok:

  • ngabutuhkeun - parameter ieu nunjukkeun sumber daya ieu gumantung kana.
  • saencan - Parameter ieu nangtukeun mana sumberdaya gumantung kana sumberdaya ieu.
  • ngalanggan — parameter ieu nangtukeun ti mana sumber daya ieu narima bewara.
  • ngabéjaan - Parameter ieu nangtukeun sumber mana anu nampi béwara ti sumber ieu.

Sakabéh métaparamétri nu didaptarkeun narima boh link sumberdaya tunggal atawa Asép Sunandar Sunarya ti Tumbu dina kurung kuadrat.

Tumbu ka sumberdaya

Link sumberdaya ngan saukur nyebut sumberdaya. Biasana dianggo pikeun nunjukkeun katergantungan. Ngarujuk kana sumber anu henteu aya bakal nyababkeun kasalahan kompilasi.

Sintaksis tautan nyaéta kieu: jinis sumber nganggo hurup kapital (upami nami jinis ngandung titik dua, teras unggal bagian nami antara titik dua dikapital), teras nami sumberdaya dina kurung kuadrat (kasus nami. teu robah!). Henteu kedah aya spasi; kurung kuadrat ditulis langsung saatos nami jinisna.

contona:

file { '/file1': ensure => present }
file { '/file2':
  ensure => directory,
  before => File['/file1'],
}
file { '/file3': ensure => absent }
File['/file1'] -> File['/file3']

Depéndensi sareng béwara

Dokuméntasi di dieu.

Salaku nyatakeun saméméhna, kagumantungan basajan antara sumberdaya transitive. Ku jalan kitu, ati-ati nalika nambihan kagumantungan - anjeun tiasa nyiptakeun katergantungan siklik, anu bakal nyababkeun kasalahan kompilasi.

Beda sareng dependensi, béwara sanés transitif. Aturan di handap ieu dilarapkeun pikeun béwara:

  • Upami sumberna nampi béwara, éta diropéa. Laku lampah apdet gumantung kana tipe sumberdaya − exec ngajalankeun paréntah, palayanan ngamimitian deui jasa, paket reinstalls pakét. Upami sumberna henteu gaduh tindakan pembaruan anu ditetepkeun, maka teu aya anu kajantenan.
  • Salila hiji ngajalankeun Wayang, sumberdaya nu diropéa teu leuwih ti sakali. Ieu mungkin sabab béwara kalebet katergantungan sareng grafik katergantungan henteu ngandung siklus.
  • Upami Wayang ngarobih kaayaan sumber daya, sumberna ngirim béwara ka sadaya sumber anu ngalanggan éta.
  • Upami sumber daya diropéa, éta bakal ngirim béwara ka sadaya sumber anu ngalanggan éta.

Nanganan parameter unspecified

Sakumaha aturan, lamun sababaraha parameter sumberdaya teu boga nilai standar sarta parameter ieu teu dieusian dina manifest, wayang moal ngarobah sipat ieu pikeun sumberdaya pakait dina titik. Contona, upami sumberdaya tipe file parameter teu dieusian owner, mangka Wayang moal ngarobah nu boga file pakait.

Bubuka ka kelas, variabel jeung definisi

Anggap urang gaduh sababaraha titik anu gaduh bagian anu sami dina konfigurasi, tapi aya ogé anu béda - upami henteu, urang tiasa ngajelaskeun sadayana dina hiji blok. node {}. Tangtosna, anjeun ngan saukur tiasa nyalin bagian anu sami tina konfigurasi, tapi sacara umum ieu mangrupikeun solusi anu goréng - konfigurasi naék, sareng upami anjeun ngarobih bagian umum konfigurasi, anjeun kedah ngédit hal anu sami dina seueur tempat. Dina waktos anu sami, éta gampang pikeun ngalakukeun kasalahan, sareng sacara umum, prinsip DRY (ulah malikan diri anjeun) diciptakeun pikeun alesan.

Pikeun ngajawab masalah ieu aya desain saperti класс.

Kelas

kelas mangrupakeun blok ngaranna kode poppet. Kelas diperlukeun pikeun make deui kode.

Mimiti kelas perlu dijelaskeun. Katerangan sorangan henteu nambihan sumber daya di mana waé. Kelas digambarkeun dina manifests:

# Описание класса начинается с ключевого слова class и его названия.
# Дальше идёт тело класса в фигурных скобках.
class example_class {
    ...
}

Sanggeus ieu kelas bisa dipaké:

# первый вариант использования — в стиле ресурса с типом class
class { 'example_class': }
# второй вариант использования — с помощью функции include
include example_class
# про отличие этих двух вариантов будет рассказано дальше

Conto tina tugas saméméhna - hayu urang mindahkeun pamasangan sareng konfigurasi nginx kana kelas:

class nginx_example {
    package { 'nginx':
        ensure => installed,
    }
    -> file { '/etc/nginx':
        ensure => directory,
        source => 'puppet:///modules/example/nginx-conf',
        recure => true,
        purge  => true,
        force  => true,
    }
    ~> service { 'nginx':
        ensure => running,
        enable => true,
    }
}

node 'server2.testdomain' {
    include nginx_example
}

Variabel

Kelas ti conto saméméhna teu fléksibel pisan sabab salawasna brings konfigurasi nginx sarua. Hayu urang ngadamel jalur kana variabel konfigurasi, teras kelas ieu tiasa dianggo pikeun masang nginx sareng konfigurasi naon waé.

Éta tiasa dilakukeun ngagunakeun variabel.

Perhatian: variabel dina Wayang teu bisa dirobah!

Sajaba ti éta, variabel ngan bisa diaksés sanggeus eta geus dinyatakeun, disebutkeun nilai variabel bakal undef.

Conto gawé bareng variabel:

# создание переменных
$variable = 'value'
$var2 = 1
$var3 = true
$var4 = undef
# использование переменных
$var5 = $var6
file { '/tmp/text': content => $variable }
# интерполяция переменных — раскрытие значения переменных в строках. Работает только в двойных кавычках!
$var6 = "Variable with name variable has value ${variable}"

Wayang boga spasi ngaran, jeung variabel, sasuai, boga wewengkon pisibilitas: Variabel nu ngaranna sarua bisa dihartikeun dina spasi ngaran béda. Nalika ngabéréskeun nilai variabel, variabel dipilarian dina rohangan ngaran ayeuna, teras dina rohangan ngaran anu nutupan, sareng saterasna.

conto spasi ngaran:

  • global - variabel luar kelas atawa pedaran titik buka aya;
  • spasi ngaran titik dina pedaran titik;
  • spasi ngaran kelas dina pedaran kelas.

Pikeun ngahindarkeun ambiguitas nalika ngaksés variabel, anjeun tiasa netepkeun rohangan ngaran dina nami variabel:

# переменная без пространства имён
$var
# переменная в глобальном пространстве имён
$::var
# переменная в пространстве имён класса
$classname::var
$::classname::var

Hayu urang satuju yén jalur kana konfigurasi nginx perenahna dina variabel $nginx_conf_source. Lajeng kelas bakal kasampak kawas kieu:

class nginx_example {
    package { 'nginx':
        ensure => installed,
    }
    -> file { '/etc/nginx':
        ensure => directory,
        source => $nginx_conf_source,   # здесь используем переменную вместо фиксированной строки
        recure => true,
        purge  => true,
        force  => true,
    }
    ~> service { 'nginx':
        ensure => running,
        enable => true,
    }
}

node 'server2.testdomain' {
    $nginx_conf_source = 'puppet:///modules/example/nginx-conf'
    include nginx_example
}

Nanging, conto anu dipasihkeun goréng kusabab aya sababaraha "pangaweruh rusiah" anu aya di jero kelas variabel anu nganggo nami sapertos kitu. Éta langkung leres pikeun ngajantenkeun pangaweruh ieu umum - kelas tiasa gaduh parameter.

Parameter kelas mangrupakeun variabel dina ngaranspasi kelas, aranjeunna dieusian dina lulugu kelas sarta bisa dipaké kawas variabel biasa dina awak kelas. Nilai parameter dieusian nalika nganggo kelas dina manifes.

Parameter bisa disetel ka nilai standar. Upami parameter henteu ngagaduhan nilai standar sareng nilaina henteu disetel nalika dianggo, éta bakal nyababkeun kasalahan kompilasi.

Hayu urang parameterkeun kelas tina conto di luhur sareng tambahkeun dua parameter: anu kahiji, diperyogikeun, nyaéta jalur pikeun konfigurasi, sareng anu kadua, opsional, nyaéta nami pakét sareng nginx (dina Debian, contona, aya bungkusan. nginx, nginx-light, nginx-full).

# переменные описываются сразу после имени класса в круглых скобках
class nginx_example (
  $conf_source,
  $package_name = 'nginx-light', # параметр со значением по умолчанию
) {
  package { $package_name:
    ensure => installed,
  }
  -> file { '/etc/nginx':
    ensure  => directory,
    source  => $conf_source,
    recurse => true,
    purge   => true,
    force   => true,
  }
  ~> service { 'nginx':
    ensure => running,
    enable => true,
  }
}

node 'server2.testdomain' {
  # если мы хотим задать параметры класса, функция include не подойдёт* — нужно использовать resource-style declaration
  # *на самом деле подойдёт, но про это расскажу в следующей серии. Ключевое слово "Hiera".
  class { 'nginx_example':
    conf_source => 'puppet:///modules/example/nginx-conf',   # задаём параметры класса точно так же, как параметры для других ресурсов
  }
}

Dina Wayang, variabel diketik. Dahar loba tipe data. Jinis data biasana dianggo pikeun ngonfirmasi nilai parameter anu dikirimkeun ka kelas sareng definisi. Upami parameter anu diliwatan henteu cocog sareng jinis anu ditangtukeun, kasalahan kompilasi bakal lumangsung.

Jinisna ditulis langsung sateuacan nami parameter:

class example (
  String $param1,
  Integer $param2,
  Array $param3,
  Hash $param4,
  Hash[String, String] $param5,
) {
  ...
}

Kelas: kaasup classname vs class{'classname':}

Unggal kelas mangrupakeun sumberdaya tipe kelas. Sapertos jinis sumberdaya anu sanés, teu tiasa aya dua instansi kelas anu sami dina titik anu sami.

Upami anjeun nyobian nambihan kelas kana titik anu sami dua kali nganggo class { 'classname':} (euweuh bédana, kalawan parameter béda atawa idéntik), bakal aya kasalahan kompilasi. Tapi upami anjeun nganggo kelas dina gaya sumberdaya, anjeun tiasa langsung sacara eksplisit nyetél sadaya parameter na dina manifest.

Sanajan kitu, lamun ngagunakeun include, lajeng kelas bisa ditambahkeun saloba kali sakumaha dipikahoyongna. kanyataan éta include mangrupa fungsi idempotent nu mariksa naha kelas geus ditambahkeun kana diréktori. Upami kelasna henteu aya dina diréktori, éta nambihanana, sareng upami éta parantos aya, éta henteu ngalakukeun nanaon. Tapi bisi ngagunakeun include Anjeun teu tiasa nyetél parameter kelas salami deklarasi kelas - sadaya parameter anu diperyogikeun kedah disetél dina sumber data éksternal - Hiera atanapi ENC. Urang bakal ngobrol ngeunaan aranjeunna dina artikel salajengna.

Nangtukeun

Sakumaha ceuk dina blok saméméhna, kelas sarua teu bisa hadir dina titik leuwih ti sakali. Nanging, dina sababaraha kasus anjeun kedah tiasa nganggo blok kode anu sami sareng parameter anu béda dina titik anu sami. Dina basa sejen, aya anu peryogi pikeun jenis sumberdaya sorangan.

Contona, pikeun masang modul PHP, urang ngalakukeun ieu di Avito:

  1. Pasang pakét sareng modul ieu.
  2. Hayu urang nyieun file konfigurasi pikeun modul ieu.
  3. Urang nyieun symlink kana config pikeun php-fpm.
  4. Urang nyieun symlink ka config pikeun php cli.

Dina kasus sapertos kitu, desain sapertos nangtukeun (nangtukeun, tipe diartikeun, tipe sumberdaya tangtu). A Define téh sarupa jeung kelas, tapi aya béda: kahiji, unggal Define mangrupakeun tipe sumberdaya, teu sumberdaya a; kadua, unggal harti boga parameter implisit $title, dimana nami sumberdaya mana nalika dinyatakeun. Sapertos dina kasus kelas, definisi kedah dijelaskeun heula, saatos éta tiasa dianggo.

Conto saderhana sareng modul pikeun PHP:

define php74::module (
  $php_module_name = $title,
  $php_package_name = "php7.4-${title}",
  $version = 'installed',
  $priority = '20',
  $data = "extension=${title}.son",
  $php_module_path = '/etc/php/7.4/mods-available',
) {
  package { $php_package_name:
    ensure          => $version,
    install_options => ['-o', 'DPkg::NoTriggers=true'],  # триггеры дебиановских php-пакетов сами создают симлинки и перезапускают сервис php-fpm - нам это не нужно, так как и симлинками, и сервисом мы управляем с помощью Puppet
  }
  -> file { "${php_module_path}/${php_module_name}.ini":
    ensure  => $ensure,
    content => $data,
  }
  file { "/etc/php/7.4/cli/conf.d/${priority}-${php_module_name}.ini":
    ensure  => link,
    target  => "${php_module_path}/${php_module_name}.ini",
  }
  file { "/etc/php/7.4/fpm/conf.d/${priority}-${php_module_name}.ini":
    ensure  => link,
    target  => "${php_module_path}/${php_module_name}.ini",
  }
}

node server3.testdomain {
  php74::module { 'sqlite3': }
  php74::module { 'amqp': php_package_name => 'php-amqp' }
  php74::module { 'msgpack': priority => '10' }
}

Cara panggampangna pikeun nyekel kasalahan deklarasi Duplikat aya dina Define. Ieu kajadian lamun harti boga sumberdaya kalawan ngaran konstan, tur aya dua atawa leuwih instansi harti ieu dina sababaraha titik.

Gampang ngajaga diri tina ieu: sadaya sumber di jero definisi kedah gaduh nami gumantung $title. Alternatif nyaéta tambihan sumberdaya idempotent; dina kasus pangbasajanna, cukup pikeun mindahkeun sumber daya anu umum pikeun sadaya conto definisi kana kelas anu misah sareng kalebet kelas ieu dina definisi - fungsi. include idempotent.

Aya cara séjén pikeun ngahontal idémpotensi nalika nambahkeun sumber daya, nyaéta ngagunakeun fungsi defined и ensure_resources, Tapi kuring bakal ngabejaan Anjeun tentang eta dina episode salajengna.

Depéndensi sareng béwara pikeun kelas sareng definisi

Kelas sareng definisi nambihan aturan ieu pikeun nanganan katergantungan sareng bewara:

  • kagumantungan dina kelas a / ngartikeun nambahkeun kagumantungan dina sagala sumberdaya kelas / nangtukeun;
  • kelas a / nangtukeun kagumantungan nambahkeun kagumantungan ka sadaya kelas / nangtukeun sumberdaya;
  • kelas / nangtukeun bewara ngabéjaan sakabéh sumberdaya kelas / nangtukeun;
  • kelas / ngahartikeun langganan ngalanggan sagala sumberdaya kelas / nangtukeun.

Pernyataan kondisional sareng pamilih

Dokuméntasi di dieu.

if

Ieu basajan di dieu:

if ВЫРАЖЕНИЕ1 {
  ...
} elsif ВЫРАЖЕНИЕ2 {
  ...
} else {
  ...
}

kecuali lamun

iwal mangrupa lamun sabalikna: blok kode bakal dieksekusi lamun éksprési téh palsu.

unless ВЫРАЖЕНИЕ {
  ...
}

perkara

Henteu aya anu rumit di dieu ogé. Anjeun tiasa nganggo nilai biasa (string, angka, jsb.), ekspresi biasa, sareng jinis data salaku nilai.

case ВЫРАЖЕНИЕ {
  ЗНАЧЕНИЕ1: { ... }
  ЗНАЧЕНИЕ2, ЗНАЧЕНИЕ3: { ... }
  default: { ... }
}

Pamilih

Pamilih mangrupikeun konstruksi basa anu sami sareng case, Tapi tinimbang executing blok kode, eta mulih nilai a.

$var = $othervar ? { 'val1' => 1, 'val2' => 2, default => 3 }

Modul

Nalika konfigurasi leutik, éta gampang disimpen dina hiji manifest. Tapi langkung seueur konfigurasi anu kami jelaskeun, langkung seueur kelas sareng titik anu aya dina manifes, éta tumbuh, sareng janten teu pikaresepeun pikeun dianggo.

Sajaba ti éta, aya masalah pamakéan ulang kode - lamun sakabeh kode dina hiji manifest, hese babagi kode ieu kalawan batur. Pikeun ngaréngsékeun dua masalah ieu, Wayang boga éntitas anu disebut modul.

Modul - ieu mangrupikeun sét kelas, definisi sareng éntitas Wayang sanés anu disimpen dina diréktori anu misah. Dina basa sejen, modul mangrupa sapotong bebas logika Wayang. Contona, meureun aya modul pikeun gawé bareng nginx, sarta eta bakal ngandung naon jeung ngan naon anu diperlukeun pikeun digawe sareng nginx, atawa meureun aya modul pikeun gawé bareng PHP, jeung saterusna.

Modul diédisikeun, sareng katergantungan modul dina silih ogé dirojong. Aya gudang modul kabuka - Wayang Golek.

Dina server wayang, modul aya dina subdirektori modul tina diréktori akar. Di jero unggal modul aya skéma diréktori standar - manifes, file, témplat, lib, sareng anu sanésna.

Struktur file dina modul

Akar modul tiasa ngandung diréktori di handap ieu kalayan nami deskriptif:

  • manifests - eta ngandung manifestos
  • files - ngandung file
  • templates - éta ngandung témplat
  • lib - ngandung kode Ruby

Ieu sanés daptar lengkep diréktori sareng file, tapi cekap pikeun tulisan ieu ayeuna.

Ngaran sumberdaya jeung ngaran file dina modul

Dokuméntasi di dieu.

Sumberdaya (kelas, definisi) dina modul teu tiasa namina naon waé anu anjeun pikahoyong. Salaku tambahan, aya korespondensi langsung antara nami sumber sareng nami file dimana Wayang bakal milarian pedaran ngeunaan sumber éta. Upami anjeun ngalanggar aturan nami, maka Wayang ngan saukur moal mendakan pedaran sumber daya, sareng anjeun bakal nampi kasalahan kompilasi.

Aturanna saderhana:

  • Sadaya sumber dina modul kedah aya dina ruang ngaran modul. Lamun modul disebut foo, teras sadaya sumber di jerona kedah namina foo::<anything>, atawa ngan foo.
  • Sumberdaya sareng nami modul kedah aya dina file init.pp.
  • Pikeun sumber séjén, skéma ngaran file nyaéta kieu:
    • awalan kalawan nami modul dipiceun
    • kabéh titik ganda, lamun aya, diganti ku slashes
    • extension ditambahkeun .pp

Kuring baris demonstrate kalawan conto. Hayu urang nyebutkeun kuring nulis modul a nginx. Ieu ngandung sumberdaya handap:

  • класс nginx dijelaskeun dina manifest init.pp;
  • класс nginx::service dijelaskeun dina manifest service.pp;
  • nangtukeun nginx::server dijelaskeun dina manifest server.pp;
  • nangtukeun nginx::server::location dijelaskeun dina manifest server/location.pp.

Nyai

Pasti anjeun sorangan terang naon témplat; Kuring moal ngajelaskeun sacara rinci di dieu. Tapi kuring bakal ngantepkeun waé numbu ka Wikipedia.

Kumaha ngagunakeun témplat: Harti citakan tiasa dilegakeun nganggo fungsi template, nu diliwatan jalur ka citakan. Pikeun sumberdaya tipe file dipaké babarengan jeung parameter content. Contona, saperti kieu:

file { '/tmp/example': content => template('modulename/templatename.erb')

Témbongkeun jalur <modulename>/<filename> ngandung harti file <rootdir>/modules/<modulename>/templates/<filename>.

Salaku tambahan, aya fungsi inline_template - éta nampi téks template salaku input, sanés nami file.

Dina témplat, anjeun tiasa nganggo sadaya variabel Wayang dina lingkup ayeuna.

Wayang ngadukung témplat dina format ERB sareng EPP:

Sakeudeung ngeunaan ERB

Struktur kontrol:

  • <%= ВЫРАЖЕНИЕ %> - nyelapkeun nilai éksprési
  • <% ВЫРАЖЕНИЕ %> - ngitung nilai ekspresi (tanpa ngasupkeun). Pernyataan kondisional (upami) sareng loop (unggal) biasana di dieu.
  • <%# КОММЕНТАРИЙ %>

Ungkapan dina ERB ditulis dina Ruby (ERB sabenerna Embedded Ruby).

Pikeun ngakses variabel tina manifes, anjeun kedah nambihan @ kana ngaran variabel. Pikeun miceun putus garis nu nembongan sanggeus hiji ngawangun kontrol, anjeun kudu make tag nutup -%>.

Conto ngagunakeun citakan

Hayu urang nyebutkeun Kuring nulis modul ngadalikeun ZooKeeper. Kelas anu tanggung jawab pikeun nyiptakeun konfigurasi sapertos kieu:

class zookeeper::configure (
  Array[String] $nodes,
  Integer $port_client,
  Integer $port_quorum,
  Integer $port_leader,
  Hash[String, Any] $properties,
  String $datadir,
) {
  file { '/etc/zookeeper/conf/zoo.cfg':
    ensure  => present,
    content => template('zookeeper/zoo.cfg.erb'),
  }
}

Jeung template pakait zoo.cfg.erb - Janten:

<% if @nodes.length > 0 -%>
<% @nodes.each do |node, id| -%>
server.<%= id %>=<%= node %>:<%= @port_leader %>:<%= @port_quorum %>;<%= @port_client %>
<% end -%>
<% end -%>

dataDir=<%= @datadir %>

<% @properties.each do |k, v| -%>
<%= k %>=<%= v %>
<% end -%>

Fakta jeung Variabel Diwangun-di

Mindeng bagian husus tina konfigurasi gumantung kana naon ayeuna lumangsung dina titik. Salaku conto, gumantung kana naon pelepasan Debian, anjeun kedah masang hiji atanapi versi pakét anu sanés. Anjeun tiasa ngawas sadayana ieu sacara manual, nyerat ulang manifests upami titik robah. Tapi ieu sanés pendekatan anu serius; automation langkung saé.

Pikeun meunangkeun informasi ngeunaan node, Wayang boga mékanisme nu disebut fakta. Fakta - Ieu informasi ngeunaan titik, sadia dina manifests dina bentuk variabel biasa dina spasi ngaran global. Contona, ngaran host, versi sistem operasi, arsitéktur processor, daptar pamaké, daptar interfaces jaringan jeung alamat maranéhanana, sarta loba, leuwih. Fakta sayogi dina manifes sareng témplat salaku variabel biasa.

Conto gawé bareng fakta:

notify { "Running OS ${facts['os']['name']} version ${facts['os']['release']['full']}": }
# ресурс типа notify просто выводит сообщение в лог

Sacara formal, kanyataan boga ngaran (string) jeung nilai (rupa-rupa jenis sadia: string, arrays, kamus). Dahar susunan fakta diwangun-di. Anjeun oge bisa nulis sorangan. Koléktor fakta dijelaskeun kawas fungsi dina Rubyboh salaku file laksana. Fakta ogé bisa dibere dina formulir file téks kalawan data dina titik.

Salila operasi, agén wayang mimiti nyalin sakabéh kolektor kanyataan sadia ti pappetserver ka titik, nu satutasna ngajalankeun aranjeunna sarta ngirimkeun fakta dikumpulkeun ka server; Saatos ieu, server mimiti nyusun katalog.

Fakta dina bentuk file laksana

Fakta sapertos disimpen dina modul dina diréktori facts.d. Tangtosna, file kedah tiasa dieksekusi. Nalika dijalankeun, aranjeunna kedah ngaluarkeun inpormasi kana kaluaran standar dina format YAML atanapi konci = nilai.

Tong hilap yén faktana manglaku ka sadaya titik anu dikontrol ku server poppet dimana modul anjeun dipasang. Ku alatan éta, dina naskah, jaga pikeun pariksa yén sistem ngagaduhan sadaya program sareng file anu dipikabutuh pikeun kanyataan anjeun tiasa jalan.

#!/bin/sh
echo "testfact=success"
#!/bin/sh
echo '{"testyamlfact":"success"}'

Fakta Ruby

Fakta sapertos disimpen dina modul dina diréktori lib/facter.

# всё начинается с вызова функции Facter.add с именем факта и блоком кода
Facter.add('ladvd') do
# в блоках confine описываются условия применимости факта — код внутри блока должен вернуть true, иначе значение факта не вычисляется и не возвращается
  confine do
    Facter::Core::Execution.which('ladvdc') # проверим, что в PATH есть такой исполняемый файл
  end
  confine do
    File.socket?('/var/run/ladvd.sock') # проверим, что есть такой UNIX-domain socket
  end
# в блоке setcode происходит собственно вычисление значения факта
  setcode do
    hash = {}
    if (out = Facter::Core::Execution.execute('ladvdc -b'))
      out.split.each do |l|
        line = l.split('=')
        next if line.length != 2
        name, value = line
        hash[name.strip.downcase.tr(' ', '_')] = value.strip.chomp(''').reverse.chomp(''').reverse
      end
    end
    hash  # значение последнего выражения в блоке setcode является значением факта
  end
end

Fakta téks

Fakta sapertos disimpen dina titik dina diréktori /etc/facter/facts.d dina Wayang heubeul atawa /etc/puppetlabs/facts.d dina Wayang anyar.

examplefact=examplevalue
---
examplefact2: examplevalue2
anotherfact: anothervalue

Meunang Fakta

Aya dua cara pikeun ngadeukeutan kanyataan:

  • ngaliwatan kamus $facts: $facts['fqdn'];
  • ngagunakeun nami kanyataan salaku nami variabel: $fqdn.

Hadé pisan mun éta ngagunakeun kamus $facts, atawa malah leuwih hadé, nunjukkeun spasi ngaran global ($::facts).

Ieu bagian anu relevan tina dokuméntasi.

Diwangun-di Variabel

Salian ti kanyataan, aya ogé sababaraha variabel, sadia dina spasi ngaran global.

  • fakta dipercaya - variabel anu dicandak tina sertipikat klien (sabab sertipikat biasana dikaluarkeun dina server poppet, agén henteu tiasa ngan ukur nyandak sareng ngarobih sertipikatna, janten variabel "dipercaya"): nami sertipikat, nami sertipikat. host jeung domain, ekstensi ti sertipikat.
  • fakta server —variabel anu aya hubunganana sareng inpormasi ngeunaan server—versi, nami, alamat IP pangladén, lingkungan.
  • fakta agén - variabel ditambahkeun langsung ku wayang-agén, sarta henteu ku facter - ngaran sertipikat, versi agén, versi wayang.
  • variabel master - Variabel Pappetmaster (sic!). Ieu ngeunaan sarua jeung di fakta server, ditambah nilai parameter konfigurasi sadia.
  • variabel kompiler - variabel kompiler anu béda dina unggal wengkuan: nami modul ayeuna sareng nami modul dimana objék ayeuna diakses. Éta tiasa dianggo, contona, pikeun pariksa yén kelas pribadi anjeun henteu dianggo langsung tina modul anu sanés.

Tambihan 1: kumaha ngajalankeun sareng debug sadayana ieu?

Artikel nu ngandung loba conto kode wayang, tapi teu ngabejaan urang sakabehna kumaha ngajalankeun kode ieu. Muhun, abdi ngabenerkeun sorangan.

Agén cukup pikeun ngajalankeun Wayang, tapi pikeun kalolobaan kasus anjeun ogé peryogi server.

Agén

Sahenteuna saprak versi XNUMX, bungkusan wayang-agén ti gudang resmi Puppetlabs ngandung sakabéh kagumantungan (Ruby jeung gems pakait), jadi euweuh kasusah instalasi (Kuring ngawangkong ngeunaan sebaran basis Debian - urang teu make sebaran basis RPM).

Dina kasus pangbasajanna, pikeun nganggo konfigurasi wayang, cukup pikeun ngaluncurkeun agén dina modeu serverless: upami kodeu wayang disalin kana node, peluncuran. puppet apply <путь к манифесту>:

atikhonov@atikhonov ~/puppet-test $ cat helloworld.pp 
node default {
    notify { 'Hello world!': }
}
atikhonov@atikhonov ~/puppet-test $ puppet apply helloworld.pp 
Notice: Compiled catalog for atikhonov.localdomain in environment production in 0.01 seconds
Notice: Hello world!
Notice: /Stage[main]/Main/Node[default]/Notify[Hello world!]/message: defined 'message' as 'Hello world!'
Notice: Applied catalog in 0.01 seconds

Éta langkung saé, tangtosna, nyetél server sareng ngajalankeun agén dina titik dina modeu daemon - teras sakali unggal satengah jam aranjeunna bakal nerapkeun konfigurasi anu diunduh tina server.

Anjeun tiasa niru modél push gawé - buka titik nu dipikaresep tur mimitian sudo puppet agent -t. konci -t (--test) sabenerna ngawengku sababaraha pilihan nu bisa diaktipkeun individual. Pilihan ieu kalebet di handap ieu:

  • ulah ngajalankeun dina modeu daemon (sacara standar agén dimimitian dina modeu daemon);
  • Pareum saatos nerapkeun katalog (sacara standar, agén bakal terus dianggo sareng nerapkeun konfigurasi sakali unggal satengah jam);
  • nulis log karya lengkep;
  • nembongkeun parobahan dina file.

Agén boga hiji mode operasi tanpa parobahan - Anjeun bisa make eta lamun anjeun teu yakin kana nu geus ditulis konfigurasi bener tur hoyong pariksa naon kahayang agén bakal robah salila operasi. Modeu ieu diaktipkeun ku parameter --noop dina garis paréntah: sudo puppet agent -t --noop.

Salaku tambahan, anjeun tiasa ngaktipkeun log debugging karya - di dinya, wayang nyerat ngeunaan sadaya tindakan anu dilakukeun: ngeunaan sumber daya anu ayeuna diolah, ngeunaan parameter sumberdaya ieu, ngeunaan program naon anu diluncurkeun. Tangtu ieu parameter a --debug.

server

Kuring moal nganggap setup pinuh ku pappetserver jeung deploying kode ka dinya dina artikel ieu; Kuring ngan bakal disebutkeun yen out of the box aya versi fungsional pinuh tina server nu teu merlukeun konfigurasi tambahan pikeun digawe sareng sajumlah leutik. titik (sebutkeun, nepi ka saratus). Sajumlah ageung titik ngabutuhkeun tuning - sacara standar, puppetserver ngaluncurkeun henteu langkung ti opat padamel, pikeun pagelaran anu langkung ageung anjeun kedah ningkatkeun jumlahna sareng ulah hilap ningkatkeun wates mémori, upami henteu, server bakal ngumpulkeun sampah kalolobaan waktos.

Panyebaran kode - upami anjeun peryogi gancang sareng gampang, teras tingali (di r10k)[https://github.com/puppetlabs/r10k], pikeun instalasi leutik kudu cukup.

Addendum 2: Pedoman Coding

  1. Pasang sadayana logika dina kelas sareng definisi.
  2. Tetep kelas jeung definisi dina modul, teu di manifests ngajéntrékeun titik.
  3. Paké fakta.
  4. Ulah nyieun ifs dumasar kana hostnames.
  5. Ngarasa Luncat pikeun nambahkeun parameter pikeun kelas jeung definisi - ieu leuwih hade tinimbang logika implisit disumputkeun dina awak kelas / nangtukeun.

Kuring bakal ngajelaskeun naha kuring nyarankeun ngalakukeun ieu dina tulisan salajengna.

kacindekan

Pungkasan ku bubuka. Dina artikel salajengna kuring bakal nyaritakeun ngeunaan Hiera, ENC sareng PuppetDB.

Ngan pamaké nu kadaptar bisa ilubiung dina survey. Daptar, Punten.

Nyatana, langkung seueur bahan - kuring tiasa nyerat tulisan ngeunaan topik-topik ieu, milih naon anu anjeun resep maca:

  • 59,1%Konstruksi wayang canggih - sababaraha telek tingkat salajengna: puteran, pemetaan sareng ekspresi lambda anu sanés, kolektor sumberdaya, sumber ékspor sareng komunikasi antar-host ngalangkungan Wayang, tag, panyadia, jinis data abstrak.13
  • 31,8%"Kuring admin indung kuring" atanapi kumaha urang di Avito nyieun babaturan kalawan sababaraha server poppet tina versi béda, sarta, prinsipna mah, bagian ngeunaan administering server poppet.7
  • 81,8%Kumaha urang nulis kode wayang: instrumentation, dokuméntasi, nguji, CI / CD.18

22 pamaké milih. 9 pamaké abstained.

sumber: www.habr.com