Thursday, December 12, 2019

Ansible-playbook установка веб сервера

Всем привет.
На заметку простейший плайбук, как установить веб-сервер из RPM-файла, добавить его в автозагрузку и запустить.
---
- hosts: cmsansible
  gather_facts: no
  become: yes
  tasks:
    - name: copy httpd file
      copy:
        src: /tmp/httpd-2.4.6-90.el7.centos.x86_64.rpm
        dest: /tmp/httpd-2.4.6-90.el7.centos.x86_64.rpm
    - name: copy tools
      copy:
        src: /tmp/httpd-tools-2.4.6-90.el7.centos.x86_64.rpm
        dest: /tmp/httpd-tools-2.4.6-90.el7.centos.x86_64.rpm   
    - name: install tools
      yum:
        name: /tmp/httpd-tools-2.4.6-90.el7.centos.x86_64.rpm
        state: present
    - name: install httpd
      yum:
        name: /tmp/httpd-2.4.6-90.el7.centos.x86_64.rpm
        state: present
    - name: enable httpd
      service:
        name: httpd
        enabled: yes
    - name: start httpd
      service:
        name: httpd
        state: started

Пару уточнений:
1. become - для того, чтобы избежать ошибки "You need to be root to perform this command"
2. проверьте, чтобы на управляемой ноде не было установлено ПО апача, иначе будет такая ошибка FAILED! => {"ansible_facts": {"pkg_mgr": "yum"}, "changed": false, "changes": {"installed": ... }
3. Когда пишите плайбук всегда проверяйте отступы - это очень важно!

Thursday, November 28, 2019

Linux: практикум


Всем, привет!
Продолжаю список интересных вопросов, которые задают на собеседовании Linux админам.
Немного практики не повредит :)
Весь список тут

В директории 500 файлов, необходимо найти все файлы свыше 20 ГБ, отсортировать по размеру, отобразить 5 самых больших файлов.


Распакуйте test.tar.gz без использрования google и справки.

Как разделить файл на несколько частей без архиватора? Например, 10 гб файл разделить по 1 гб.


Рекурсивно удалите все файлы с раширением "*.pyc" из тестовой директории?


Найдите строку "my konfu is the best" во всех файлах с расширением *.py.


Замените вхождение фразы "my konfu is the best" на "I'm a linux jedi master" во всех *.txt файлах.


Проверить доступность 443 порта на машине с IP-адресом X.X.X.X


Получить содержимое http://myinternal.webserver.local/test.html с помощью telnet'a.


Отправить письмо используя командную строку(command line).


Найти все файлы, которые использовались за последние 30 дней.

Как узнать какой процесс запущен на определенном порту?


Thursday, November 14, 2019

Docker: контейнеры это не виртуальные машины

Всем привет!
Docker выпустил небольшую книжечку "Docker for the Virtualization Admin", поэтому я решил ее быстренько пролистать и поделиться своим мнением, что там интересного.
И вот что я для себя выделил.

Когда начинаешь работать с докером, контейнеры описываются как "легкие виртуальные машины” и это понятно, потому как 2 технологии(docker and VMs) используют похожие характеристики.
2 главных критерия сходства:
  • Каждый из них предназначен для обеспечения изолированной
    среды, в которой выполняется некоторое приложение. 
  • Каждая среда представлена в виде двоичного артефакта (binary artifact), и может быть легко перемещена между хостами.

Ключевое различие заключается в архитектуре! Контейнеры и виртуальные машины имеют похожие преимущества изоляции и распределения ресурсов, но функционируют по-разному: контейнеры виртуализируют операционную систему вместо аппаратных ресурсов. Эта облегченная форма показывает эффект создания контейнеров как более портативных, так и более эффективных, чем виртуальные машины. Другая форма сравнения, виртуалка - огромный приусадебный дом, а контейнер - небольшая квартира. Примерно, все тоже самое, но в совсем в других размерах и абстракциях.
Администратор создает образ Docker, который включает в себя только необходимое для запуска своего приложения. Виртуальная машина собирается в обратном направлении: начиная с полной операционной системы и, в зависимости от приложения, добавляются нужные компоненты.
Виртуальная машина по-прежнему рассматривается как сервер, включая традиционное резервное копирование, аварийное восстановления, и другие серверные задачи.
С контейнерами Docker - это движение в сторону микросервисов, единственная служба, которая и является приложением. В архитектуре микросервисов существует множество небольших служб, каждый представлен как одиночный контейнер Docker, содержит
только свое приложение. Большие и тяжелые приложения теперь могут быть деконструированы на небольшие компоненты(контейнеры).

Как забэкапить контейнер?
А никак! Данные приложения не живут в контейнере, они живут в томе(docker volume), который совместно используется между одним или несколькими контейнерами, как определено архитектурой приложения. Тома поддерживают различные виды бэкапирования, включая облачное, поэтому администратор создает резервную копию тома данных, и забывает о контейнере.

Как управлять обновлениями?
Администратор обновляет существующий образ(image) Docker, останавливает выполнение
контейнера, и запускает заново. Контейнер можно запустить за доли секунды, поэтому эти обновления выполняются намного быстрее, чем на виртуальной машине. Нет необходимости перезагружать всю ОС-просто остановите старую версию вашего контейнера и запустите  снова из нового образа.

И самый главный вопрос - где лучше запускать контейнеры на виртуальных серверах или на физических? 
Эксперты докера отвечают "все зависит от ...". А далее от того чем вы располагаете, то к чему стремитесь, что хотите получить в итоге. Любое ИТ-решение основано на множестве переменных: производительности, масштабируемости, надежности, безопасности и др.
Docker предоставляет вам возможность развернуть приложения без проблем, независимо от базовой инфраструктуры, будь то железный сервер или виртуальная машина, центр обработки данных или публичное облако. Основное тут ,что вы можете в дальнейшем перенести ваше приложение на другую платформу.

Задержка (Latency). Приложения с низким порогом задержки лучше разворачивать на  физических серверах. Как пример, торговые приложения(площадки). 

Доступное пространство(Capacity). Если ваши контейнерные приложения не потребляют всю емкость на физическом сервере, виртуализация предлагает преимущество преимущество. Например, можно назначить данное пространство для песочницы для разработчиков.

Смешанные Операционные Системы(Mixed Operating Systems). Если вам потребуются контейнеры разных ОС, Windows и Linux на одном хосте, вам нужно будет
использовать виртуализацию.

Мультиарендность(Multitenancy). Некоторые приложения испытывают рабочие нагрузки, которые не могут совместно использовать ядра или ресурсы. В этом случае виртуальные машины предоставляют дополнительный слой изоляции по сравнению с контейнерами на физическом сервере.

Пулы Ресурсов / Квоты(Resource Pools /Quotas). Многие решения для виртуализации имеют широкий спектр функций управления и приоритизации использования общих ресурсов виртуальными машинами. Docker предоставляет концепцию ограничений ресурсов для
контейнера, но если вы обеспокоены что эти разрешения будут проигнорированы, виртуальные машины могут добавить еще один пограничный слой



Wednesday, November 6, 2019

Linux: команды


Всем, привет!
Продолжаю работать над вопросами. Решил вынести в отдельный пост команды, которыми пользую каждый день.
Весь список тут

1. Что выполняет команда ```tee```?


2. Что выполняет команда ```awk```?


3. Что выполняет команда ```tr```?



4. Что выполняет команда ```cut```?



5. Что выполняет команда ```tac```?



6. Что выполняет команда ```curl```?



7. Что выполняет команда ```wget```?



8. Что выполняет команда ```watch```?



9. Что выполняет команда ```head```?



10. Что выполняет команда ```tail```?



11. Что выполняет команда ```less```?



12. Что выполняет команда ```cat```?



13. Что выполняет команда ```touch```?



14. Что выполняет команда ```sar```?



15. Что выполняет команда ```netstat```?



16. Что выполняет команда ```tcpdump```?



17. Что выполняет команда ```lsof```?



18. Что выполняет команда ```cpio```?


19. Что выполняет команда ```ps```?



20. Что выполняет команда ```nohup```?



Linux: веб вопросы


Всем, привет!
Продолжаю список интересных вопросов, которые задают на собеседовании админам или девопсам.
В этот раз рассматриваем вопросы, связанные с вебом и сетью.
Весь список тут

Какую функцию выполняет DNS в сети?


Какие записи ДНС вы знаете, для чего они используются?



Что такое HTTP?


Что такое HTTP-proxy и как он работает?


Кратко опишите как работает HTTPS.


Что означает директива upstream в настройках nginx'a?


Кратко опишите действия по созданию и установке ssl-сертифката для сайта https://foo.example.com


Можно ли использовать несколько SSL-хостов на одном айпи-адресе?


Что такое wildcard сертификат?


Tuesday, October 22, 2019

Zabbix: настройка мониторинга

Всем привет!
В этой статье рассмотрим настройку мониторинга на zabbix'e: подключим шаблон мониторинга, включим мониторинга порта и системных компонентов. В качестве подопытного возьмем сервер Apache.
Что имеем в самом начале - это установленный сервер Zabbix'a на CentOs'e.

Для начала посмотрим, что предлагает использовать сам Zabbix для мониторинга веб-сервера Apache. Вариантов много, остановимся на решении без подключения внешних скриптов (Template App Apache2 for Zabbix 4.0 that works without any external scripts). Из этого решения нам нужен файл xml, загружаем. При импорте у меня он не захотел импортироваться сразу, поэтому пришлось скопировать содержимое, а сам файлик создать отдельно. 
Проверяем, что модуль status_module в апаче установлен, если нет - устанавливаем.
httpd -M 2>/dev/null | grep status_module

В конфиг апача вносим такие настройки:
<Location /server-status>
    SetHandler server-status
    Order deny,allow
</Location>
ExtendedStatus On 

Перегружаем апач. 
 

На странице Templates создаем новый шаблон изxml-файла.
На странице Configuration-Hosts создаем  новый хост: указываем имя и группу(рекомендую создать отдельную групу для ваших серверов, а не использовать группу по умолчанию).
В настройках агента(/etc/zabbix/zabbix_agentd.conf) этого нового хоста, не забудьте добавить разрешения для основного сервера, с которого осуществляется мониторинг, у меня это 10.30.1.41
Server=127.0.0.1, 10.30.1.41

Далее - прицепляем импортированный шаблон "Template App Apache2 Zabbix agent".

Переходим на вкладку Applications, там должно появиться ваше первое приложения для апача. Добавим еще одно, назовем его Open ports, внутри этого приложения кликаем на Add item - добавим новое условие мониторинга. Указываем название и приложение. В настройках нас интересует ключ net.tcp.service[http,10.30.1.41,80] (служба http, айпи-адрес и порт).
Сохраняем. Ждем пару минут, переходим на вкладку Monitoring-Latest data
Итак, для текущего примера получаем минимальный пакет для мониторинга веб-сервера и работающего порта. В дашборд выведу пару графиков, выглядят они, конечно, приятно, но по большому счету это просто красота:) 


Успехов!

Friday, October 18, 2019

Zabbix: установка оффлайн

Всем привет!
Сегодня устанавливаем Zabbix в оффлайн режиме. Как обычно в оф. документации все просто, проверим - так ли это. Для данной задачи используется сервер с CentOs'ом, который имеет доступ в интернет, чтобы можно было скачать нужные пакеты, и второй сервер без доступа к интернету. На этот сервер и будем устанавливать заббикс.
Для начала берем все нужное(загружаем в папку tmp):
yum install --downloadonly --downloaddir=/tmp /
zabbix40-server-mysql /
zabbix40-web-mysql /
zabbix40-agent /
yum install createrepo -y --downloadonly --downloaddir=/tmp 

Возможно, что еще понадобятся и эти зависимости: deltarpm, python-deltarpm
С помощью createrepo сделаем репозитарий из локальной нашей папки с загруженными пакетами:

createrepo /custom_repo/
Перенесем туда все пакеты, далее переподключаем репозиторий.
yum clear all
yum repolist 

Загрузили, перенесли все пакеты на второй сервер.
Приступаем к установке и сразу же получаем ошибку:
Error: Package: zabbix40-server-mysql-4.0.12-1.el7.x86_64 (LocalRepo)
           Requires: libcrypto.so.10(OPENSSL_1.0.2)(64bit)

Версия openssl требует обновления.
Бежим качаем 2 пакета(на текущий момент такая версия):
openssl-1.0.2k-19.el7.x86_64.rpm
openssl-libs-1.0.2k-19.el7.x86_64.rpm
Далее удаляем старый openssl, обновляем openssl-libs(зависимости) и устанавливаем новую версию openssl. Продолжаем установку:
yum install zabbix40-server-4.0.12-1.el7.noarch.rpm

Далее все гут, едем дальше.
yum install  zabbix40-web-4.0.12-1.el7.noarch.rpm
Получаю ошибку:
Error: Package: php-5.4.16-46.el7.x86_64 (LocalRepo)
           Requires: httpd-mmn = 20120211x8664


Отсутствует httpd - идем качаем зависимости:
yum install httpd -y --downloadonly --downloaddir=/tmp
yum install apr.x86_64 -y --downloadonly --downloaddir=/tmp
yum install apr-util -y --downloadonly --downloaddir=/tmp
yum install httpd-tools -y --downloadonly --downloaddir=/tmp
yum install mailcap -y --downloadonly --downloaddir=/tmp
Продолжаем установку httpd:

yum install httpd

yum install zabbix40-web-4.0.12-1.el7.noarch.rpm 

Далее идет установка СУБД, я устанавливаю MariaDB.

 yum install mariadb-server-5.5.64-1.el7.x86_64.rpm

Если вы получаете ошибки такого рода:
#systemctl status mysql
● mysql.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)
# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)

Значит у вас не запущен сервер СУБД - проверьте тот ли пакет вы установили и запустите службу. 

systemctl start mariadb.service
Создаем БД и импортируем скрипты для работы(строго по порядку):
shell> mysql -uroot -p<пароль> 
mysql> create database zabbix character set utf8 collate utf8_bin; 
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by '<пароль>'; 
mysql> quit;

shell> cd database/mysql 
shell> mysql -uzabbix -p<пароль> zabbix < schema.sql
shell> mysql -uzabbix -p<пароль> zabbix < images.sql 
shell> mysql -uzabbix -p<пароль> zabbix < data.sql

В конфиге сервера /etc/zabbix/zabbix_server.conf указываем настройки сервера:
DBHost=localhost 
DBName=zabbix 
DBUser=zabbix 
DBPassword=zabbix_pass
Запускаем сервер
systemctl start zabbix-server
Не забываем включить его в автозапуск
systemctl enable zabbix-serverЕсли у вас на этом же сервере стоит и агент, то включаем его:
systemctl enable zabbix-agent.service 
Вносим изменения в настройки httpd и php. Например, date.timezone = Europe/Moscowр, у меня конфиги из папки http не считывались и возникла ошибка:
Time zone for PHP is not set (configuration parameter "date.timezone").
Поэтому пришлось поправить этот параметр в /etc/php.ini
date.timezone = Europe/Moscow
Запускаем httpd и браузером заходим на адрес сервера http://ip-servera/zabbix
Заполняем все поля, указывваем параметры подклюбчения, имя сервера и другие настройки.
Установка на этом завершена. Логин-пароль по умолчанию Admin/zabbix. 

Успехов!

Tuesday, October 15, 2019

Docker: nginx + wordpress + php-fpm

Всем привет!
Продолжаем контейнеризировать все по-тихонечку. На этот раз переведем сайт на использование вордпресс. Сам официальный туториал не вызывает особого интереса - как мне показалось, там довольно все просто. И когда друг ко мне обратился за помощью, я подумал, что там будет все быстро сделано. Но, есть всегда свои но! Вперед:)
Первое, взглянем на оф. документ по инсталяции. Все просто! Нам понадобится docker-compose, если у вас еще не установлен, устанавливаем.
Второе, создаем директорию, где будем размещать все нужные нам файлы. Для начала хочу заметить, что по оф. доку у меня не получилось так быстро все сделать, т.к. WP не захотел работать без php-fpm, поэтому я сразу решал эту проблему. Далее показываю уже работающий конфиг, а ошибку укажу внизу поста.
Создаем docker-compose.yml
version: '3.1'
services:


Далее создаем контейнеры для WP, вашей базы данных - на выбор или Myslq или MariaDb, для Nginx и для PHP.

Контейнер WP, зависит от контейнера с базой данных:
   wordpress:
        image: wordpress
        restart: always
        ports:
            - 8080:80
        depends_on:
            - db
        environment:
            WORDPRESS_DB_HOST: db
            WORDPRESS_DB_USER: exampleuser
            WORDPRESS_DB_PASSWORD: examplepass
            WORDPRESS_DB_NAME: maindb
        volumes:
         - ./html:/var/www/html 


Контейнер с базой данных:
    db:
        image: mysql:5.7
        restart: always
        environment:
            MYSQL_DATABASE: maindb
            MYSQL_USER: exampleuser
            MYSQL_PASSWORD: examplepass
            MYSQL_RANDOM_ROOT_PASSWORD: '1'
        volumes:
         - ./database:/var/lib/mysql
         - ./my.cnf:/etc/my.cnf

Я добавил файл с некоторыми настройками для MySql. Т.к. у меня на сервере мало оперативной памяти, то я сократил размер буфера. если этого не сделать, то демон mysqld будет ругаться и не стартанет. Содержимое my.cnf:
[mysqld]
innodb_buffer_pool_size = 16M


Контейнер с веб-сервером:
   nginx:
        image: nginx3
        ports:
            - 443:443
        volumes:
            - ./nginx:/etc/nginx/
            - ./logs/nginx:/var/log/nginx
            - ./html:/var/www/html
        links:
            - wordpress
            - php
        restart: always

 
Я настроил nginx, чтобы он работал только по 443 порту и выложил все конфиги в директории ./nginx, аналогично для логов. Конфиг для Nginx'a:
server {
        listen       443 ssl http2 default_server;
        listen       [::]:443 ssl http2 default_server;
        server_name  _;
        root   /var/www/html;
       
        ssl_certificate "/etc/ssl/certs/nginx-selfsigned.crt";
        ssl_certificate_key "/etc/ssl/certs/nginx-selfsigned.key";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        location / {
            try_files $uri /index.php?$args;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass php:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
        location /test{
            proxy_pass https://ya.ru;
        }        

}

Тут интерес вызывают только самоподписанные сертификаты и настройки php. Для тестов директория /test перекидывает на сайт яндекса.
Последний контейнер для PHP.
   php:
        build: ./php/
        volumes:
        - ./html:/var/www/html 

 
Для подключения к WP требуется библиотека mysqli, которая не установлена по умолчанию, поэтому собираем из докерфайла образ.  Я образ собираю по докер-файлу, вот содержимое:
FROM php:7-fpm
RUN docker-php-ext-install mysqli


Далее добавляем:
volumes:
    wordpress:
    db:

networks:
    local:


Запустил все с помощью:
docker-compose up -d
Проверяю логи контейнеров:
docker logs IDContainer

На этом настройка Docker'a закончена и далее уже можно переходить к настройкам самого WP. Теперь расскажу на какие грабли я наступил. Ошибки в студию:)
База показывает ошибку:
1) docker wordpress MySQL Connection Error: (2002) Connection refused
2) PHP Warning:  mysqli::__construct(): php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution in Standard input code on line 22
Браузер показывает ошибку:
3) Error establishing a database connection
Неверный формат файла конфига для базы 
4) [ERROR] Found option without preceding group in config file /etc/my.cnf at line 1!

Успехов! 

Wednesday, October 9, 2019

Linux: вопросы среднего уровня


Всем, привет!
Продолжаю список интересных вопросов, которые задают на собеседовании Linux админам.
В этот раз рассмотрим вопросы среднего уровня(middle)
Весь список тут

Вопросы среднего уровня:
20. Что обозначает ```&``` после команды?



21. Что обозначает ```& disown``` после команды?



22. Что такое фильтр пакетов (packet filter) и как он работает?



23. Что такое виртуальная память(Virtual Memory)?



24.Что такое swap и для чего используется?



Что такое "sticky bit"?



Для чего предназначен бит неизменяемости(immutable bit)?



Что такое жесткая ссылка, символическая? Чем отличаются? Что произойдет если удалить источник, на который указывает ссылка?



Что такое айнод(inode) и какие поля в нем хранятся?



Что такое SNMP и для чего он используется?



Как уменьшить размер файла, который используется в текущий момент(например, файла лога)?



Что такое переадресация SSH-порта?

Как добавить пользователя без использования команд useradd/adduser?

Опишите команду mknod и расскажите когда вы её используете?


Загрузка диского пространства 100%, вы удалили огромный файл логов, но df показывает - нет свободного места. В чем проблема?

Вы получаете ошибку "filesystem is full", хотя 'df' говорит об обратном, место есть. В чем проблема?


Расскажите как работает команда 'ps'.


Что происходит с дочерним процессом, который завершил свое выполнение, но у которого нет родительского процесса ожидающего его завершение? Почему это плохо?


Кратко опишите каждое состояние процесса(process states) в ОС Linux.


Вы запускаете скрипт и хотите посмотреть вывод в терминале и сохранить в файл, как это можно сделать?


Объясните, что выполнит данная команда echo "1" > /proc/sys/net/ipv4/ip_forward


Какие типы файлов вы знаете в ОС Linux?


В чем разница между процессом и потоком?



Tuesday, October 8, 2019

Linux: курьезные вопросы


Всем, привет!
Продолжаю список интересных вопросов, которые задают на собеседовании Linux админам.
На этот раз очередь курьезных вопросов или веселых.
Так что будьте готовы к вопросу "чем отличается крокодил от холодильника" :)
Весь список тут

Веселые вопросы:
1. Админ случайно выполнил команду: ```chmod 444 /bin/chmod ```. Как починить?


2. Вы забыли(потеряли) пароль рута, что делать?


3. Вы перезапустили удаленно сервер, но через 10 минут вы по-прежнему не можете к нему подключиться по SSH. В чем может быть проблема?


4. Вы застряли на необитаемом острове, какие 5 утилит командной строки вы бы выбрали?


5. Вы случайно удалили файл с запущенным скриптом, возможно ли его можно восстановить?


6. Что приозойдет 19 Января 2038?


7. Как перегрузить сервер, если команда reboot не отвечает?


8. Чем отличается rest от json'a?


Коллеги, расскажите о вопросах, которые вам показались курьезными на собеседовании! :) Успехов!

Thursday, October 3, 2019

Linux: простые вопросы


Всем, привет!
Русифицировал популярные вопросы, которые задают на собеседовании Linux админам.
Вот весь список. Тут собрал ответы

Простые вопросы:
1. Как называется главный пользователь Linux системы и назовите его UID?


2. Как посмотреть все файлы, включая скрытые в директории?


3. Какой командой можно удалить папку вместе со всем содержимым?


4. Какой командой можно посмотреть утилизацию памяти в Linux'e?


5. Какой командой осуществить поиск строки "my string" внутри директории рекурсивно?


6. Как подключится к удаленному серверу через SSH?


7. Как посмотреть переменные среды?


8. Когда запускаете ```ifconfig -a``` получаете ошибку "command not found". С чем это может быть связано?


9. Что произойдет если нажать TAB-TAB?


10. Какой командой можно посмотреть все доступное место на диске Unix/Linux системы?


11. Какими командами можно проверить записи DNS?


12. Какой командой можно изменить владельца файла? Установить разрешения на файл?


13. Что выполнит данная команда ```chmod +x FILENAME```?


14. Что означают разрешение 0750 для файла? Отличается от разрешений для директории?


15. Как добавить нового юзера без разрешения на логин(login permissions)?


16. Как добавить/удалить пользователя из группы?


17. Что выполнит данная команда CTRL-c?


18. Что находится в файле /etc/services?


19. Как перенаправить стандартный вывод STDOUT и стандартный вывод ошибок STDERR? (> /dev/null 2>&1)


20. Какая разница между подключением по Telnet и SSH?


21. Какими командами можно посмотреть среднюю загрузку системы? Объясните 3 основных значения загрузки системы(load average)?


22. Назовите опции в нижнем регистре для команды ```ls```, которые не являются рабочими.


23. Что такое модуль ядра Linux'a?


24. Что такое протокол ICMP? Для чего используется?


25. Что такое уровень запуска и как посмотреть текущий?

26. Как проверить является ли машина виртуальной?

27. Как принудительно заставить систему выполнить проверку файловой системы при следующем запуске?

28. Какой процесс идет с пидом 1?

Wednesday, September 18, 2019

Docker: запускаем Nginx

Логинемся в докер хаб. 
#docker login

 Создадим и запустим простой контейнер на основе Nginx
# docker run --name mynginx1 -P -d nginx
-P (Publish all exposed ports to random ports) сопоставляем порты Nginx(80,443) с произвольным портом из диапазона между 49153 и 65535. 
-d (Run container in background and print container ID) запускаем контейнер в бэкграунде.

Стандартного образа в системе нет, поэтому он был скачан с хаба.
проверяем, что нгинкс работает(номер порта - 52267)
#curl http://localhost:52267

Если вы хотите настроить образ под себя, то нужно модифицировать докерфайл.
Например, сопируем файлы и папки nginx'a.
Файлы, в том числе и  сертификаты, кладем в текущую директорию. Из стандартного образа nginx строим шаблон, открываем порт 443.  
FROM nginx
COPY ./html /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
COPY nginx-selfsigned.crt /etc/ssl/certs/nginx-selfsigned.crt
COPY nginx-selfsigned.key /etc/ssl/certs/nginx-selfsigned.key
EXPOSE 443

Генерируем шаблон
#docker build -t nginx1 .
Запускаем на 443 порту этот шаблон
#docker run -p 443:443 -d nginx1

По умолчанию докер присвоит некоторое имя для вашего контейнера, но вы можете сделать это самостоятельно. Удобнее работать с именованным контейнером. 
#docker run -d -P --name nginxserver nginx1:latest

Если вы хотите добавить некоторые директории в ваш конфиг(не копировать, а смонтировать), то нужно запускать докер таким образом:
docker run --name nginx_server -v /yourfiles/html:/var/www/html:ro \
-v /yourfiles/nginx:/etc/nginx:ro -p 443:443 -d nginx3
\ - используется как перевод каретки(читай объединение строк)
ro - монтируются в контейнер в режиме только чтение

Остановка контейнера с приложением:

#docker stop nginxserver 

Успехов!

Tuesday, September 17, 2019

Docker: архитектура

Docker предоставляет возможность упаковывать и запускать приложение в изолированной среде, называемой контейнером. Изоляция и безопасность позволяют запускать много контейнеров одновременно на одной машине(хосте). Контейнеры являются легкими, потому что не используют гипервизор, но только ресурсы хоста. Docker может быть запущен и на виртуальных машинах, главное чтобы хватило ресурсов!
Docker Engine-это клиент-серверное приложение, состоящее их 3-х основных компонентов:
  •   Сервер, который является типом длительной программы, или проще говоря демон (dockerd). Демон прослушивает запросы API Docker и управляет объектами Docker, такими как изображения, контейнеры, сети и тома.
  •     REST API, определяет интерфейсы, которые программы могут использовать для общения с демоном и инструктировать его, что делать.
  •     Клиент интерфейса командной строки (CLI) (команда docker). Клиент отправляет команды в dockerd, который их выполняет(например, docker run).
Посмотрим на архитектуру докера:

Dockerfile используется как шаблон(набор инструкций), по которому можно сделать образ(docker image). Обратите внимание, что файл создается без разрешения! Каждая инструкция в этом файле создает отдельный слой в образе. При изменении Dockerfile и перестроении изображения перестраиваются только те слои, которые были изменены. Поэтому образы такие легкие и небольшого размера, плюс довольно быстрые, по сравнению с другими технологиями виртуализации.
Например, самый простой dockerfile будет выглядеть так, слой за слоеем:
FROM centos:7
RUN yum update -y
CMD ["bash] 
Создаем образ из этого файла:
#docker build -t image_from .
-f если файл находится вне текущей директории.

На хабре есть отличная статья про файлы докера и команды.
  1. FROM — задаёт базовый (родительский) образ.
  2. LABEL — описывает метаданные. Например — сведения о том, кто создал и поддерживает образ.
  3. ENV — устанавливает постоянные переменные среды.
  4. RUN — выполняет команду и создаёт слой образа. Используется для установки в контейнер пакетов.
  5. COPY — копирует в контейнер файлы и папки.
  6. ADD — копирует файлы и папки в контейнер, может распаковывать локальные .tar-файлы.
  7. CMD — описывает команду с аргументами, которую нужно выполнить когда контейнер будет запущен. Аргументы могут быть переопределены при запуске контейнера. В файле может присутствовать лишь одна инструкция CMD.
  8. WORKDIR — задаёт рабочую директорию для следующей инструкции.
  9. ARG — задаёт переменные для передачи Docker во время сборки образа.
  10. ENTRYPOINT — предоставляет команду с аргументами для вызова во время выполнения контейнера. Аргументы не переопределяются.
  11. EXPOSE — указывает на необходимость открыть порт.
  12. VOLUME — создаёт точку монтирования для работы с постоянным хранилищем.

Docker Image
С помощью docker файла мы сделали новый образ(read only!), который является шаблоном с инструкциями для создания контейнера. Как видно из примера, получившийся шаблон(docker-image) основан на другом шаблоне centos,  но с дополнениями(yum update). Как вариант, вы можете создать свой шаблон, который устанавливает ваше приложение с вашими настройками и конфигами. Также есть возможность опубликовать собственные разработки на docker-hub'e, откуда они будут доступны другим участникам.

Containers(контейнер) - это выполняемый экземпляр образа(самодостаточная ОС, в которой только самое необходимое и код приложения). Вы можете создать, запустить, остановить, переместить или удалить контейнер с помощью Docker API или CLI. Вы можете подключить контейнер к одной или нескольким сетям, присоединить к нему хранилище или даже создать новый образ на основе его текущего состояния.
По умолчанию контейнер изолирован от других контейнеров и от хоста, на котором он запущен. При удалении контейнера все изменения, которые вы сделали за время его работы, если они не хранятся в в постоянном хранилище, потеряются.

Services (сервисы) - позволяют масштабировать контейнеры между несколькими демонами Docker, которые работают вместе в кластере(swarm)с несколькими менеджерами и работниками(manager and workers). Каждый член кластера является демоном Docker, и все демоны взаимодействуют с помощью API Docker.
Служба позволяет определить желаемое состояние, например количество реплик службы, которые должны быть доступны в любой момент времени. По умолчанию служба балансирует нагрузку на всех рабочих узлах кластера.

Успехов!

Friday, September 13, 2019

Linux: настрока синхронизации времени

Допустим, у нас есть сервер с которого мы хотим получать "правильное"(читай, настоящее) время для нашего сервера centos внутри локальной сети. Для этого воспользуемся демоном Chrony. 
    Проверяем установлен ли chrony(в противном случае - yum install chrony)

#systemctl status chronyd 
Включаем:
#systemctl enable chronyd

Редактируем конфигурационный файл:
vi /etc/chrony.conf
Добавляем локальные NTP сервера:
server 10.30.17.234
server 10.30.17.235


Запускаем демона:
#systemctl start chronyd 

Дополнительные команды:
#chronyc sources
#chronyc traking

Успехов!

Docker installation(Установка Докера)

Докер(Docker) - открытая (open) платформа для разработчиков и админов, помогающая проектировать и запускать "контейнеризированные" приложения, главный плюс которого - упаковать приложение со всеми зависимостями в отдельный контейнер(можно даже опубликовать в хабе). Контейнеры не создают такой нагрузки как виртуальные машины, поэтому более эффективно используют ресурсы системы.
"Из википедии: программное обеспечение для автоматизации развёртывания и управления приложениями в среде виртуализации на уровне операционной системы; позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, а также предоставляет среду по управлению контейнерами".

Установка Docker'a на CentOS.
1. Для начала нужно удалить старые версии, если они существуют:
#sudo yum remove docker

2. Далее устанавливаем необходимые утилиты и добавляем репозиторий с докером
#yum install -y yum-utils \ device-mapper-persistent-data \ lvm2

 #yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo


3.Далее устанавливаем Docker Engine
#yum install docker-ce docker-ce-cli containerd.io
Установщик предлагает принять PGP-key, проверяем, что ключ совпадает с указанным на сайте:
 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35
Принимаем.

4. Запускаем Докер
#systemctl start docker
5. Установка завершена, можно запустить первое приложение. 
#docker run hello-world 
 
6. Не забудьте добавить пользователю docker права рута, а то будет неудобно запускать команды используя sudo. И да, я делал все под рутом, что не очень правильно:)
 
Успехов! 

Thursday, September 12, 2019

Linux: немного про систему

Уровень выполнение (запуска).
Уровни выполнения определяют, какие задачи могут выполняться в текущем состоянии (или на текущем уровне выполнения) операционной системы Linux.
 0 - Завершение работы компьютера.
 1 - Однопользовательский режим (обычно имеет псевдоним s или S)
 2 - Многопользовательский режим без поддержки сети.
 3 - Многопользовательский режим с поддержкой сети.
 5 - Многопользовательский режим с поддержкой сети и графической оболочки X Window.
 6 - Перезагрузка компьютера.
Посмотреть уровень запуска системы можно командами:
#who -r 
#runlevel

Виды потоков
  • STDIN (0) Стандартный входной поток. Канал, принимающий данные для обработки и последующей передачи на канал STDOUT и/или STDERR.
  • STDOUT(-1) Стандартный выходной поток. Представляет собой канал записи результатов выполнения каких-либо процессов. 
  • STDERR(-2) Стандартный выходной поток ошибок. В данный канал попадают сообщения об ошибках.
Управление потоками
> Вывод STDOUT в файл
#find /somedir/ -size +20G > /tmp/testfile
>> добавление STDOUT в конец файла
#find /somedir/ -size +20G >> /tmp/testfile
>& вывод STDOUT и STDERR в файл
#find /somedir/ -size +20G >& /tmp/testfile
>2 вывод  STDERR в файл
 #find /somedir/ -size +20G >2 /tmp/testfile
Комбинированный вывод
 #find /somedir/ -size +20G > /tmp/testfile >2 /dev/null
Более детально про потоки.

Команды и описание.
lsmod - Информация о модулях ядра. Объекты которые расширяют функционал ядра.
lspci - информация об устройствах pci
lspcmcia - платы расширения для ноутбуков
lsusb - информацияо usb

С помощью команды udevadm используем следующие параметры:
  • info смотрим информацию;
  • trigger эмуляция некоего события для устройства;
  • settle ожидание завершения обработки;
  • control управление демонами;
  • monitor отслеживание событий;
  • test симуляция события;
Модули управлением ядром:











  • lsmod информация о модулях ядра(Драйвер — модуль ядра, подсказывающий шине, как правильно обращаться с устройством);
  • modinfo информация о конкретном модуле(например, на скрине показана информация о ФС);
  • rmmod удаление модуля;
  • insmod установка модуля;
  • modprobe деликатное удаление или добавление;
Про драйвера все очень подробно расписано.