<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF128%3ADrBrown3</id>
		<title>LXF128:DrBrown3 - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF128%3ADrBrown3"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF128:DrBrown3&amp;action=history"/>
		<updated>2026-05-13T03:53:18Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF128:DrBrown3&amp;diff=11577&amp;oldid=prev</id>
		<title>Crazy Rebel: /* Дергая за нити */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF128:DrBrown3&amp;diff=11577&amp;oldid=prev"/>
				<updated>2011-03-25T11:13:12Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Дергая за нити&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 11:13, 25 марта 2011&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 5:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 5:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;: Управляем гетерогенными сетями с сотнями машин.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;: Управляем гетерогенными сетями с сотнями машин.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|Содержание=[[Изображение:&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;LXF128_48_1&lt;/del&gt;.jpg|400px]] Ресурсы ''Puppet'' задают системную конфигурацию на платформо-независимом языке. Провайдеры для конкретных платформ исполняют команды.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|Содержание=[[Изображение:&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;128_48_1&lt;/ins&gt;.jpg|400px]] Ресурсы ''Puppet'' задают системную конфигурацию на платформо-независимом языке. Провайдеры для конкретных платформ исполняют команды.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Изображение:&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;LXF128_48_2&lt;/del&gt;.jpg|400px]] ''Puppet'' использует архитектуру «ведущий–ведомый». Ведомые (обслуживаемые узлы) подключаются к ведущему каждые полчаса для обновления настроек.|Ширина=400px}}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Изображение:&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;128_48_2&lt;/ins&gt;.jpg|400px]] ''Puppet'' использует архитектуру «ведущий–ведомый». Ведомые (обслуживаемые узлы) подключаются к ведущему каждые полчаса для обновления настроек.|Ширина=400px}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Администраторы, обслуживающие много компьютеров, всегда ищут способы сэкономить время и усилия. Им нисколько не требуется, чтобы их загрузка линейно росла с ростом числа обслуживаемых систем. Подозреваю, что за годы тысячи администраторов написали десятки тысяч маленьких скриптов с ''ssh, scp, rdist'' или ''rsync'' в цикле '''for''', для обновления и настройки своих подопечных компьютеров. Виртуализация отчасти все ухудшила, потому что теперь администраторы вынуждены прописывать изменения в количестве систем, до десяти раз превосходящем число компьютеров в стойке.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Администраторы, обслуживающие много компьютеров, всегда ищут способы сэкономить время и усилия. Им нисколько не требуется, чтобы их загрузка линейно росла с ростом числа обслуживаемых систем. Подозреваю, что за годы тысячи администраторов написали десятки тысяч маленьких скриптов с ''ssh, scp, rdist'' или ''rsync'' в цикле '''for''', для обновления и настройки своих подопечных компьютеров. Виртуализация отчасти все ухудшила, потому что теперь администраторы вынуждены прописывать изменения в количестве систем, до десяти раз превосходящем число компьютеров в стойке.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF128:DrBrown3&amp;diff=11574&amp;oldid=prev</id>
		<title>Crazy Rebel: викификация, оформление, иллюстрация</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF128:DrBrown3&amp;diff=11574&amp;oldid=prev"/>
				<updated>2011-03-25T10:21:15Z</updated>
		
		<summary type="html">&lt;p&gt;викификация, оформление, иллюстрация&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: Рецепты доктора Брауна&lt;br /&gt;
&lt;br /&gt;
==Дергая за нити==&lt;br /&gt;
&lt;br /&gt;
: Управляем гетерогенными сетями с сотнями машин.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF128_48_1.jpg|400px]] Ресурсы ''Puppet'' задают системную конфигурацию на платформо-независимом языке. Провайдеры для конкретных платформ исполняют команды.&lt;br /&gt;
[[Изображение:LXF128_48_2.jpg|400px]] ''Puppet'' использует архитектуру «ведущий–ведомый». Ведомые (обслуживаемые узлы) подключаются к ведущему каждые полчаса для обновления настроек.|Ширина=400px}}&lt;br /&gt;
&lt;br /&gt;
Администраторы, обслуживающие много компьютеров, всегда ищут способы сэкономить время и усилия. Им нисколько не требуется, чтобы их загрузка линейно росла с ростом числа обслуживаемых систем. Подозреваю, что за годы тысячи администраторов написали десятки тысяч маленьких скриптов с ''ssh, scp, rdist'' или ''rsync'' в цикле '''for''', для обновления и настройки своих подопечных компьютеров. Виртуализация отчасти все ухудшила, потому что теперь администраторы вынуждены прописывать изменения в количестве систем, до десяти раз превосходящем число компьютеров в стойке.&lt;br /&gt;
&lt;br /&gt;
Самодельные скрипты работают прекрасно, но обычно решают сугубо конкретные задачи и не дают способа поделиться лучшими методиками с другими администраторами или экспортировать их на сайты. Эти проблемы и привели к появлению утилит управления конфигурацией, включая ''Puppet'' и ''Cfengine''.&lt;br /&gt;
&lt;br /&gt;
В ''Puppet'' [англ. «марионетка»], идее Люка Каньеса [Luke Kanies] из Reductive Labs, для описания конфигурации обслуживаемых компьютеров используется декларативный язык (см. «Декларативный vs императивный»). Основная идея архитектуры частично состоит в абстрактном представлении таких вещей, как сервис или учетная запись пользователя, без учета их конкретной реализации на целевом компьютере.&lt;br /&gt;
&lt;br /&gt;
Настройки задаются в файле (или наборе файлов), называемом манифестом. Нырнем поглубже, на следующем примере:&lt;br /&gt;
&lt;br /&gt;
 user { chris:&lt;br /&gt;
 name =&amp;gt; “chris”,&lt;br /&gt;
 uid =&amp;gt; 503,&lt;br /&gt;
 home =&amp;gt; “/home/chris”,&lt;br /&gt;
 password =&amp;gt; ‘$1$GyE7uVtw$KCsWd.U2mcy05ZdGFiump/’,&lt;br /&gt;
 ensure =&amp;gt; present,&lt;br /&gt;
&lt;br /&gt;
Это пример использования ресурса для управления (в данном случае) учетными записями пользователей. Атрибуты данного ресурса (имя, идентификатор и т. д.) соответствуют полям '''/etc/passwd'''. Однако в определении ресурса нет никакой информации по поводу того, как реализуется эта конфигурация (например, создаются ли учетные записи командой ''useradd'' или же ''adduser''): определение ресурса скрывает этот уровень детализации, упрощая создание конфигурации, применимой в гетерогенной смеси Unix-систем – Mac OS X, BSD, Solaris и всевозможных версий Linux.&lt;br /&gt;
&lt;br /&gt;
У каждого обслуживаемого узла есть «клиентские провайдеры», знающие, как применить изменения в конфигурации на конкретной платформе. То же самое справедливо и для ресурсов других типов. Например, тип ресурса «пакет», используемый для установки (и удаления) пакетов, скрывает возможные реализации ''RPM, Yum, dpkg, apt-get, Fink, Portage, Rug'' … список можно продолжить. Чего он, к сожалению, не скрывает, так это различия между системами, в которых пакеты устанавливаются на самом деле. Поэтому мы можем увидеть такие конструкции:&lt;br /&gt;
&lt;br /&gt;
 $ssh = $operatingsystem ? { &lt;br /&gt;
 	 solaris =&amp;gt; SMCossh,&lt;br /&gt;
 	 default =&amp;gt; openssh&lt;br /&gt;
 }&lt;br /&gt;
 package { $ssh:&lt;br /&gt;
 	 ensure =&amp;gt; installed,&lt;br /&gt;
 	 alias =&amp;gt; openssh,&lt;br /&gt;
 	 require =&amp;gt; Package[openssl],&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Обратите внимание на оператор выбора в первой строке, определяющий имя пакета по операционной системе обслуживаемого узла.&lt;br /&gt;
&lt;br /&gt;
===Просто дайте мне факты===&lt;br /&gt;
&lt;br /&gt;
На каждом обслуживаемом узле ''Puppet'' использует программу поддержки под названием ''Facter''; ее задача – собирать в виде параметров данные об узле, включающие (среди прочего) название его операционной системы. Эти параметры доступны в виде переменных в манифесте ''Puppet'' и могут использоваться для подстройки конфигурации под платформу. Переменная '''operatingsystem''' в предыдущем примере показывает параметр ''Facter'', используемый для этой цели.&lt;br /&gt;
&lt;br /&gt;
Главный узел ''Puppet'' может выступать в роли файлового сервера. Это применяется, например, для передачи файлов с настройками конкретного сервиса на обслуживаемые узлы. Например, мы могли бы сохранить файл настройки ''ntpd'' в главном узле ''Puppet'' и сослаться на него в манифесте таким образом:&lt;br /&gt;
&lt;br /&gt;
 file { “/etc/ntp.conf ”:&lt;br /&gt;
 	 source =&amp;gt; “puppet://puppetmaster/configs/ntp.conf ”,&lt;br /&gt;
 	 owner =&amp;gt; ntp,&lt;br /&gt;
 	 mode =&amp;gt; 644,&lt;br /&gt;
 	 backup =&amp;gt; main,&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Атрибут '''source''' в этом примере показывает, где обслуживаемый узел должен получить файл конфигурации. Атрибут '''backup''' говорит, что оригинал '''ntp.conf''' нужно скопировать в файловую корзину '''main'''. Файловая корзина – репозиторий для резервных копий файлов; он может быть локальным (на обслуживаемом узле) или удаленным (на главном узле ''Puppet''). Например, следующее определение ресурса задает удаленную файловую корзину:&lt;br /&gt;
&lt;br /&gt;
 filebucket { main: server =&amp;gt; “puppetmaster.example.com” }&lt;br /&gt;
&lt;br /&gt;
Путь к файлам, хранящимся в корзине, зависит от их MD5‑суммы. С точки зрения человека, это довольно странно и явно предназначено для того, чтобы предоставить средства для некоей поддержки транзакций и откатов внутри ''Puppet'', которая, видимо, в разработке или по крайней мере в планах. На данный момент, восстанавливать файлы из файловой корзины нужно вручную.&lt;br /&gt;
&lt;br /&gt;
Рассмотренные определения ресурсов соединяются с помощью классов и определений. И то, и другое – конструкции языка ''Puppet'', задающие набор ресурсов; разница между ними в том, что классы можно создавать только один раз (на каждом обслуживаемом узле), а определения – многократно. Класс, например, можно было бы использовать для управления установленным пакетом или системным сервисом, а определение – для управления виртуальными хостами ''Apache'' или сетевыми интерфейсами, т. е. тем, что находится на компьютере в количестве больше одного. Существуют и другие типы ресурсов. Некоторые из них показаны в таблице.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=wikitable border=1 cellpadding=5|-&lt;br /&gt;
! Тип&lt;br /&gt;
! Описание&lt;br /&gt;
! Тип&lt;br /&gt;
! Описание&lt;br /&gt;
|-&lt;br /&gt;
| cron&lt;br /&gt;
| Управляет заданиями ''cron''&lt;br /&gt;
| notify&lt;br /&gt;
| Отправляет сообщение в файл журнала&lt;br /&gt;
|-&lt;br /&gt;
| exec&lt;br /&gt;
| Выполняет внешние команды&lt;br /&gt;
| package&lt;br /&gt;
| Управляет пакетами&lt;br /&gt;
|-&lt;br /&gt;
| file&lt;br /&gt;
| Управляет файлами&lt;br /&gt;
| schedule&lt;br /&gt;
| Определяет расписание ''puppet''&lt;br /&gt;
|-&lt;br /&gt;
| filebucket&lt;br /&gt;
| Репозиторий для резервных копий файлов&lt;br /&gt;
| service&lt;br /&gt;
| Управляет сервисами&lt;br /&gt;
|-&lt;br /&gt;
| group&lt;br /&gt;
| Управляет группами&lt;br /&gt;
| tidy&lt;br /&gt;
| Удаляет ненужные файлы&lt;br /&gt;
|-&lt;br /&gt;
| host&lt;br /&gt;
| Управляет узлами&lt;br /&gt;
| user&lt;br /&gt;
| Управляет пользователями&lt;br /&gt;
|-&lt;br /&gt;
| mount&lt;br /&gt;
| Управляет смонтированными файловыми системами&lt;br /&gt;
| yumrepo&lt;br /&gt;
| Управляет репозиториями ''Yum''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Определения узла внутри манифеста используются для связи заданных узлов с подходящими конфигурациями. Задать определение узла можно таким образом:&lt;br /&gt;
 node /^www[0-9]+/ {&lt;br /&gt;
   include apache&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Здесь для имени узла используется регулярное выражение. К узлам с удовлетворяющими ему именами будет применен класс '''apache'''. В нем можно определить главным образом ресурсы (пакеты, сервисы, файлы настройки и т. д.), требуемые для запуска сервиса ''Apache''. Для более тонкого контроля над тем, какая конфигурация применяется к каждому узлу, ресурсам можно назначить тэги (обычные текстовые строки), и разрешить узлу применять только те определения ресурсов, которые содержат заданный тэг. Например, для описания изменений конфигурации для набора тестируемых серверов определения ресурсов можно снабдить тэгом «'''experimental'''». Описанная в манифесте конфигурация передается на обслуживаемые узлы по архитектуре «ведущий–ведомый», показанной выше.&lt;br /&gt;
&lt;br /&gt;
Один из компьютеров назван ведущим узлом ''Puppet'', и на нем установлена программа ''puppetmaster''. На каждом из обслуживаемых узлов, на рисунке – клиентов, установлен агент ''Puppet'' (управляемый им демон).&lt;br /&gt;
&lt;br /&gt;
Манифест создается и хранится на ведущем узле ''Puppet''. Каждые 30 минут ведомые узлы подключаются к ведущему, и он передает им конфигурацию. Для своей идентификации ведомые узлы передают ведущему сертификаты X.509. При первом подключении они создают запрос на подпись сертификата, и администратор может воспользоваться сертификационными полномочиями главного узла для самоподписи сертификатов и их возвращения клиентам. После этого для аутентификации узла и создания защищенного соединения используется ''SSH''. Также можно запустить демоны ''Puppet'' на обслуживаемых узлах в режиме прослушивания, и ведущий узел подключится к ним и передаст конфигурацию. Это удобно для тестирования, и по-моему, было бы также удобно, если бы ведущий узел ''Puppet'' находился во внутренней сети, а обслуживаемые узлы – во внешней, со шлюзом NAT посередке, чтобы ведомые узлы не могли соединиться с ведущим.&lt;br /&gt;
&lt;br /&gt;
На данный момент в ''Puppet'' не поддерживается управление версиями: например, нельзя откатиться к предыдущей конфигурации. Конечно, можно развернуть свое средство управления версиями, поместив манифесты на сервере, например, в ''Subversion''.&lt;br /&gt;
&lt;br /&gt;
===Устанавливаем ''Puppet''===&lt;br /&gt;
&lt;br /&gt;
''Puppet'' написан на ''Ruby'' и распространяется по лицензии GPL2. Он доступен в репозиториях многих популярных дистрибутивов, включая Ubuntu и Fedora.&lt;br /&gt;
&lt;br /&gt;
В Ubuntu для установки достаточно выполнить команду &lt;br /&gt;
&lt;br /&gt;
 $ sudo apt-get install ruby facter puppet&lt;br /&gt;
&lt;br /&gt;
Если в вашем дистрибутиве нет пакетов ''Puppet'' или вам нужна самая свежая версия, загрузите архивы с ''Puppet'' и ''Facter'' с сайта Reductive Labs. Там содержится установочный скрипт на ''Ruby'', и диалог установки будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
 # cd /root/downloads&lt;br /&gt;
 # wget http://reductivelabs.com/downloads/puppet/puppet-0.25.1.tar.gz&lt;br /&gt;
 # tar xzvf puppet-0.25.1.tar.gz&lt;br /&gt;
 # cd puppet-0 .25.1&lt;br /&gt;
 # ruby install.rb&lt;br /&gt;
&lt;br /&gt;
Естественно, сначала нужно установить ''Ruby''!&lt;br /&gt;
&lt;br /&gt;
===Декларативный vs императивный===&lt;br /&gt;
&lt;br /&gt;
Декларативный язык определяет, какие операции нужно выполнить, а не то, как их выполнять. Императивный язык задает наборы действий – сделать то, потом се, потом это.&lt;br /&gt;
&lt;br /&gt;
Например, если сказать «Возьми четыре ножа и вилки из ящика и положиих на стол», это будет императивный язык. А если сказать «Стол нужно накрыть на четверых», это декларативный язык.&lt;br /&gt;
&lt;br /&gt;
Большинство обычных языков программи рования (включая ''PHP, C++'' и ''Java'') императивные. HTML декларативен: он задает внешний вид и расположение элементов web-страницы, а не последовательность команд, выполняемых браузером. Можно провести аналогию с файлом настройки вроде '''syslog.conf''', где определяется, что делать с сообщения ми (декларативный), и кодом демона ''syslog'' (императивный).&lt;br /&gt;
&lt;br /&gt;
Разница, должно быть, сугубо академична, но, просматривая манифесты ''Puppet'', я был вынужден постоянно твердить себе: «Это описание, как нужно настроить компьютер, а не скрипт для его настройки».&lt;/div&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	</feed>