Проект

Общее

Профиль

Управление SCI сервисами » История » Версия 14

Владимир Ипатов, 27.06.2014 17:16

1 1 Владимир Ипатов
{{toc}}
2 2 Владимир Ипатов
3 1 Владимир Ипатов
h1. Управление SCI сервисами
4 1 Владимир Ипатов
5 1 Владимир Ипатов
h2. PUPPET
6 1 Владимир Ипатов
7 4 Dmitry Chernyak
"Puppet":http://www.puppetlabs.com - это платформа для автоматизации системного администрирования большого количества компьютеров.
8 9 Dmitry Chernyak
Puppet позволяет легко автоматизировать задачи по настройке операционных систем и используется для настройки узлов и виртуальных машин в кластере.
9 3 Владимир Ипатов
Документация можно найти здесь: http://docs.puppetlabs.com/
10 1 Владимир Ипатов
11 4 Dmitry Chernyak
Управляющий сервер - "Puppet master" установлен на сервисной виртуальной машине 'sci'.
12 3 Владимир Ипатов
13 4 Dmitry Chernyak
В комплекте поставки есть следующие модули:
14 4 Dmitry Chernyak
* Общая настройка сервера (common) - установка полезных пакетов и удобных умолчаний
15 4 Dmitry Chernyak
* locale (locale)
16 4 Dmitry Chernyak
* timezone (timezone)
17 4 Dmitry Chernyak
* Approx (approx) - прокси для пакетов обновления Debian
18 4 Dmitry Chernyak
* DNS (bind9) - запуск в chroot и пред-настройка для обслуживания кластера
19 4 Dmitry Chernyak
* DHCP (dhcpd) - пред-настройка для кластера и DDNS
20 6 Владимир Ипатов
* Почта (exim4) - настройка доставки локальной почты
21 1 Владимир Ипатов
22 9 Dmitry Chernyak
h3. Конфигурация хостов
23 9 Dmitry Chernyak
24 4 Dmitry Chernyak
Конфигурация для хостов задается в файле /etc/puppet/manifests/nodes.pp:
25 1 Владимир Ипатов
<pre>
26 1 Владимир Ипатов
node 'default' {
27 1 Владимир Ипатов
	class { sources_list_local: stage => pre0, }
28 1 Владимир Ипатов
	class { common_profile: stage => pre1, }
29 1 Владимир Ипатов
	class { timezone: zone => "Europe/Moscow", stage => main, }
30 1 Владимир Ипатов
	class { locale: def_locale => "ru_RU.UTF-8", stage => main, }
31 1 Владимир Ипатов
}
32 1 Владимир Ипатов
33 1 Владимир Ипатов
node 'sci' {
34 1 Владимир Ипатов
	class { approx_local: stage => pre0, }
35 1 Владимир Ипатов
	class { sources_list_local: stage => pre0, }
36 1 Владимир Ипатов
	class { common_profile: stage => pre1, }
37 1 Владимир Ипатов
	class { bind9_sci: stage => main, }
38 1 Владимир Ипатов
	class { timezone: zone => "Europe/Moscow", stage => main, }
39 1 Владимир Ипатов
	class { locale: def_locale => "ru_RU.UTF-8", stage => main, }
40 1 Владимир Ипатов
	class { dhcpd: enabled => no, stage => post1, }
41 1 Владимир Ипатов
}
42 3 Владимир Ипатов
</pre>
43 1 Владимир Ипатов
Если Вы не указали хост в файле, то к нему применяются настройки default.
44 9 Dmitry Chernyak
45 9 Dmitry Chernyak
h3. Обновление рецептов
46 9 Dmitry Chernyak
47 9 Dmitry Chernyak
Настройка большинства сервисов SkyCover Infrastructure производится при помощи рецептов puppet.
48 9 Dmitry Chernyak
В вашей системе эти рецепты находятся в каталоге /etc/puppet/modules
49 9 Dmitry Chernyak
50 9 Dmitry Chernyak
Вы можете получать обновления каталога рецептов из официального репозтория https://github.com/skycover/sci-puppet при помощи следующей процедуры:
51 9 Dmitry Chernyak
52 9 Dmitry Chernyak
*Запишите изменения в своем каталоге рецептов (если вы их вносили)*
53 9 Dmitry Chernyak
54 9 Dmitry Chernyak
<pre>
55 9 Dmitry Chernyak
cd /etc/puppet
56 9 Dmitry Chernyak
git status # показать список изменений, которые вы сделали
57 9 Dmitry Chernyak
git diff --color # показать различия в виде diff
58 9 Dmitry Chernyak
git commit -am"Latest changes" # записать изменения
59 9 Dmitry Chernyak
git push
60 9 Dmitry Chernyak
</pre>
61 9 Dmitry Chernyak
62 9 Dmitry Chernyak
*Проверьте наличие обновлений*
63 9 Dmitry Chernyak
64 9 Dmitry Chernyak
<pre>
65 9 Dmitry Chernyak
cd /root/puppet
66 9 Dmitry Chernyak
git checkout master
67 9 Dmitry Chernyak
git pull
68 9 Dmitry Chernyak
</pre>
69 9 Dmitry Chernyak
70 9 Dmitry Chernyak
Если последняя команда вывела список изменившихся файлов, то можно проанализировать изменения:
71 9 Dmitry Chernyak
72 9 Dmitry Chernyak
<pre>
73 9 Dmitry Chernyak
git log
74 9 Dmitry Chernyak
</pre>
75 9 Dmitry Chernyak
76 9 Dmitry Chernyak
Затем посмотреть различия с вашей локальной версией
77 9 Dmitry Chernyak
78 9 Dmitry Chernyak
<pre>
79 9 Dmitry Chernyak
git checkout local
80 9 Dmitry Chernyak
git diff master
81 9 Dmitry Chernyak
</pre>
82 9 Dmitry Chernyak
83 9 Dmitry Chernyak
*Добавьте изменения в локальную версию*
84 9 Dmitry Chernyak
85 9 Dmitry Chernyak
<pre>
86 9 Dmitry Chernyak
git merge master
87 9 Dmitry Chernyak
</pre>
88 9 Dmitry Chernyak
89 9 Dmitry Chernyak
или
90 9 Dmitry Chernyak
91 9 Dmitry Chernyak
<pre>
92 9 Dmitry Chernyak
git cherry-pick HASHSUM
93 9 Dmitry Chernyak
</pre>
94 9 Dmitry Chernyak
95 9 Dmitry Chernyak
Все эти манипуляции не затрагивают ваш действующий каталог рецептов и могут быть отменены
96 9 Dmitry Chernyak
97 9 Dmitry Chernyak
*Перенесите обновление в действующий каталог рецептов*
98 9 Dmitry Chernyak
99 9 Dmitry Chernyak
<pre>
100 9 Dmitry Chernyak
cd /etc/puppet
101 9 Dmitry Chernyak
git pull
102 9 Dmitry Chernyak
</pre>
103 9 Dmitry Chernyak
104 9 Dmitry Chernyak
Для более подробной информации рекомендуем познакомиться с git. Начните от сюда: [[МАГИЯ GIT]]
105 1 Владимир Ипатов
106 1 Владимир Ипатов
h2. Apt
107 1 Владимир Ипатов
108 4 Dmitry Chernyak
Apt автоматически настраивается во всем кластере средствами puppet
109 1 Владимир Ипатов
110 1 Владимир Ипатов
h3. sources.list
111 1 Владимир Ипатов
112 4 Dmitry Chernyak
Шаблон для sources.list находится в @/etc/puppet/modules/approx/templates/sources.list.erb@ и настроен для работы через approx.
113 1 Владимир Ипатов
114 1 Владимир Ипатов
h3. Approx
115 1 Владимир Ипатов
116 3 Владимир Ипатов
Шаблон конфига Approx находится @/etc/puppet/modules/approx/templates/approx.conf.erb@
117 4 Dmitry Chernyak
Для быстрого применения изменений выполните:
118 1 Владимир Ипатов
<pre>
119 1 Владимир Ипатов
/etc/init.d/puppet restart
120 1 Владимир Ипатов
</pre>
121 1 Владимир Ипатов
122 1 Владимир Ипатов
h2. DNS
123 1 Владимир Ипатов
124 4 Dmitry Chernyak
DNS автоматически устанавливается на машине 'sci'.
125 1 Владимир Ипатов
126 10 Владимир Ипатов
Прямая зона лежит в файле @/etc/bind/master/$domain@
127 11 Владимир Ипатов
Обратная зона (192.168.0.0/16) лежит в файле @/etc/bind/master/in-addr@
128 12 Владимир Ипатов
Если требуется держать обратную зону для другого диапазона ip, то следует сначала поправить @/etc/bind9/named.conf.local@,
129 12 Владимир Ипатов
а уже затем поправить содержимое зоны. Пример конфига в named.conf.local для зоны 10.0.0.0/8:
130 11 Владимир Ипатов
<pre>
131 11 Владимир Ипатов
zone 10.in-addr.arpa in {
132 11 Владимир Ипатов
 type master;
133 11 Владимир Ипатов
 file "/etc/bind/master/in-addr";
134 11 Владимир Ипатов
 allow-query    { any; };
135 11 Владимир Ипатов
 allow-update{ key DHCP_UPDATE; };
136 11 Владимир Ипатов
};
137 11 Владимир Ипатов
</pre>
138 3 Владимир Ипатов
При каждом ручном изменении зоны Вы должны увеличивать счетчик в начале файла:
139 1 Владимир Ипатов
<pre>
140 1 Владимир Ипатов
0000000001 ; Serial
141 1 Владимир Ипатов
</pre>
142 3 Владимир Ипатов
Рекомендуется формат YYYYMMDDNN (NN порядковый номер изменения за этот день).
143 3 Владимир Ипатов
Вы можете изменять этот файл как угодно для того, чтобы он подходил к Вашей системе.
144 1 Владимир Ипатов
145 3 Владимир Ипатов
Новые записи должны идти после:
146 1 Владимир Ипатов
<pre>
147 1 Владимир Ипатов
; here you can put any other records
148 1 Владимир Ипатов
</pre>
149 1 Владимир Ипатов
150 3 Владимир Ипатов
Чтобы применить изменения, следует:
151 1 Владимир Ипатов
<pre>
152 1 Владимир Ипатов
/etc/init.d/bind9 reload
153 1 Владимир Ипатов
</pre>
154 1 Владимир Ипатов
155 3 Владимир Ипатов
*ПРИМЕЧАНИЕ*: Если Вы используете динамические апдейты зоны(например, от dhcp сервера),
156 3 Владимир Ипатов
до ручного изменения файла следует "заморозить" зону:
157 1 Владимир Ипатов
<pre>rndc freeze your.domain</pre>
158 3 Владимир Ипатов
для прямой зоны
159 1 Владимир Ипатов
<pre>rndc freeze 168.192.in-addr.arpa</pre>
160 3 Владимир Ипатов
для обратной зоны
161 3 Владимир Ипатов
а после изменения файла следует "разморозить" зону:
162 1 Владимир Ипатов
<pre>rndc unfreeze your.domain</pre>
163 3 Владимир Ипатов
или
164 1 Владимир Ипатов
<pre>rndc unfreeze 168.192.in-addr.arpa</pre>
165 1 Владимир Ипатов
166 1 Владимир Ипатов
h2. DHCP
167 1 Владимир Ипатов
168 3 Владимир Ипатов
isc-dhcp-server настроен на машине sci, но отключен по умолчанию.
169 3 Владимир Ипатов
Если Вы хотите его включить, Вам следует сменить строчку в nodes.pp:
170 1 Владимир Ипатов
<pre>
171 3 Владимир Ипатов
	class { dhcpd: enabled => no, stage => post1, }
172 3 Владимир Ипатов
</pre>
173 3 Владимир Ипатов
на:
174 3 Владимир Ипатов
<pre>
175 3 Владимир Ипатов
	class { dhcpd: enabled => yes, stage => post1, }
176 3 Владимир Ипатов
</pre>
177 3 Владимир Ипатов
Если у Вас есть отдельный lan сегмент, то dhcp настраивается на него, если нет - на основной сегмент.
178 3 Владимир Ипатов
Дефолтный конфиг выглядит наподобие этого:
179 3 Владимир Ипатов
<pre>
180 1 Владимир Ипатов
ddns-update-style interim;
181 1 Владимир Ипатов
ddns-updates on;
182 1 Владимир Ипатов
allow-unknown-clients;
183 1 Владимир Ипатов
autoritative;
184 1 Владимир Ипатов
ddns-domainname "your.domain";
185 1 Владимир Ипатов
update-static-leases on;
186 1 Владимир Ипатов
allow client-updates;
187 1 Владимир Ипатов
188 1 Владимир Ипатов
key DHCP_UPDATE {
189 1 Владимир Ипатов
	algorithm HMAC-MD5;
190 1 Владимир Ипатов
	secret secret-generated-md5;
191 1 Владимир Ипатов
};
192 1 Владимир Ипатов
193 1 Владимир Ипатов
194 1 Владимир Ипатов
195 1 Владимир Ипатов
subnet 192.168.5.0 netmask 255.255.255.0 {
196 1 Владимир Ипатов
	authoritative;
197 1 Владимир Ипатов
	ddns-updates on;
198 1 Владимир Ипатов
	range 192.168.5.11 192.168.5.254;
199 1 Владимир Ипатов
	option routers 192.168.5.35;
200 1 Владимир Ипатов
	option domain-name-servers 192.168.5.35;
201 1 Владимир Ипатов
	option domain-name "your.domain";
202 1 Владимир Ипатов
	default-lease-time 604800;
203 1 Владимир Ипатов
	max-lease-time 2592000;
204 1 Владимир Ипатов
	}
205 1 Владимир Ипатов
206 1 Владимир Ипатов
207 1 Владимир Ипатов
zone your.domain. {
208 1 Владимир Ипатов
	primary 127.0.0.1;
209 1 Владимир Ипатов
	key DHCP_UPDATE;
210 1 Владимир Ипатов
}
211 1 Владимир Ипатов
212 1 Владимир Ипатов
zone 168.192.in-addr.arpa. {
213 1 Владимир Ипатов
	primary 127.0.0.1;
214 1 Владимир Ипатов
	key DHCP_UPDATE;
215 1 Владимир Ипатов
}
216 1 Владимир Ипатов
</pre>
217 1 Владимир Ипатов
218 3 Владимир Ипатов
h2. Локаль
219 1 Владимир Ипатов
220 8 Владимир Ипатов
Локаль в кластере настраивается с помощью puppet. По умолчанию она - ru_RU.UTF-8.
221 8 Владимир Ипатов
При создании машины sci локаль берется из sci.conf(переменная LOCALE) и вносится в nodes.pp.
222 1 Владимир Ипатов
Если Вам уже после создания понадобилась другая локаль, назначьте ее в @/etc/puppet/manifests/nodes.pp@
223 1 Владимир Ипатов
<pre>class { locale: def_locale => "ru_RU.cp1251", stage => main, }</pre>
224 8 Владимир Ипатов
225 8 Владимир Ипатов
h2. Часовой пояс
226 8 Владимир Ипатов
227 8 Владимир Ипатов
Настраивается через puppet модулем timezone. По умолчанию - Europe/Moscow.
228 8 Владимир Ипатов
При создании машины sci часовой пояс берется из sci.conf(переменная TIMEZONE) и вносится в nodes.pp.
229 8 Владимир Ипатов
Если Вам уже после создания понадобилась другая локаль, назначьте ее в @/etc/puppet/manifests/nodes.pp@
230 8 Владимир Ипатов
<pre>class { timezone: zone => "Europe/Berlin", stage => main, }</pre>
231 5 Владимир Ипатов
232 5 Владимир Ипатов
h2. Системная почта
233 5 Владимир Ипатов
234 5 Владимир Ипатов
Реализовано два подхода к доставке системной почты:
235 5 Владимир Ипатов
1) Вся почта поступает на одну машину (sci по умолчанию) в локальный почтовый ящик указанного пользователя
236 5 Владимир Ипатов
2) Все почта поступает на сторонний почтовый ящик. Это более удобный подход, но для него требуется смартхост, который может доставлять почту через интернет, поэтому по умолчанию используется первый подход.
237 5 Владимир Ипатов
238 5 Владимир Ипатов
Этот модуль конфигурируется аргументами из nodes.pp. Для первой схемы он выглядит так:
239 5 Владимир Ипатов
<pre>
240 5 Владимир Ипатов
node 'default' {
241 5 Владимир Ипатов
...........
242 5 Владимир Ипатов
	class { exim4: smarthost => "default", forward_to => 'admin', stage => main, }
243 5 Владимир Ипатов
}
244 5 Владимир Ипатов
245 5 Владимир Ипатов
node 'sci' {
246 5 Владимир Ипатов
...........
247 5 Владимир Ипатов
	class { exim4: mailhub => yes, forward_to => 'admin', stage => main, }
248 5 Владимир Ипатов
}
249 5 Владимир Ипатов
</pre>
250 5 Владимир Ипатов
Вся почта приходит пользователю admin (по умолчанию root) на машину sci.
251 5 Владимир Ипатов
252 5 Владимир Ипатов
А вот пример для внешнего ящика:
253 5 Владимир Ипатов
<pre>
254 5 Владимир Ипатов
node 'default' {
255 5 Владимир Ипатов
...........
256 5 Владимир Ипатов
	class { exim4: smarthost => "my-smarthost.localdomain", forward_to => 'notify@other.domain', stage => main, }
257 5 Владимир Ипатов
}
258 5 Владимир Ипатов
259 5 Владимир Ипатов
node 'sci' {
260 5 Владимир Ипатов
...........
261 5 Владимир Ипатов
	class { exim4: smarthost => "my-smarthost.localdomain", forward_to => 'notify@other.domain', stage => main, }
262 5 Владимир Ипатов
}
263 5 Владимир Ипатов
</pre>
264 13 Владимир Ипатов
265 14 Владимир Ипатов
h2. Web сервер
266 13 Владимир Ипатов
267 13 Владимир Ипатов
для применения модуля в nodes.pp нужно добавить:
268 13 Владимир Ипатов
<pre>
269 13 Владимир Ипатов
node 'web' inretits default {
270 13 Владимир Ипатов
   class { web: stage => main, }
271 13 Владимир Ипатов
}
272 13 Владимир Ипатов
</pre>
273 13 Владимир Ипатов
Где web - хостнейм веб сервера.
274 13 Владимир Ипатов
275 13 Владимир Ипатов
Затем дать команду service puppetmaster reload
276 13 Владимир Ипатов
277 13 Владимир Ипатов
278 13 Владимир Ипатов
Данный модуль поставит nginx, php-fpm, mysql, а также скрипт для быстрого добавления сайтов add-site.
279 13 Владимир Ипатов
<pre>
280 13 Владимир Ипатов
# add-site
281 13 Владимир Ипатов
usage: /usr/local/sbin/add-site user [sitename]
282 13 Владимир Ипатов
/usr/local/sbin/add-site user creates user and home dirs if not exist
283 13 Владимир Ипатов
284 13 Владимир Ипатов
/usr/local/sbin/add-site user sitename creates user if not exist and create
285 13 Владимир Ипатов
/home/$user/www/$sitename directory
286 13 Владимир Ипатов
creates /etc/nginx/sites-available/$sitename and
287 13 Владимир Ипатов
/etc/php5/pfm/pool.d/$sitename.conf from templates
288 13 Владимир Ипатов
creates mysqlbase $sitename and mysql user $sitename
289 13 Владимир Ипатов
grant all privileges to new user on new base
290 13 Владимир Ипатов
generate password for new user and echo it on console
291 13 Владимир Ипатов
</pre>
292 13 Владимир Ипатов
Для начала нужно создать окружение пользователя:
293 13 Владимир Ипатов
<pre>
294 13 Владимир Ипатов
add-site user01 
295 13 Владимир Ипатов
</pre>
296 13 Владимир Ипатов
создает системного пользователя, генерирует ему пароль, чтобы под ним можно было заходить по ssh.
297 13 Владимир Ипатов
Также он создает ~/www - там будут лежать директориями с сайтами пользователя и ~/logs - там будут лежать логи этих сайтов.
298 13 Владимир Ипатов
Затем нужно создать сайт:
299 13 Владимир Ипатов
<pre>
300 13 Владимир Ипатов
add-site user01 example.com
301 13 Владимир Ипатов
</pre>
302 13 Владимир Ипатов
303 13 Владимир Ипатов
Эта команда создаст директорию /home/user01/www/example.com, конфиг vhost для nginx, конфиг vhost для php-fpm
304 13 Владимир Ипатов
Шаблоны для конфигов лежат в /etc/add-site, их можно менять.
305 13 Владимир Ипатов
Затем скрипт создаст mysql базу example.com и пользователя mysql example.com.
306 13 Владимир Ипатов
Пользователю назначит права на базу, сгенерирует пароль и выведет его на экран.
307 13 Владимир Ипатов
Все, что останется сделать руками - залить от имени пользователя по ssh файлы сайта в ~/www/example.com
308 13 Владимир Ипатов
Задать параметры подключения к mysql в конфиге сайта, выполнить активацию нового вхоста:
309 13 Владимир Ипатов
<pre>
310 13 Владимир Ипатов
nginx_ensite example.com
311 13 Владимир Ипатов
service php5-fpm reload
312 13 Владимир Ипатов
</pre>
313 13 Владимир Ипатов
Ну и настроить днс для домена example.com