پوپٽ جو تعارف

پوپٽ هڪ ترتيب واري انتظام جو نظام آهي. اهو لشڪر کي گهربل حالت ۾ آڻڻ ۽ هن رياست کي برقرار رکڻ لاءِ استعمال ڪيو ويندو آهي.

مان هاڻي پنجن سالن کان پپٽ سان ڪم ڪري رهيو آهيان. هي متن بنيادي طور تي سرڪاري دستاويزن مان اهم نقطن جو ترجمو ڪيل ۽ ترتيب ڏنل تالیف آهي، جيڪو شروع ڪندڙن کي جلدي سمجھڻ جي اجازت ڏيندو Puppet جو مضمون.

پوپٽ جو تعارف

بنيادي ڄاڻ

Puppet جو آپريٽنگ سسٽم ڪلائنٽ-سرور آهي، جيتوڻيڪ اهو پڻ سپورٽ ڪري ٿو سرور جي بغير آپريشن کي محدود ڪارڪردگي سان.

آپريشن جو هڪ پل ماڊل استعمال ڪيو ويو آهي: ڊفالٽ طور، هڪ ڀيرو هر اڌ ڪلاڪ، ڪلائنٽ سرور سان رابطو ڪن ٿا ترتيب ڏيڻ ۽ ان کي لاڳو ڪريو. جيڪڏهن توهان جوابي سان ڪم ڪيو آهي، پوء اهي هڪ مختلف پش ماڊل استعمال ڪندا آهن: منتظم ترتيب ڏيڻ جي عمل کي شروع ڪري ٿو، گراهڪ پاڻ کي ڪجهه به لاڳو نه ڪندا.

نيٽ ورڪ ڪميونيڪيشن دوران، ٻه طرفي TLS انڪرپشن استعمال ڪيو ويندو آهي: سرور ۽ ڪلائنٽ وٽ پنهنجون ذاتي چاٻيون ۽ لاڳاپيل سرٽيفڪيٽ آهن. عام طور تي سرور صارفين لاءِ سرٽيفڪيٽ جاري ڪندو آهي، پر اصولي طور تي اهو ممڪن آهي ته ٻاهرين CA استعمال ڪرڻ.

منشور جو تعارف

پوپٽ جي اصطلاح ۾ پوپٽ سرور ڏانهن نڻ نوڊس (نوڊس). نوڊس لاءِ ترتيب ڏنل آھي منشور ۾ خاص پروگرامنگ ٻولي ۾ - Puppet DSL.

پپٽ ڊي ايس ايل هڪ بياني ٻولي آهي. اهو بيان ڪري ٿو نوڊ جي گهربل حالت انفرادي وسيلن جي بيانن جي صورت ۾، مثال طور:

  • فائل موجود آهي ۽ ان ۾ مخصوص مواد آهي.
  • پيڪيج انسٽال ٿيل آهي.
  • سروس شروع ٿي وئي آهي.

وسيلن سان ڳنڍيل ٿي سگهي ٿو:

  • انحصار آهن، اهي ترتيب کي متاثر ڪن ٿا جنهن ۾ وسيلن کي استعمال ڪيو وڃي ٿو.
    مثال طور، "پهرين پيڪيج کي انسٽال ڪريو، پوءِ ترتيب واري فائيل کي ايڊٽ ڪريو، پوءِ سروس شروع ڪريو."
  • نوٽيفڪيشنون آهن - جيڪڏهن ڪو وسيلو تبديل ٿي ويو آهي، اهو ان جي رڪنيت حاصل ڪيل وسيلن ڏانهن اطلاع موڪلي ٿو.
    مثال طور، جيڪڏهن ٺاھ جوڙ فائل تبديل ٿي، توهان خودڪار طريقي سان سروس ٻيهر شروع ڪري سگهو ٿا.

اضافي طور تي، Puppet DSL ۾ افعال ۽ متغير آهن، انهي سان گڏ مشروط بيان ۽ چونڊ ڪندڙ. مختلف ٽيمپليٽنگ ميڪانيزم پڻ سپورٽ آهن - EPP ۽ ERB.

پوپٽ روبي ۾ لکيل آهي، تنهنڪري ڪيتريون ئي اڏاوتون ۽ اصطلاحون اتان ورتيون ويون آهن. روبي توهان کي پپٽ کي وڌائڻ جي اجازت ڏئي ٿو - پيچيده منطق شامل ڪريو، وسيلن جا نوان قسم، افعال.

جڏهن Puppet هلائي رهيو آهي، سرور تي هر مخصوص نوڊ لاء ظاهر ڪيل ڊاريڪٽري ۾ مرتب ڪيا ويا آهن. ڊاريڪٽري وسيلن جي هڪ فهرست آهي ۽ انهن جي لاڳاپن جي ڪارڪردگي، متغير ۽ مشروط بيانن جي توسيع جي قيمت جي حساب سان.

نحو ۽ ڪوڊ اسٽائل

هتي سرڪاري دستاويز جا حصا آهن جيڪي توهان جي نحو کي سمجهڻ ۾ مدد ڪندا جيڪڏهن مهيا ڪيل مثال ڪافي نه آهن:

هتي هڪ مثال آهي ته ڇا پڌرو ڏسڻ جهڙو آهي:

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

Indentation ۽ لڪير جي وقفي منشور جو گهربل حصو نه آھن، پر ھڪڙو سفارش ٿيل آھي انداز جي گائيڊ. خلاصو:

  • ٻه-اسپيس انڊنٽ، ٽيب استعمال نه ڪيا ويا آهن.
  • گھمڻ وارا ڪنگڻ هڪ اسپيس سان الڳ ڪيا ويا آهن؛ ڪالون هڪ خلا سان الڳ نه آهن.
  • ڪاما هر پيٽرول کان پوءِ، آخري هڪ سميت. هر پيٽرولر هڪ الڳ لائن تي آهي. هڪ استثنا ڪيس لاءِ بنايو ويو آهي بغير پيٽرولر ۽ هڪ پيٽرولر: توهان لکي سگهو ٿا هڪ لڪير تي ۽ بغير ڪاما جي (يعني. resource { 'title': } и resource { 'title': param => value }).
  • پيراگراف تي تير ساڳئي سطح تي هجڻ گهرجي.
  • وسيلا لاڳاپا تير انهن جي اڳيان لکيل آهن.

pappetserver تي فائلن جي جڳھ

وڌيڪ وضاحت لاءِ، مان ”روٽ ڊاريڪٽري“ جو تصور متعارف ڪندس. روٽ ڊاريڪٽري اها ڊاريڪٽري آهي جنهن ۾ هڪ مخصوص نوڊ لاءِ پپٽ ترتيب ڏنل آهي.

روٽ ڊاريڪٽري Puppet جي ورزن ۽ استعمال ٿيل ماحول تي منحصر ڪري ٿي. ماحوليات ٺاھ جوڙ جا آزاد سيٽ آھن جيڪي الڳ ڊائريڪٽرن ۾ محفوظ ٿيل آھن. عام طور تي گٽ سان ميلاپ ۾ استعمال ٿيندو آهي، انهي صورت ۾ ماحول گٽ شاخن مان ٺاهيا ويندا آهن. ان جي مطابق، هر نوڊ هڪ ماحول يا ٻئي ۾ واقع آهي. اهو نوڊ تي ترتيب ڏئي سگهجي ٿو، يا ENC ۾، جنهن بابت آئون ايندڙ مضمون ۾ ڳالهائيندس.

  • ٽئين نسخي ۾ ("پراڻي پوپٽ") بنيادي ڊاريڪٽري هئي /etc/puppet. ماحول جو استعمال اختياري آهي - مثال طور، اسان انهن کي پراڻي پوپٽ سان استعمال نٿا ڪريون. جيڪڏهن ماحول استعمال ڪيا وڃن، اهي عام طور تي ذخيرو ٿيل آهن /etc/puppet/environments، روٽ ڊاريڪٽري ماحول واري ڊاريڪٽري هوندي. جيڪڏهن ماحول استعمال نه ڪيو وڃي، روٽ ڊاريڪٽري بنيادي ڊاريڪٽري هوندي.
  • چوٿين ورزن ("نئين پپيٽ") کان شروع ڪندي، ماحول جو استعمال لازمي بڻجي ويو، ۽ بنيادي ڊاريڪٽري کي منتقل ڪيو ويو. /etc/puppetlabs/code. انهي جي مطابق، ماحول ۾ ذخيرو ٿيل آهن /etc/puppetlabs/code/environments، روٽ ڊاريڪٽري ماحولياتي ڊاريڪٽري آهي.

روٽ ڊاريڪٽري ۾ ھڪڙو ذيلي ڊاريڪٽري ھئڻ گھرجي manifests، جنهن ۾ هڪ يا وڌيڪ پڌريون شامل آهن جيڪي نوڊس کي بيان ڪن ٿيون. ان کان سواء، اتي هڪ ذيلي ڊائريڪٽري هجڻ گهرجي modules، جنهن ۾ ماڊل شامل آهن. مان توهان کي ٻڌايان ٿو ته ڪهڙا ماڊل آهن ٿوري دير کان پوء. ان کان علاوه، پراڻي پوپٽ پڻ هڪ ذيلي ڊائريڪٽري ٿي سگھي ٿي files، جنهن ۾ مختلف فائلون شامل آهن جن کي اسان نوڊس ڏانهن نقل ڪريون ٿا. نئين پوپٽ ۾، سڀئي فائلون ماڊلز ۾ رکيل آهن.

Manifest فائلن ۾ واڌارو آهي .pp.

جنگ جا ٻه مثال

ان تي نوڊ ۽ وسيلن جي وضاحت

نوڊ تي server1.testdomain هڪ فائل ٺاهڻ گهرجي /etc/issue مواد سان Debian GNU/Linux n l. فائل هڪ صارف ۽ گروپ جي ملڪيت هجڻ گهرجي root، رسائي جا حق هجڻ گهرجن 644.

اسان هڪ منشور لکون ٿا:

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 в начале будет воспринято как записанное в восьмеричной системе, и всё пойдёт не так, как задумано
    }
}

نوڊ تي وسيلن جي وچ ۾ لاڳاپا

نوڊ تي server2.testdomain nginx هلائڻ لازمي آهي، اڳوڻي تيار ڪيل ترتيب سان ڪم ڪندي.

اچو ته مسئلي کي ختم ڪريون:

  • پيڪيج کي انسٽال ڪرڻ جي ضرورت آهي nginx.
  • اهو ضروري آهي ته ترتيب واري فائلن کي سرور مان نقل ڪيو وڃي.
  • خدمت کي هلائڻ جي ضرورت آهي nginx.
  • جيڪڏهن ٺاھ جوڙ کي اپڊيٽ ڪيو وڃي، خدمت کي ٻيهر شروع ڪيو وڃي.

اسان هڪ منشور لکون ٿا:

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 получает уведомление,
  # соответствующий сервис перезапускается.
}

ھن لاءِ ڪم ڪرڻ لاءِ، توھان کي لڳ ڀڳ ھيٺ ڏنل فائل جي جڳھ جي ضرورت آھي پپٽ سرور تي:

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

وسيلن جا قسم

حمايت ڪيل وسيلن جي قسمن جي مڪمل فهرست ملي سگهي ٿي هتي دستاويز ۾، هتي مان پنجن بنيادي قسمن کي بيان ڪندس، جيڪي منهنجي عمل ۾ اڪثر مسئلن کي حل ڪرڻ لاءِ ڪافي آهن.

فائيل

فائلون، ڊائريڪٽري، سم لنڪس، انهن جي مواد، ۽ رسائي جي حقن کي منظم ڪري ٿو.

تقسيم:

  • وسيلن جو نالو - فائل ڏانهن رستو (اختياري)
  • رستو - فائل ڏانهن رستو (جيڪڏهن اهو نالو ۾ بيان نه ڪيو ويو آهي)
  • يقيني - فائل جو قسم:
    • absent - فائل کي ختم ڪريو
    • present - اتي ڪنهن به قسم جي فائل هجڻ گهرجي (جيڪڏهن ڪا فائل نه آهي، هڪ باقاعده فائل ٺاهي ويندي)
    • file - باقاعده فائل
    • directory - ڊاريڪٽري
    • link - symlink
  • مواد - فائل مواد (صرف باقاعده فائلن لاء مناسب، ان سان گڏ استعمال نه ٿي ڪري سگھجي ذريعو يا ھدف)
  • ذريعو - رستي جي هڪ لنڪ جنهن مان توهان فائل جي مواد کي نقل ڪرڻ چاهيو ٿا (سان گڏ استعمال نه ٿي ڪري سگھجي مواد يا ھدف). بيان ڪري سگهجي ٿو يا ته هڪ URI هڪ منصوبي سان puppet: (پوءِ ڪٺ پتلي سرور مان فائلون استعمال ڪيون وينديون) ۽ اسڪيم سان http: (مون کي اميد آهي ته اهو واضح آهي ته هن معاملي ۾ ڇا ٿيندو)، ۽ جيتوڻيڪ ڊراگرام سان file: يا هڪ اسڪيما کان سواءِ هڪ مطلق رستي جي طور تي (پوءِ نوڊ تي مقامي FS کان فائل استعمال ڪئي ويندي)
  • ھدف - جتي symlink اشارو ڪرڻ گهرجي (سان گڏ استعمال نه ٿو ڪري سگھجي مواد يا ذريعو)
  • مالڪ - صارف جيڪو فائل جي مالڪ هجڻ گهرجي
  • گروپ - اهو گروپ جنهن سان فائل هجڻ گهرجي
  • صورت - فائل جي اجازت (هڪ تار جي طور تي)
  • ٻيهر - recursive ڊاريڪٽري پروسيسنگ کي فعال ڪري ٿو
  • پاڪ - فائلن کي حذف ڪرڻ جي قابل بنائي ٿو جيڪي Puppet ۾ بيان نه ڪيا ويا آهن
  • قوت - ڊاريڪٽري کي حذف ڪرڻ جي قابل بنائي ٿو جيڪي Puppet ۾ بيان نه ڪيا ويا آهن

پئڪيج

پيڪيجز کي انسٽال ۽ ختم ڪري ٿو. نوٽيفڪيشن کي سنڀالڻ جي قابل - پيڪيج کي ٻيهر انسٽال ڪري ٿو جيڪڏهن پيٽرولر بيان ڪيو ويو آهي reinstall_on_refresh.

تقسيم:

  • وسيلن جو نالو - پيڪيج جو نالو (اختياري)
  • نالو - پيڪيج جو نالو (جيڪڏهن نالي ۾ بيان نه ڪيو ويو آهي)
  • فراهم ڪرڻ - پيڪيج مينيجر استعمال ڪرڻ لاء
  • يقيني - پيڪيج جي گهربل حالت:
    • present, installed - ڪو به نسخو نصب
    • latest - جديد نسخو نصب
    • absent ختم ٿيل (apt-get remove)
    • purged - ترتيب واري فائلن سان گڏ ختم ڪيو ويو (apt-get purge)
    • held - پيڪيج ورشن بند ٿيل آهي (apt-mark hold)
    • любая другая строка - مخصوص ورزن انسٽال ٿيل آهي
  • reinstall_on_refresh - جيڪڏهن true، پوءِ نوٽيفڪيشن جي وصولي تي پيڪيج ٻيهر انسٽال ڪيو ويندو. ماخذ تي مبني تقسيم لاءِ ڪارآمد، جتي تعميراتي پيٽرول کي تبديل ڪرڻ دوران پيڪيجز کي ٻيهر تعمير ڪرڻ ضروري هجي. ڊفالٽ false.

خدمت

خدمتون سرانجام ڏئي ٿو. نوٽيفڪيشن تي عمل ڪرڻ جي قابل - خدمت کي ٻيهر شروع ڪري ٿو.

تقسيم:

  • وسيلن جو نالو - خدمت جو انتظام ڪيو وڃي (اختياري)
  • نالو - خدمت جنهن کي منظم ڪرڻ جي ضرورت آهي (جيڪڏهن نالو ۾ بيان نه ڪيو ويو آهي)
  • يقيني - خدمت جي گهربل حالت:
    • running - شروع ڪيو
    • stopped - روڪيو
  • اهل - خدمت شروع ڪرڻ جي صلاحيت کي سنڀاليندو آهي:
    • true - autorun فعال آهي (systemctl enable)
    • mask - مخفي (systemctl mask)
    • false - autorun بند ٿيل آهي (systemctl disable)
  • شروع ڪر - خدمت کي ٻيهر شروع ڪرڻ جو حڪم
  • ڪيفيت - خدمت جي حالت چيڪ ڪرڻ لاء حڪم
  • ٻيهر شروع ڪيو - ظاهر ڪريو ته ڇا خدمت initscript ٻيهر شروع ڪرڻ جي حمايت ڪري ٿي. جيڪڏهن false ۽ پيٽرول بيان ڪيو ويو آهي شروع ڪر - هن پيٽرولر جو قدر استعمال ڪيو ويندو آهي. جيڪڏهن false ۽ پيرا ميٽر شروع ڪر بيان نه ڪيو ويو آهي - خدمت بند ٿي وئي آهي ۽ ٻيهر شروع ڪرڻ شروع ڪيو ويو آهي (پر systemd ڪمانڊ استعمال ڪري ٿو systemctl restart).
  • اسٽيٽس - ظاهر ڪريو ته ڇا خدمت initscript حڪم جي حمايت ڪري ٿي status. جيڪڏهن false، پوءِ پيٽرول جو قدر استعمال ڪيو ويندو آهي ڪيفيت. ڊفالٽ true.

exec

خارجي حڪمن کي هلائي ٿو. جيڪڏهن توهان وضاحت نه ڪندا آهيو پيٽرولر پيدا ٿيو, فقط ان صورت ۾, جيستائين يا تازگي سان, حڪم هلايو ويندو هر وقت Puppet هلائي ويندي. نوٽيفڪيشن تي عمل ڪرڻ جي قابل - حڪم هلائي ٿو.

تقسيم:

  • وسيلن جو نالو - ڪم ڪرڻ جو حڪم (اختياري)
  • حڪم - حڪم جاري ڪيو وڃي (جيڪڏهن اهو نالو ۾ بيان نه ڪيو ويو آهي)
  • رستو - رستا جنهن ۾ قابل عمل فائل ڳولڻ لاء
  • فقط ان صورت ۾ - جيڪڏهن هن پيراگراف ۾ بيان ڪيل حڪم صفر واپسي ڪوڊ سان مڪمل ڪيو وڃي، مکيه حڪم جاري ڪيو ويندو.
  • جيستائين - جيڪڏهن هن پيٽرولر ۾ بيان ڪيل حڪم غير صفر واپسي ڪوڊ سان مڪمل ڪيو وڃي، مکيه حڪم جاري ڪيو ويندو
  • پيدا ٿيو - جيڪڏهن هن پيٽرولر ۾ بيان ڪيل فائل موجود ناهي، مکيه حڪم جاري ڪيو ويندو
  • تازگي سان - جيڪڏهن true، پوءِ حڪم صرف هلايو ويندو جڏهن هي عمل ٻين وسيلن کان نوٽيفڪيشن وصول ڪندو
  • cwd - ڊاريڪٽري جنهن مان حڪم هلائڻ لاء
  • يوزر - استعمال ڪندڙ جنهن کان حڪم هلائڻ لاء
  • فراهم ڪرڻ - ڪيئن حڪم هلائڻ لاء:
    • پوسٽس - هڪ ٻار جو عمل آسان طور تي ٺهيل آهي، وضاحت ڪرڻ جي پڪ ڪريو رستو
    • شيل - حڪم شيل ۾ شروع ڪيو ويو آهي /bin/sh، وضاحت نه ٿي سگھي رستو، توھان استعمال ڪري سگھو ٿا گلوبنگ، پائپ ۽ ٻيون شيل خاصيتون. عام طور تي خودڪار طور تي معلوم ٿئي ٿو جيڪڏهن ڪي خاص اکر آهن (|, ;, &&, || وغيره).

کلون

ڪنٽرول ڪرون نوڪريون.

تقسيم:

  • وسيلن جو نالو - صرف ڪجهه قسم جي سڃاڻپ ڪندڙ
  • يقيني - تاج نوڪري جي حالت:
    • present - ٺاھيو جيڪڏھن موجود نه آھي
    • absent - ختم ڪريو جيڪڏھن موجود آھي
  • حڪم - هلائڻ جو ڪهڙو حڪم
  • ماحول - جنهن ماحول ۾ ڪمانڊ هلائڻو آهي (ماحولياتي متغيرن جي فهرست ۽ انهن جي قيمتن ذريعي =)
  • يوزر - جنهن صارف کان ڪمانڊ هلائڻ لاءِ
  • منٽ, ڪلاڪ, هفتي جو ڏينهن, مهينو, مهينو ڏينهن - جڏهن ڪرون کي هلائڻ لاء. جيڪڏهن انهن خاصيتن مان ڪا به وضاحت نه ڪئي وئي آهي، ان جي قيمت ڪرنٽاب ۾ هوندي *.

پوپٽ 6.0 ۾ کلون جهڙو دٻي مان هٽايو ويو puppetserver ۾، تنهنڪري عام سائيٽ تي ڪا به دستاويز ناهي. پر هو دٻي ۾ آهي puppet-agent ۾، تنهنڪري ان کي الڳ الڳ انسٽال ڪرڻ جي ڪا ضرورت ناهي. توھان ان لاء دستاويز ڏسي سگھو ٿا Puppet جي پنجين ورزن جي دستاويز ۾، يا GitHub تي.

عام وسيلن جي باري ۾

وسيلن جي انفراديت جي گهرج

سڀ کان وڌيڪ عام غلطي اسان کي منهن ڏيڻو آهي نقل جو اعلان. هي نقص تڏهن ٿئي ٿو جڏهن هڪ ئي قسم جا ٻه يا وڌيڪ وسيلا ساڳي نالي سان ڊاريڪٽري ۾ ظاهر ٿين ٿا.

تنهن ڪري، مان ٻيهر لکندس: ساڳي نوڊ جي منشور ۾ ساڳئي عنوان سان ساڳئي قسم جا وسيلا شامل نه هجڻ گهرجن!

ڪڏهن ڪڏهن هڪ ئي نالي سان پيڪيجز انسٽال ڪرڻ جي ضرورت آهي، پر مختلف پيڪيج مينيجرز سان. انهي حالت ۾، توهان کي استعمال ڪرڻ جي ضرورت آهي پيٽرولر nameغلطي کان بچڻ لاء:

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

ٻين وسيلن جي قسمن وٽ ساڳيا اختيار آھن نقل ڪرڻ کان بچڻ لاءِ - name у خدمت, command у exec، ۽ ايئن.

Metaparameters

هر وسيلن جي قسم ۾ ڪجهه خاص پيٽرولر آهن، ان جي فطرت کان سواء.

ميٽا پيرا ميٽرز جي مڪمل فهرست Puppet دستاويزن ۾.

مختصر فهرست:

  • گهربل - هي پيٽرولر ظاهر ڪري ٿو ته هي وسيلن تي منحصر آهي.
  • کان اڳ - ھي پيٽرول بيان ڪري ٿو ڪھڙا وسيلا ھن وسيلن تي منحصر آھن.
  • رڪنيت حاصل - هي پيٽرولر بيان ڪري ٿو ته ڪهڙن وسيلن مان هي وسيلو اطلاع حاصل ڪري ٿو.
  • اطلاع ڏيو - ھي پيٽرول بيان ڪري ٿو ته ڪھڙا وسيلا ھن وسيلا مان اطلاع وصول ڪن ٿا.

سڀ درج ٿيل ميٽاپيراميٽر قبول ڪن ٿا يا ته هڪ واحد وسيلا لنڪ يا لنڪ جي هڪ صف مربع بریکٹس ۾.

وسيلن ڏانهن لنڪس

هڪ وسيلن جي لنڪ صرف وسيلن جو ذڪر آهي. اهي خاص طور تي انحصار کي ظاهر ڪرڻ لاء استعمال ٿيندا آهن. غير موجود وسيلن جو حوالو ڏيڻ هڪ تاليف جي غلطي جو سبب بڻجندو.

لنڪ جو نحو هن ريت آهي: وسيلن جو قسم سرمائي خط سان (جيڪڏهن قسم جي نالي ۾ ڊبل ڪالون شامل آهن، پوء ڪالون جي وچ ۾ نالي جي هر حصي کي وڏو ڪيو ويندو آهي)، پوء وسيلن جو نالو چورس بریکٹ ۾ (نالي جي صورت) تبديل نٿو ٿئي!). ڪو به خال نه هجڻ گهرجي؛ چورس بریکٹس قسم جي نالي کان فوري طور تي لکيل آهن.

مثال طور

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

انحصار ۽ اطلاع

هتي دستاويز.

جيئن اڳ بيان ڪيو ويو آهي، وسيلن جي وچ ۾ سادي انحصار منتقلي آهي. رستي ۾، محتاط رھو جڏھن انحصار شامل ڪريو - توھان ٺاھي سگھو ٿا سائيڪل انحصار، جيڪو ھڪڙي تاليف جي غلطي جو سبب بڻجندو.

انحصار جي برعڪس، اطلاعن کي منتقلي نه آهي. نوٽيفڪيشن لاءِ ھيٺ ڏنل ضابطا لاڳو ٿين ٿا:

  • جيڪڏهن وسيلن کي هڪ نوٽيفڪيشن ملي ٿي، اهو اپڊيٽ ڪيو ويو آهي. تازه ڪاري ڪارناما وسيلن جي قسم تي منحصر آهن - exec حڪم هلائي ٿو، خدمت سروس ٻيهر شروع ڪري ٿو، پئڪيج پيڪيج کي ٻيهر انسٽال ڪري ٿو. جيڪڏهن وسيلا نه آهي تازه ڪاري عمل جي وضاحت ڪئي وئي، پوء ڪجھ به نه ٿيندو.
  • Puppet جي هڪ ڊوڙ دوران، وسيلن کي هڪ ڀيرو کان وڌيڪ اپڊيٽ نه ڪيو ويو آهي. اهو ممڪن آهي ڇاڪاڻ ته اطلاعن ۾ انحصار شامل آهي ۽ انحصار گراف ۾ سائيڪل شامل ناهي.
  • جيڪڏهن پپٽ هڪ وسيلن جي حالت کي تبديل ڪري ٿو، وسيلا ان جي رڪنيت حاصل ڪيل سڀني وسيلن ڏانهن اطلاع موڪلي ٿو.
  • جيڪڏهن هڪ وسيلو اپڊيٽ ڪيو ويو آهي، اهو ان جي رڪنيت حاصل ڪيل سڀني وسيلن ڏانهن اطلاع موڪلي ٿو.

اڻ ڄاڻايل پيٽرولر کي سنڀالڻ

ضابطي جي طور تي، جيڪڏهن ڪجهه وسيلن جي پيٽرولر ۾ ڊفالٽ قيمت نه آهي ۽ هي پيٽرولر ظاهر ۾ بيان نه ڪيو ويو آهي، پوء Puppet هن ملڪيت کي نوڊ تي لاڳاپيل وسيلن لاء تبديل نه ڪندو. مثال طور، جيڪڏهن قسم جو هڪ وسيلو فائيل پيٽرولر بيان نه ڪيو ويو آهي owner، پوء Puppet لاڳاپيل فائل جي مالڪ کي تبديل نه ڪندو.

طبقن جو تعارف، متغير ۽ وصفون

فرض ڪريو ته اسان وٽ ڪيترائي نوڊس آھن جن جي ٺاھ جوڙ جو ھڪڙو ئي حصو آھي، پر اتي پڻ اختلاف آھن - ٻي صورت ۾ اسين انھن سڀني کي ھڪڙي بلاڪ ۾ بيان ڪري سگھون ٿا. node {}. يقينا، توهان صرف ترتيب جي هڪجهڙائي واري حصن کي نقل ڪري سگهو ٿا، پر عام طور تي اهو هڪ خراب حل آهي - تشڪيل وڌندي آهي، ۽ جيڪڏهن توهان ترتيب جي عام حصي کي تبديل ڪندا آهيو، توهان کي ڪيترن ئي هنڌن تي ساڳي شيء کي تبديل ڪرڻو پوندو. ساڳئي وقت، غلطي ڪرڻ آسان آهي، ۽ عام طور تي، DRY (پاڻ کي ٻيهر نه ڏيو) اصول هڪ سبب لاء ايجاد ڪيو ويو.

هن مسئلي کي حل ڪرڻ لاء هڪ اهڙي جوڙجڪ آهي класс.

ڪلاس

ڪلاس پاپيٽ ڪوڊ جو نالو بلاڪ آهي. ڪوڊ ٻيهر استعمال ڪرڻ لاءِ ڪلاس گهربل آهن.

پهرين ڪلاس کي بيان ڪرڻ جي ضرورت آهي. وضاحت پاڻ ڪٿي به وسيلا شامل نه ڪندو آهي. ڪلاس ۾ بيان ڪيل آهي:

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

ان کان پوءِ ڪلاس استعمال ڪري سگھجي ٿو:

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

پوئين ڪم مان هڪ مثال - اچو ته nginx جي تنصيب ۽ ترتيب کي ڪلاس ۾ منتقل ڪريون:

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
}

مختلف

پوئين مثال کان ڪلاس تمام لچڪدار نه آهي ڇو ته اهو هميشه ساڳيو nginx ترتيب آڻيندو آهي. اچو ته رستو ٺاھيون ڪنفيگريشن متغير ڏانھن، پوءِ ھي ڪلاس استعمال ڪري سگھجي ٿو nginx کي انسٽال ڪرڻ لاءِ ڪنھن به ترتيب سان.

اهو ڪري سگهجي ٿو variables استعمال ڪندي.

ڌيان: ڪٺ پتلي ۾ متغير ناقابل بدلجندڙ آهن!

ان کان علاوه، هڪ متغير صرف ان جي اعلان ٿيڻ کان پوء رسائي ڪري سگهجي ٿو، ٻي صورت ۾ متغير جو قدر ٿيندو undef.

متغير سان ڪم ڪرڻ جا مثال:

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

پوپٽ آهي نالي جي جڳھ، ۽ متغير، مطابق، آهن نمائش جو علائقو: ساڳئي نالي سان هڪ متغير مختلف نالن جي جڳهن ۾ بيان ڪري سگهجي ٿو. جڏهن هڪ متغير جي قيمت کي حل ڪندي، متغير کي موجوده نالي جي جڳهه ۾ ڳولهيو ويندو آهي، پوء ان کي بند ڪرڻ واري نالي جي جاء ۾، وغيره.

نالي جي جڳھ جا مثال:

  • عالمي - ڪلاس کان ٻاهر متغير يا نوڊ وضاحت اتي وڃو؛
  • نوڊ وضاحت ۾ نوڊ نالي جي جڳھ؛
  • ڪلاس جي وضاحت ۾ class namespace.

ابهام کان بچڻ لاءِ جڏهن متغير تائين رسائي حاصل ڪجي، توهان متغير جي نالي ۾ نالي جي جاءِ بيان ڪري سگهو ٿا:

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

اچو ته متفق آهيون ته نينڪس جي ترتيب جو رستو متغير ۾ آهي $nginx_conf_source. پوءِ ڪلاس هن طرح نظر ايندو:

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
}

تنهن هوندي به، ڏنل مثال خراب آهي ڇو ته اتي ڪجهه ”خفيه علم“ هوندو آهي ته ڪلاس جي اندر ڪنهن جاءِ تي اهڙي ۽ اهڙي نالي سان متغير استعمال ٿيندو آهي. هن علم کي عام ڪرڻ تمام گهڻو صحيح آهي - طبقن جا پيرا ميٽر هوندا.

ڪلاس پيراگراف ڪلاس جي نالي واري جڳهه ۾ متغير آهن، اهي ڪلاس هيڊر ۾ بيان ڪيا ويا آهن ۽ ڪلاس باڊي ۾ باقاعده متغير وانگر استعمال ڪري سگھجن ٿا. پراميٽر جي قيمت بيان ڪئي وئي آهي جڏهن ڪلاس استعمال ڪندي منشور ۾.

پيٽرولر کي ڊفالٽ قيمت تي سيٽ ڪري سگھجي ٿو. جيڪڏهن هڪ پيٽرولر ۾ ڊفالٽ قيمت نه آهي ۽ قيمت مقرر نه ڪئي وئي آهي جڏهن استعمال ڪيو وڃي، اهو هڪ تاليف جي غلطي جو سبب ٿيندو.

اچو ته مٿي ڏنل مثال مان ڪلاس کي ترتيب ڏيو ۽ ٻه پيرا ميٽرز شامل ڪريو: پهريون، گهربل، ترتيب ڏيڻ جو رستو آهي، ۽ ٻيو، اختياري، nginx سان پيڪيج جو نالو آهي (ديبين ۾، مثال طور، پيڪيجز آهن. 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',   # задаём параметры класса точно так же, как параметры для других ресурсов
  }
}

Puppet ۾، متغير ٽائيپ ٿيل آهن. کائو ڊيٽا جا ڪيترائي قسم. ڊيٽا جا قسم عام طور تي استعمال ڪيا ويا آھن پيٽرولر جي قدرن کي درست ڪرڻ لاءِ جيڪي ڪلاس ۽ وصفن ۾ گذري ويا آھن. جيڪڏهن منظور ٿيل پيٽرولر مخصوص قسم سان نه ملندو آهي، هڪ تاليف جي غلطي ٿيندي.

قسم کي فوري طور تي پيٽرولر جي نالي کان اڳ لکيو ويو آهي:

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

ڪلاس: شامل ڪريو ڪلاس جو نالو بمقابلہ ڪلاس{'classname':}

هر ڪلاس قسم جو هڪ ذريعو آهي ڪلاس. جيئن ڪنهن ٻئي قسم جي وسيلن سان، ساڳئي نوڊ تي ساڳئي طبقي جا ٻه مثال نه ٿي سگهن.

جيڪڏھن توھان ڪوشش ڪريو ھڪڙي طبقي کي ساڳي نوڊ ۾ ٻه ڀيرا استعمال ڪندي class { 'classname':} (ڪو به فرق نه آهي، مختلف يا هڪجهڙائي واري پيٽرولن سان)، اتي هڪ تاليف جي غلطي هوندي. پر جيڪڏهن توهان وسيلن جي انداز ۾ هڪ ڪلاس استعمال ڪريو ٿا، ته توهان فوري طور تي واضح طور تي ان جا سڀئي پيرا ميٽرز منشور ۾ سيٽ ڪري سگهو ٿا.

بهرحال، جيڪڏهن توهان استعمال ڪريو include، پوءِ ڪلاس کي شامل ڪري سگھجي ٿو جيترو ڀيرا گھربل. حقيقت اها آهي ته include هڪ idempotent فنڪشن آهي جيڪو چيڪ ڪري ٿو ته ڇا ڊاريڪٽري ۾ ڪلاس شامل ڪيو ويو آهي. جيڪڏهن ڪلاس ڊاريڪٽري ۾ نه آهي، اهو ان کي شامل ڪري ٿو، ۽ جيڪڏهن اهو اڳ ۾ ئي موجود آهي، اهو ڪجهه به ناهي. پر استعمال جي صورت ۾ include توھان ڪلاس جي بيان دوران ڪلاس پيٽرولر مقرر نٿا ڪري سگھو - سڀ گھربل پيٽرولر ھڪڙي خارجي ڊيٽا ماخذ ۾ مقرر ڪيا وڃن - Hiera يا ENC. اسان ايندڙ مضمون ۾ انھن جي باري ۾ ڳالهائي ويندي.

تعريف ڪري ٿو

جيئن اڳئين بلاڪ ۾ چيو ويو آهي، ساڳيو طبقو هڪ ڀيرو کان وڌيڪ نوڊ تي موجود نه ٿو ٿي سگهي. جڏهن ته، ڪجهه حالتن ۾ توهان کي استعمال ڪرڻ جي قابل هوندو ڪوڊ جو ساڳيو بلاڪ ساڳيو نوڊ تي مختلف پيٽرولن سان. ٻين لفظن ۾، هڪ وسيلن جي پنهنجي قسم جي ضرورت آهي.

مثال طور، پي ايڇ پي ماڊل کي انسٽال ڪرڻ لاءِ، اسان Avito ۾ هيٺيان ڪندا آهيون:

  1. هن ماڊل سان پيڪيج انسٽال ڪريو.
  2. اچو ته هن ماڊل لاءِ هڪ ترتيب واري فائيل ٺاهي.
  3. اسان php-fpm لاءِ ترتيب ڏيڻ لاءِ هڪ سملنک ٺاهيندا آهيون.
  4. اسان php cli لاءِ ترتيب ڏيڻ لاءِ هڪ سم لنڪ ٺاهيندا آهيون.

اهڙين حالتن ۾، هڪ ڊزائن جهڙوڪ تعريف ڪرڻ (وضاحت، بيان ڪيل قسم، بيان ڪيل وسيلن جو قسم). A Define هڪ طبقي سان ملندڙ جلندڙ آهي، پر ان ۾ اختلاف آهن: پهريون، هر Define هڪ وسيلن جو قسم آهي، نه وسيلو؛ ٻيو، هر وصف هڪ غير واضح پيٽرولر آهي $title، جتي وسيلن جو نالو وڃي ٿو جڏهن اهو اعلان ڪيو وڃي. جيئن ته طبقن جي صورت ۾، هڪ تعريف کي پهريان بيان ڪيو وڃي، جنهن کان پوء ان کي استعمال ڪري سگهجي ٿو.

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' }
}

نقل جي اعلان جي غلطي کي پڪڙڻ جو آسان طريقو Define ۾ آهي. اهو تڏهن ٿئي ٿو جڏهن هڪ تعريف ۾ هڪ وسيلو آهي مسلسل نالي سان، ۽ ڪجهه نوڊ تي هن تعريف جا ٻه يا وڌيڪ مثال آهن.

ان کان پاڻ کي بچائڻ آسان آهي: تعريف جي اندر سڀني وسيلن جو نالو هجڻ گهرجي ان تي منحصر آهي $title. هڪ متبادل آهي وسيلن جو غير معمولي اضافو؛ آسان ترين صورت ۾، اهو ڪافي آهي ته وصف جي سڀني مثالن لاءِ عام وسيلن کي الڳ ڪلاس ۾ منتقل ڪيو وڃي ۽ هن طبقي کي وصف ۾ شامل ڪيو وڃي. include ڪمزور.

وسيلا شامل ڪرڻ وقت ادراڪ حاصل ڪرڻ جا ٻيا طريقا آهن، يعني افعال استعمال ڪندي defined и ensure_resources، پر مان توهان کي ان بابت ايندڙ قسط ۾ ٻڌائيندس.

ڪلاس ۽ وصفن لاءِ انحصار ۽ اطلاع

ڪلاس ۽ وصفون ھيٺيون ضابطا شامل ڪن ٿا انحصار ۽ اطلاعن کي سنڀالڻ لاءِ:

  • ڪلاس/define تي انحصار طبقي جي سڀني وسيلن تي انحصار وڌائي ٿو/define؛
  • هڪ طبقو/تعين انحصار انحصار کي شامل ڪري ٿو سڀني طبقن تي/وضاحت جي وسيلن؛
  • class/define نوٽيفڪيشن ڪلاس جي سڀني وسيلن کي مطلع ڪري ٿو/define؛
  • class/define سبسڪرپشن ڪلاس جي سڀني وسيلن کي سبسڪرائب ڪري ٿو/define.

مشروط بيان ۽ چونڊيندڙ

هتي دستاويز.

if

اهو هتي سادو آهي:

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

جيستائين

جيستائين هڪ جيڪڏهن ريورس ۾ آهي: ڪوڊ جو بلاڪ عمل ڪيو ويندو جيڪڏهن اظهار غلط آهي.

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

ڪيس

هتي ڪجھ به پيچيده نه آهي. توھان استعمال ڪري سگھوٿا باقاعده قدر (strings، انگ، وغيره)، باقاعده اظهار، ۽ ڊيٽا جي قسمن کي قدر طور.

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

چونڊيندڙ

هڪ چونڊيندڙ هڪ ٻوليءَ جي تعمير آهي جنهن سان ملندڙ جلندڙ آهي case، پر ڪوڊ جي بلاڪ تي عمل ڪرڻ جي بدران، اهو هڪ قدر واپس ڪري ٿو.

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

ماڊلز

جڏهن تشڪيل ننڍڙو آهي، اهو آساني سان هڪ ظاهر ۾ رکي سگهجي ٿو. پر جيتريون وڌيڪ تشڪيلون اسان بيان ڪيون ٿا، اوترو وڌيڪ طبقو ۽ نوڊس منشور ۾ آهن، اهو وڌي ٿو، ۽ ان سان ڪم ڪرڻ ۾ تڪليف ٿئي ٿي.

ان کان علاوه، ڪوڊ ٻيهر استعمال ڪرڻ جو مسئلو آهي - جڏهن سڀ ڪوڊ هڪ ظاهر ۾ آهي، اهو ڏکيو آهي ته هن ڪوڊ کي ٻين سان حصيداري ڪرڻ. انهن ٻن مسئلن کي حل ڪرڻ لاءِ، Puppet وٽ هڪ ادارو آهي جنهن کي ماڊيول سڏيو ويندو آهي.

ماڊلز - اهي طبقن جا سيٽ آهن، وصفون ۽ ٻيون Puppet ادارن هڪ الڳ ڊاريڪٽري ۾ رکيل آهن. ٻين لفظن ۾، هڪ ماڊل Puppet منطق جو هڪ آزاد ٽڪرو آهي. مثال طور، نينگڪس سان ڪم ڪرڻ لاءِ هڪ ماڊل ٿي سگهي ٿو، ۽ ان ۾ اهو هوندو ته ڇا ۽ صرف اهو هوندو جيڪو نينگڪس سان ڪم ڪرڻ جي ضرورت آهي، يا ٿي سگهي ٿو PHP سان ڪم ڪرڻ لاءِ ماڊل، وغيره.

ماڊلز ورجن ٿيل آهن، ۽ هڪ ٻئي تي ماڊلز جي انحصار پڻ سپورٽ آهن. ماڊلز جو هڪ کليل مخزن آهي - پوپٽ فورج.

پوپٽ سرور تي، ماڊل روٽ ڊاريڪٽري جي ماڊيولز سب ڊاريڪٽري ۾ واقع آهن. هر ماڊل جي اندر هڪ معياري ڊاريڪٽري اسڪيم آهي - ظاهر، فائلون، ٽيمپليٽ، lib، وغيره.

ھڪڙي ماڊل ۾ فائل جي جوڙجڪ

ماڊل جي روٽ ۾ وضاحتي نالن سان هيٺيون ڊائريڪٽريون شامل ٿي سگھن ٿيون:

  • manifests - اهو منشور تي مشتمل آهي
  • files - اھو فائلن تي مشتمل آھي
  • templates - ان ۾ ٽيمپليٽ شامل آهن
  • lib - اهو روبي ڪوڊ تي مشتمل آهي

هي ڊائريڪٽرن ۽ فائلن جي مڪمل فهرست نه آهي، پر اهو هن مضمون لاء ڪافي آهي.

وسيلن جا نالا ۽ ماڊل ۾ فائلن جا نالا

هتي دستاويز.

وسيلا (ڪلاس، وصفون) هڪ ماڊل ۾ جيڪي توهان چاهيو ٿا اهو نالو نٿو ڏئي سگهجي. ان کان علاوه، ھڪڙي وسيلن جي نالي ۽ فائل جي نالي جي وچ ۾ ھڪڙو سڌو رابطو آھي جنھن ۾ پپٽ ان وسيلن جي وضاحت لاء نظر ايندو. جيڪڏھن توھان نالن جي ضابطن جي ڀڃڪڙي ڪريو ٿا، ته پوءِ Puppet صرف وسيلن جي وضاحت نه لھندي، ۽ توھان کي گڏ ڪرڻ جي غلطي ملندي.

ضابطا سادي آهن:

  • ماڊيول ۾ سڀ وسيلا ماڊيول جي نالي واري جاءِ ۾ هجڻ گهرجن. جيڪڏهن ماڊل سڏيو ويندو آهي foo، پوءِ ان ۾ سڀني وسيلن جو نالو رکيو وڃي foo::<anything>، يا صرف foo.
  • ماڊيول جي نالي سان وسيلن کي فائل ۾ هجڻ گهرجي init.pp.
  • ٻين وسيلن لاء، فائل جي نالي جي اسڪيم هيٺ ڏنل آهي:
    • ماڊل جي نالي سان اڳياڙي رد ڪئي وئي آهي
    • سڀئي ڊبل ڪالون، جيڪڏهن ڪو به آهن، سليش سان تبديل ڪيا ويا آهن
    • واڌ شامل ڪئي وئي آهي .pp

مان هڪ مثال سان بيان ڪندس. اچو ته مان هڪ ماڊل لکي رهيو آهيان nginx. اهو هيٺين وسيلن تي مشتمل آهي:

  • класс nginx پڌرنامي ۾ بيان ڪيو ويو آهي init.pp;
  • класс nginx::service پڌرنامي ۾ بيان ڪيو ويو آهي service.pp;
  • تعريف ڪرڻ nginx::server پڌرنامي ۾ بيان ڪيو ويو آهي server.pp;
  • تعريف ڪرڻ nginx::server::location پڌرنامي ۾ بيان ڪيو ويو آهي server/location.pp.

نشانيون

يقيناً توهان پاڻ ڄاڻو ٿا ته ٽيمپليٽس ڇا آهن؛ مان انهن کي هتي تفصيل سان بيان نه ڪندس. پر مان ان کي صرف صورت ۾ ڇڏي ڏيندس وڪيپيڊيا سان ڳنڍيو.

ٽيمپليٽ کي ڪيئن استعمال ڪجي: ٽيمپليٽ جي معني کي فنڪشن استعمال ڪندي وڌائي سگھجي ٿو template، جيڪو ٽيمپليٽ ڏانهن رستو گذري ويو آهي. قسم جي وسيلن لاء فائيل پيرا ميٽر سان گڏ استعمال ڪيو content. مثال طور، هن طرح:

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

رستو ڏسو <modulename>/<filename> فائل جو مطلب آهي <rootdir>/modules/<modulename>/templates/<filename>.

ان کان علاوه ، اتي ھڪڙو فنڪشن آھي inline_template - اهو حاصل ڪري ٿو ٽيمپليٽ ٽيڪسٽ ان پٽ طور، نه فائل جو نالو.

ٽيمپليٽس جي اندر، توھان استعمال ڪري سگھوٿا سڀ پپٽ متغير موجوده دائري ۾.

Puppet ERB ۽ EPP فارميٽ ۾ ٽيمپليٽس کي سپورٽ ڪري ٿو:

ERB بابت مختصر طور

ڪنٽرول جوڙجڪ:

  • <%= ВЫРАЖЕНИЕ %> - اظهار جي قيمت داخل ڪريو
  • <% ВЫРАЖЕНИЕ %> - هڪ اظهار جي قيمت کي ڳڻيو (ان کي داخل ڪرڻ کان سواء). مشروط بيان (جيڪڏهن) ۽ لوپس (هر) عام طور تي هتي وڃو.
  • <%# КОММЕНТАРИЙ %>

ERB ۾ ايڪسپريشن روبي ۾ لکيل آهن (ERB اصل ۾ شامل ٿيل روبي آهي).

منشور مان متغيرن تائين رسائي حاصل ڪرڻ لاءِ، توھان کي شامل ڪرڻو پوندو @ متغير جي نالي سان. هڪ لڪير برڪ کي هٽائڻ لاء جيڪو ڪنٽرول تعمير کان پوء ظاهر ٿئي ٿو، توهان کي بند ڪرڻ واري ٽيگ استعمال ڪرڻ جي ضرورت آهي -%>.

ٽيمپليٽ استعمال ڪرڻ جو مثال

اچو ته چئو ته مان هڪ ماڊل لکي رهيو آهيان ZooKeeper کي ڪنٽرول ڪرڻ لاءِ. config ٺاهڻ جو ذميوار طبقو ڪجهه هن طرح نظر اچي ٿو:

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'),
  }
}

۽ لاڳاپيل ٽيمپليٽ zoo.cfg.erb - پوء:

<% 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 -%>

حقيقتون ۽ تعمير ٿيل متغير

گهڻو ڪري ترتيب جي مخصوص حصي تي منحصر هوندو آهي جيڪو هن وقت نوڊ تي ٿي رهيو آهي. مثال طور، ڊيبين رليز ڇا تي منحصر آهي، توهان کي انسٽال ڪرڻ جي ضرورت آهي هڪ يا ٻيو نسخو پيڪيج. توھان انھن سڀني کي دستي طور تي مانيٽر ڪري سگھو ٿا، جيڪڏھن نوڊس تبديل ٿي وڃن ٿا. پر اهو هڪ سنجيده طريقو ناهي؛ خودڪار گهڻو بهتر آهي.

نوڊس جي باري ۾ معلومات حاصل ڪرڻ لاء، Puppet هڪ ميکانيزم آهي جنهن کي حقيقت سڏيو ويندو آهي. حقيقت - هي نوڊ جي باري ۾ معلومات آهي، جيڪا عالمي نالي جي اسپيس ۾ عام متغيرن جي صورت ۾ منشور ۾ موجود آهي. مثال طور، ميزبان جو نالو، آپريٽنگ سسٽم جو نسخو، پروسيسر فن تعمير، صارفين جي فهرست، نيٽ ورڪ انٽرفيس جي فهرست ۽ انهن جا پتا، ۽ گهڻو ڪجهه. حقيقتون منشور ۽ ٽيمپليٽس ۾ باقاعده متغير طور موجود آهن.

حقيقتن سان ڪم ڪرڻ جو هڪ مثال:

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

رسمي طور تي ڳالهائڻ، حقيقت ۾ هڪ نالو (string) ۽ هڪ قدر آهي (مختلف قسمون موجود آهن: تار، صفون، لغات). کائو تعمير ٿيل حقيقتن جو مجموعو. توهان پڻ پنهنجو پاڻ کي لکي سگهو ٿا. حقيقتون جمع ڪندڙ بيان ڪيا ويا آهن روبي ۾ افعال وانگريا جيئن قابل عمل فائلون. حقيقتون پڻ فارم ۾ پيش ڪري سگهجن ٿيون ڊيٽا سان گڏ ٽيڪسٽ فائلون نوڊس تي.

آپريشن دوران، پپٽ ايجنٽ سڀ کان پهريان پيپٽ سرور کان نوڊ تائين موجود سڀني حقيقتن جي ڪليڪٽرن کي نقل ڪري ٿو، جنهن کان پوء اهو انهن کي لانچ ڪري ٿو ۽ گڏ ڪيل حقيقتون سرور ڏانهن موڪلي ٿو؛ ان کان پوء، سرور فهرست کي گڏ ڪرڻ شروع ڪري ٿو.

قابل عمل فائلن جي صورت ۾ حقيقتون

اهڙيون حقيقتون ڊاريڪٽري ۾ ماڊلز ۾ رکيل آهن facts.d. يقينا، فائلون قابل عمل هجڻ گهرجن. جڏهن هلندا آهن، انهن کي يا ته YAML يا key=value فارميٽ ۾ معياري ٻاڦ ۾ معلومات کي ٻاھر ڪڍڻ گھرجي.

اهو نه وساريو ته حقيقتون سڀني نوڊس تي لاڳو ٿين ٿيون جيڪي ڪنٽرول ٿيل آهن پاپيٽ سرور جنهن تي توهان جو ماڊل لڳايو ويو آهي. تنهن ڪري، اسڪرپٽ ۾، چيڪ ڪرڻ جو خيال رکجو ته سسٽم ۾ سڀئي پروگرام ۽ فائلون آهن جيڪي توهان جي حقيقت جي ڪم ڪرڻ لاء ضروري آهن.

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

روبي حقيقتون

اهڙيون حقيقتون ڊاريڪٽري ۾ ماڊلز ۾ رکيل آهن 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

متن حقيقتون

اهڙيون حقيقتون ڊاريڪٽري ۾ نوڊس تي رکيل آهن /etc/facter/facts.d پراڻي پتلي ۾ يا /etc/puppetlabs/facts.d نئين پوپٽ ۾.

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

حقيقتن تائين پهچڻ

حقيقتن تائين پهچڻ جا ٻه طريقا آهن:

  • لغت ذريعي $facts: $facts['fqdn'];
  • حقيقت جو نالو استعمال ڪندي variable نالو: $fqdn.

اهو بهترين آهي هڪ لغت استعمال ڪرڻ $facts، يا اڃا به بهتر، ظاهر ڪريو عالمي نالي جي جڳهه ($::facts).

هتي دستاويز جو لاڳاپيل حصو آهي.

تعمير ٿيل متغير

حقيقتن کان علاوه، اتي پڻ آهي ڪجھ متغير, عالمي نالي جي جاء تي دستياب آهي.

  • معتبر حقيقتون - متغير جيڪي ڪلائنٽ جي سرٽيفڪيٽ مان ورتا ويا آهن (جيئن ته سرٽيفڪيٽ عام طور تي پاپيٽ سرور تي جاري ڪيو ويندو آهي، ايجنٽ صرف ان جي سرٽيفڪيٽ کي وٺي ۽ تبديل نٿو ڪري سگهي، تنهن ڪري متغير آهن "قابل اعتماد"): سرٽيفڪيٽ جو نالو، نالو جو نالو ميزبان ۽ ڊومين، سرٽيفڪيٽ مان واڌايون.
  • سرور حقيقتون سرور بابت معلومات سان لاڳاپيل متغير - ورجن، نالو، سرور IP پتو، ماحول.
  • ايجنٽ حقيقتون - متغير سڌو سنئون ڪٺ پتلي-ايجنٽ طرفان شامل ڪيو ويو، ۽ فيڪٽر طرفان نه - سرٽيفڪيٽ جو نالو، ايجنٽ ورزن، ڪٺ پتلي ورزن.
  • ماسٽر متغير - پيپٽ ماسٽر متغير (sic!). اهو اٽڪل ساڳيو آهي جيئن ۾ سرور حقيقتون, plus configuration parameter values ​​موجود آهن.
  • مرتب ڪندڙ متغير - مرتب ڪندڙ متغير جيڪي هر دائري ۾ مختلف آهن: موجوده ماڊل جو نالو ۽ ماڊل جو نالو جنهن ۾ موجوده اعتراض تائين رسائي هئي. اهي استعمال ڪري سگھجن ٿا، مثال طور، چيڪ ڪرڻ لاءِ ته توهان جا خانگي ڪلاس سڌو سنئون ٻين ماڊلز مان استعمال نه ڪيا پيا وڃن.

اضافو 1: هي سڀ ڪيئن هلائڻ ۽ ڊيبگ ڪجي؟

مضمون ۾ پپٽ ڪوڊ جا ڪيترائي مثال شامل آھن، پر اسان کي اھو نه ٻڌايو آھي ته ھن ڪوڊ کي ڪيئن هلائڻو آھي. خير، مان پاڻ کي درست ڪري رهيو آهيان.

Puppet کي هلائڻ لاءِ هڪ ايجنٽ ڪافي آهي، پر اڪثر ڪيسن لاءِ توهان کي به سرور جي ضرورت پوندي.

ايجنٽ

گھٽ ۾ گھٽ ورزن XNUMX کان وٺي، ڪٺ پتلي ايجنٽ پيڪيجز کان سرڪاري Puppetlabs مخزن سڀني انحصار تي مشتمل آهي (روبي ۽ لاڳاپيل جوا)، تنهنڪري اتي ڪا به انسٽاليشن مشڪلات ناهي (مان ڊيبين تي ٻڌل تقسيم بابت ڳالهائي رهيو آهيان - اسان RPM تي ٻڌل تقسيم استعمال نٿا ڪريون).

آسان ترين صورت ۾، ڪٺ پتلي جي ترتيب کي استعمال ڪرڻ لاء، اهو ڪافي آهي ته ايجنٽ کي سرور بيس موڊ ۾ لانچ ڪرڻ لاء: مهيا ڪيو ويو آهي ته ڪٺ پتلي ڪوڊ نوڊ ڏانهن نقل ڪيو ويو آهي، لانچ 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

اهو بهتر آهي، يقينا، سرور کي ترتيب ڏيڻ ۽ ڊيمون موڊ ۾ نوڊس تي ايجنٽ هلائڻ - پوءِ هر اڌ ڪلاڪ ۾ هڪ ڀيرو اهي سرور تان ڊائون لوڊ ڪيل ترتيب لاڳو ڪندا.

توهان ڪم جي پش ماڊل کي نقل ڪري سگهو ٿا - نوڊ ڏانهن وڃو جنهن ۾ توهان دلچسپي رکو ٿا ۽ شروع ڪريو sudo puppet agent -t. چاٻي -t (--test) اصل ۾ ڪيترائي اختيار شامل آھن جيڪي انفرادي طور تي چالو ڪري سگھجن ٿيون. انهن اختيارن ۾ هيٺيان شامل آهن:

  • ڊيمون موڊ ۾ نه هلو (ڊفالٽ طور ايجنٽ ڊيمون موڊ ۾ شروع ٿئي ٿو)؛
  • ڪيٽلاگ لاڳو ڪرڻ کان پوءِ بند ڪريو (ڊفالٽ طور، ايجنٽ ڪم ڪرڻ جاري رکندو ۽ هر اڌ ڪلاڪ ۾ هڪ ڀيرو ترتيب لاڳو ڪندو)؛
  • تفصيلي ڪم لاگ لکڻ؛
  • فائلن ۾ تبديليون ڏيکاريو.

ايجنٽ وٽ آپريٽنگ موڊ آهي بغير تبديلين - توهان ان کي استعمال ڪري سگهو ٿا جڏهن توهان پڪ نه آهيو ته توهان صحيح ترتيب لکي آهي ۽ چيڪ ڪرڻ چاهيو ٿا ته ايجنٽ آپريشن دوران ڪهڙي تبديلي ڪندو. هي موڊ پيرا ميٽر جي ذريعي فعال ڪيو ويو آهي --noop حڪم لائن تي: sudo puppet agent -t --noop.

اضافي طور تي، توهان ڪم جي ڊيبگنگ لاگ ان کي فعال ڪري سگهو ٿا - ان ۾، پوپٽ انهن سڀني عملن جي باري ۾ لکي ٿو جيڪي اهو انجام ڏئي ٿو: هن وسيلن جي باري ۾ جيڪو هن وقت پروسيس ڪري رهيو آهي، هن وسيلن جي پيٽرولر بابت، ان بابت ڪهڙي پروگرام شروع ڪري ٿو. يقينا هي هڪ پيٽرولر آهي --debug.

سرور

مان هن آرٽيڪل ۾ pappetserver جي مڪمل سيٽ اپ ۽ ڪوڊ کي ترتيب ڏيڻ تي غور نه ڪندس؛ مان صرف اهو چوندس ته دٻي جي ٻاهران سرور جو هڪ مڪمل طور تي ڪم ڪندڙ نسخو آهي جنهن کي ڪم ڪرڻ لاء اضافي ترتيبن جي ضرورت ناهي. نوڊس (چئو، هڪ سو تائين). نوڊس جي وڏي تعداد کي ٽيوننگ جي ضرورت پوندي - ڊفالٽ طور، puppetserver چار ڪارڪنن کان وڌيڪ نه شروع ڪري ٿو، وڌيڪ ڪارڪردگي لاء توهان کي انهن جي تعداد کي وڌائڻ جي ضرورت آهي ۽ ياداشت جي حدن کي وڌائڻ نه وساريو، ٻي صورت ۾ سرور اڪثر وقت گندگي گڏ ڪندو.

ڪوڊ لڳائڻ - جيڪڏھن توھان کي ضرورت آھي جلدي ۽ آساني سان، پوءِ ڏسو (r10k تي)[https://github.com/puppetlabs/r10k]، ننڍي تنصيب لاء اهو ڪافي هجڻ گهرجي.

ضميمه 2: ڪوڊنگ ھدايتون

  1. سڀني منطقن کي ڪلاس ۽ وصفن ۾ رکو.
  2. طبقن ۽ وصفن کي ماڊلز ۾ رکو، نڪي منشور ۾ بيان ڪندڙ نوڊس.
  3. حقيقتون استعمال ڪريو.
  4. ميزبان نالن جي بنياد تي ifs نه ٺاهيو.
  5. طبقن ۽ وصفن لاءِ پيرا ميٽرز شامل ڪرڻ لاءِ آزاد محسوس ڪريو - هي طبقن/define جي جسم ۾ لڪايل ضمني منطق کان بهتر آهي.

مان وضاحت ڪندس ته آئون ايندڙ مضمون ۾ ائين ڪرڻ جي صلاح ڏيان ٿو.

ٿڪل

اچو ته تعارف سان ختم ڪريون. ايندڙ آرٽيڪل ۾ آئون توهان کي هيرا، ENC ۽ PuppetDB بابت ٻڌائيندس.

صرف رجسٽرڊ استعمال ڪندڙ سروي ۾ حصو وٺي سگهن ٿا. سائن ان ڪريو، توهان جي مهرباني.

حقيقت ۾، اتي تمام گهڻو مواد آهي - مان هيٺ ڏنل عنوانن تي آرٽيڪل لکي سگهان ٿو، ووٽ ڏيو جنهن بابت توهان پڙهڻ ۾ دلچسپي وٺندا آهيو:

  • 59,1٪ترقي يافته ڪٺ پتلي تعميرات - ڪجھ ايندڙ سطح جي شٽ: لوپس، ميپنگ ۽ ٻيا ليمبڊا ايڪسپريشنز، ريسورس ڪليڪٽر، ايڪسپورٽ ريسورسز ۽ انٽر-ميسٽ ڪميونيڪيشن ذريعي پپٽ، ٽيگ، فراهم ڪندڙ، خلاصي ڊيٽا جا قسم.13
  • 31,8٪”مان پنهنجي ماءُ جو ايڊمن آهيان“ يا ڪيئن اسان Avito ۾ مختلف ورزن جي ڪيترن ئي پاپيٽ سرورز سان دوستي ڪئي، ۽ اصولي طور تي، پاپيٽ سرور جي انتظام بابت حصو.7
  • 81,8٪اسان ڪٺ پتلي ڪوڊ ڪيئن لکون ٿا: اوزار، دستاويز، جاچ، CI/CD.18

22 صارفين ووٽ ڏنو. 9 استعمال ڪندڙن کي روڪيو ويو.

جو ذريعو: www.habr.com