Ansible: Часть 1. Описание, установка и первоначальная настройка.

На чем было опробовано:




  1. Ansible 2.9.18
  2. Hyper-V на Windows 10 Pro.
  3. Сервер Ansible: CentOS Linux release 7.9.2009 (Core).
  4. Node 1: CentOS Linux release 7.9.2009 (Core).
  5. Node 2: CentOS Linux release 7.9.2009 (Core).
  6. Node 3: CentOS Linux release 7.9.2009 (Core).








1. Введение.




Представьте себе, что вам нужно управлять парком серверов, расположенных к тому же в разных географических точках. Каждый из этих серверов требует настройки, регулярного обновления и мониторинга. Конечно, для решения этих задач можно воспользоваться самым простым способом: подключиться к каждому серверу по ssh и внести необходимые изменения. При всей своей простоте этот способ сопряжен с некоторыми трудностями: он чрезвычайно трудоемок, а на выполнение однообразных операций уходит очень много времени.




Чтобы упростить процессы настройки и конфигурирования серверов, можно также писать shell-скрипты, но и этот способ вряд ли можно назвать совершенным. Скрипты нужно постоянно изменять, подстраивая их под каждую новую задачу. При их написании необходимо учитывать различие операционных систем и версий. Не будем забывать и о том, что отладка скриптов отнимает много усилий и забирает немало времени.




Оптимальным вариантом решения описанных проблем является внедрение системы удаленного управления конфигурацией. В таких системах достаточно лишь описать нужное состояние управляемого узла. Система должна сама определить, что нужно сделать для достижения этого состояния, и осуществит все необходимые действия.




Со всеми сложностями, о которых идет речь выше, вы наверняка хорошо знакомы на собственном опыте: у вас имеется несколько десятков серверов, расположенных в разных точках планеты. На них необходимо регулярно вносить различные изменения: обновлять операционную систему, устанавливать и обновлять различное программное обеспечение, изменять конфигурацию и тому подобное.




Предлагается все эти операции автоматизировать и внедрить систему удаленного управления конфигурациями.




Так как простые задачи для Ansible реально простые, в буквальном смысле слова, то я принял решение вынести их в отдельную инструкцию:




Ссылка: «Ansible: Часть 2. Примеры простых задач.»




Рассмотрим структуру и правила написания таких сценариев более подробно.




Ссылка: «Ansible: Часть 3. Сценарии (плейбуки) — Playbooks.»




По данной ссылке я создам небольшую подборку самых интересных и типовых плейбуков, которые могут пригодиться вам в повседневной работе.




Ссылка: «Ansible: Часть 4. Практические примеры плейбуков.»




Как настраивать защищенные плейбуки описано в этом разделе.




Ссылка: «Ansible: Часть 5. Настройка защищенных плейбуков.»




2. Что такое Ansible?




Ansible — программное решение для удаленного управления конфигурациями, разработанное Майклом Де Хаанном в 2012 году. Название продукта взято из научно-фантастической литературы: в романах американской писательницы Урсулы Ле Гуин была такая штука, как Ansible — это устройство для оперативной космической связи.




Ansible — мощное программное обеспечение автоматизации конфигурирования, с открытым исходным кодом, управления и развертывания приложений на узлах без каких-либо простоев, для работы которого потребуется только SSH. В отличие от подобных продуктов, Ansible устанавливается на единственном хосте, который может даже быть вашей локальной машиной и использует SSH для связи с каждым удаленным узлом. Это позволяет ему быть невероятно быстрым при конфигурировании новых серверов, поскольку не требуются предварительно установленные дополнительные пакеты на каждом новом сервере.




Машина управления, где установлен Ansible и Узлы, управляемая этой машиной по SSH. Местоположение узлов определяется управляющей машиной через её инструментарий. Ansible не требует установки клиентской части или приложения, что означает отсутствие необходимости какой-либо установки агента на удаленных узлах, так что это означает, что нет каких-либо фоновых демонов или программ, выполняемых для Ansible, когда он не управляет узлами.




Другими словами, Ansible — программное обеспечение для централизованного управления конфигурациями, то есть другими операционными системами и установленными на них программами. Это современный инструмент управления конфигурацией, который облегчает задачу настройки и обслуживания удаленных серверов.




Ansible берет на себя всю работу по приведению удаленных серверов в необходимое состояние. Администратору необходимо лишь описать, как достичь этого состояния с помощью так называемых сценариев — специальных файлов «playbook».




В них описывается желаемое состояние управляемой системы, например, необходимо наличие пакета Midnight CommanderAnsible проверяет, соответствует ли удаленный компьютер описанию в плейбуке, и если это не так, приводит его в должный вид. Формат для playbook — YAML. Для описания задачи задается ее имя, используемый модуль и список параметров.




Такая технология позволяет очень быстро осуществлять переконфигурирование системы, для этого достаточно всего лишь добавить несколько новых строк в сценарий.




Пример плейбука:




---
- name: Nginx web server
  hosts: web-servers
  remote_user: root
  tasks:
  - name: Installs nginx web server
    yum:
      pkg: nginx
      state: installed
      update_cache: true
  - name: Push future default virtual host configuration
    copy:
      src: files/site.conf
      dest: /etc/nginx/conf.d/
      mode: 0640




В данном примере мы задаем 2 задачи для группы серверов web-servers — сначала необходимо установить пакет nginx, затем скопировать файл site.conf с сервера на удаленную систему в каталог /etc/nginx/conf.d.




3. Почему Ansible лучше других подобных программ?




По сравнению с другими популярными инструментами автоматизации IT-инфраструктуры, Ansible не требует установки клиентских приложений на обслуживаемые сервера, что может сократить время настройки перед развертыванием инфраструктуры. Для работы Ansible подключается к обслуживаемым серверам по SSH.




Преимущества Ansible по сравнению с другими аналогичными решениями (здесь в первую очередь следует назвать такие продукты, как PuppetChef и Salt) заключаются в следующем:







Самостоятельно ознакомиться с Puppet вы можете по моим инструкциям на этом же сайте:




Ссылка: «Puppet — система управления конфигурацией».




4. Какой метод лучше Push или pull?




“Из коробки” все сценарии и команды выполняются методом push: когда возникает необходимость, мы запускаем сценарий, и он последовательно выполняется на удалённых серверах. Однако разработчики также предусмотрели метод pull и даже написали специальное приложение для установки необходимой для этого части ansible на удалённые хосты.




5. Как работает Ansible.




Основная идея Ansible – наличие одного или нескольких управляющих серверов, из которых вы можете отправлять команды или наборы последовательных инструкций (playbooks) на удаленные сервера, подключаясь к ним по SSH.







Файл Host inventory содержит информацию об обслуживаемых серверах, где команды будут исполнены. Файл конфигурации Ansible может быть полезен для указания настроек вашего окружения.




Наборы инструкций (playbooks) состоят из одной или более задач, которые описываются с помощью функциональность модуля ядра Ansible или сторонних модулей, которые могут потребоваться в специфических ситуациях. Сами по себе наборы инструкций — последовательные наборы команд, в которых могут быть проверки условий: если условие не выполняется, определенные команды могут пропускаться.




Также вы можете использовать Ansible API для запуска скриптов. Если скрипту-обертке (wrapper) может потребоваться запуск playbook, это можно сделать через API. Сами playbooks описываются декларативно в формате YAMLAnsible поддерживает сценарии развертывания новых облачных серверов и конфигурирования их на основании ролей. Часть работы может быть проведена в локальном режиме на управляющем сервере, а остальная — на созданном сервере после его первой загрузки.




6. Краткий словарь терминов Ansible.




В этом этой инструкции широко используются такие термины Ansible:







7. Установка.




Обновим операционную систему:




# yum -y update && yum -y upgrade




По умолчанию Ansible нет в репозитории CentOS 7 — устанавливаем репозиторий EPEL:




# yum -y install epel-release




После устанавливаем сам сервер управления:




# yum -y install ansible




Где система автоматически обновит список пакетов с учетом нового репозитория и начнет установку Ansible.




Проверка версии установленной версии Ansible:




# rpm -qa | grep ansible




Ответ:







или




# ansible --version




Ответ:







8. Настройка Ansible.




Файл конфигурации описывается в INI–формате. Вы можете переопределить часть или всю конфигурацию в параметрах playbook или переменных окружения.




При исполнении команд Ansible проверяет наличие файла конфигурации в следующих расположениях:




  • проверяется переменная окружения ANSIBLE_CONFIG, которая может указывать на файл конфигурации;
  • ./ansible.cfg – в текущей директории;
  • ~/.ansible.cfg — в домашней директории;
  • /etc/ansible/ansible.cfg — в каталоге, сгенерированном при установке Ansible через менеджер пакетов.




9. Настройка через переменные окружения.




Большинство параметров конфигурации можно установить через переменные окружения, используя префикс ANSIBLE_ перед названием параметра конфигурации (большими буквами).




Например:




export ANSIBLE_SUDO_USER=root




После этого переменная ANSIBLE_SUDO_USER может быть использована в playbook.




10. Параметры конфигурации.




Параметров конфигурации Ansible множество.




Давайте рассмотрим некоторые из них:







11. Файл конфигурации ansible.cfg.




По умолчанию список хостов/групп, к которым применяются команды содержится в файле /etc/ansible/hosts:




# grep -E '^#inventory' /etc/ansible/ansible.cfg




Ответ:







При необходимости его можно переопределить с помощью опции




--inventory-file(-i)




Пример создания кастомного файла конфигурации.




Подключитесь по SSH к созданному управляющему серверу с установленным Ansible.




Создайте директорию для экспериментов ‘ansible‘ в своём домашнем каталоге и перейдите в него:




# mkdir ~/ansible
# cd ~/ansible




Также создайте каталог для хранения модулей Ansible и каталог для хранения логов:




# mkdir ~/ansible/modules
# mkdir ~/ansible/logs




Создайте файл ansible.cfg со следующим содержимым:




[defaults]
hostfile = ~/ansible/inventory
sudo_user = root
log_path = ~/ansible/logs/ansible.log




Указываем обслуживаемые сервера в host inventory.




Для экспериментов можно упомянуть, к примеру пару серверов, которые и можно настраивать.




Нужно сообщить Ansible их адреса и сгруппировать их.




Для этого создайте файл inventory в директории ~/ansible/inventory со следующим содержимым:




[experiments]
ip_первой_машины
ip_второй_машины




12. Файл hosts.




Работа с Ansible начинается с настройки его центрального файла списка хостов — так и называется файл hosts.




По умолчанию расположение файла — /etc/ansible/hosts, но оно может также быть задано параметром окружения $ANSIBLE_HOSTS или параметром -i при запуске ansible и ansible-playbook.




Содержимое этого файла может выглядеть, например, так, в квадратных скобках указаны имена групп управляемых узлов, ниже перечисляются входящие в эти группы серверы:




[dbservers]
one.example.com
two.example.com
three.example.com

[dnsservers]
rs1.example.com ansible_ssh_port=5555 ansible_ssh_host=192.168.1.50
rs2.example.com
ns[01:50].example.com




Помимо списка управляемых узлов, в файле hosts могут быть указаны и другие сведения, необходимые для работы: номера портов для подключения по SSH, способ подключения, пароль для подключения по SSH, имя пользователя, объединения групп и тому подобно. В некоторых случаях — в частности, при работе с большими и сложными конфигурациями, — различные параметры можно выносить в отдельные файлы и каталоги.




Более подробно о файле hosts и правилах его написания можно почитать в официальной документации.




Ссылка: docs.ansible.com.




Раздел: «How to build your inventory».




13. Информация об узлах — Facts.




Перед внесением изменений Ansible подключается к управляемым узлам и собирает информацию о них: о сетевых интерфейсах и их состоянии, об установленной операционной системе и тому подобное. Он может делать это как с помощью собственного модуля, так и с помощью инструментов ohai и facter, если они установлены (такая возможность специально предусмотрена для пользователей, уже имеющих опыт работы с системами удаленного управления конфигурациями: ohai и facter являются библиотеками фактов для Chef и Puppet).




14. Переменные.




Во время работы, как правило, требуется не только установить какое-либо приложение, но и настроить его в соответствии с определенными параметрами на основании принадлежности к группе серверов или индивидуально (например, IP-адрес BGP-соседа и номер его AS или параметры для базы данных).




Как уже было сказано, загромождать файл hosts будет не очень красиво, поэтому разработчики Ansible пошли следующим путём:







Помимо пользовательских переменных можно и даже нужно использовать факты, собранные Ansible перед выполнением сценариев и отдельных задач.




15. Модули Ansible.




В состав Ansible входит огромное количество модулей для развёртывания, контроля и управления различными компонентами, которые можно условно разделить на следующие группы (в скобках приведены названия некоторых продуктов и сервисов):







О том, с чем умеет работать Ansible, можно прочитать в официальной документации. Список действительно впечатляет.




Ссылка на документацию: docs.ansible.com.




16. Начальная настройка и тестовый запуск Ansible.




Установим файловый менеджер и текстовый редактор в одном лице — Midnight Commander:




# yum -y install mc




Создадим резервную копию оригинального файла конфигурации:




# cp /etc/ansible/hosts /etc/ansible/hosts.original




Откроем на редактирование файл с серверами, которыми хотим управлять:




# mcedit /etc/ansible/hosts




и приведем его к следующему виду:




[test_servers]
server1 ansible_ssh_host=192.168.0.39 ansible_ssh_user=root
server2 ansible_ssh_host=192.168.0.30 ansible_ssh_user=root
server3 ansible_ssh_host=192.168.0.31 ansible_ssh_user=root




где







Все сервера, в данном примере, имеют одинаковую операционную систему CentOS Linux release 7.9.2009 (Core), одинаковых пользователей root и одинаковые пароли на учетных записях root.







Открываем конфигурационный файл Ansible (выше по тексту был способ изменить место хранения файла конфигурации):




# mcedit /etc/ansible/ansible.cfg




Снимаем комментарий с опции host_key_checking, приведя ее к виду:




host_key_checking = False




Данная настройка позволит нашему серверу управления автоматически принимать ssh fingerprint, избавляя нас от необходимости постоянно вводить yes, когда мы впервые конфигурируем новый сервер.




Теперь выполним проверку доступности добавленных серверов:




# ansible -m ping test_servers -u root -kK




Данная команда проверит доступность по сети двух серверов из группы test_servers от учетной записи root.




Будет запрошен пароль от учетной записи (в нашем случае, root).




После будет запрошен пароль суперпользователя на серверах.







16.1. Если всё заработало.




На экране должно появиться, примерно, следующее:







Наш сервер управления готов к работе.




16.2. Если не заработало.




Если на экране появится ошибка, введите с сервера Ansible следующую команду:




# ssh root@192.168.0.39




В данном случае, мы пытаемся подключиться к серверу 192.168.0.39 по SSH от пользователя root.




Если подключиться к серверу 192.168.0.39 вышеописанной командой не удалось, возможно введен неправильный пароль или доступ по SSH от root запрещен. В этом случае, создайте служебную учетную запись на сервере 192.168.0.39 и используйте ее для подключения по SSH.




Например, на удаленном сервере вводим:




# useradd ansible-user

# passwd ansible-user




В этом примере мы создали учетную запись ansible-user и задали ей пароль.




Теперь вводим нашу команду для проверки:




# ansible -m ping test_servers -u ansible-user -kK




Внимание! Обратите внимание, что мы выполняем теперь запрос от пользователя ansible-user.




17. Организация RSA-ключей между серверами.




Для того, что бы Ansible хозяйничал на хостах, требуется включить на целевых для управления хостах разрешение пользоваться аутентификацией по ключам, создать пару RSA-ключей на Ansible Control Machine и копировать открытые ключи на целевые сервера, которыми планируется управлять.




Как это сделать подробно описывается в инструкции: «CentOS 7: Настройка и использование SSH — Secure Shell».




В данном руководстве я приведу краткий способ организации коммуникации между хостами.




Создаём пару RSA-ключей.




# ssh-keygen




На все вопросы жмём Enter. Нам не нужны никакие пароли и генерируем ключи мы в каталог по умолчанию.




Ответ:







Копируем открытые ключи на сервера, которыми планируем управлять.




У нас их 3 штуки, поэтому копируем на каждый:




# ssh-copy-id root@192.168.0.39
# ssh-copy-id root@192.168.0.30
# ssh-copy-id root@192.168.0.31




Ответы:







Либо средствами самого Ansible через модуль authorized_key.




Раскатаем пользователя root на все виртуальные машины, до которых может дотянуться Ansible:




# ansible all -m authorized_key -a "user=root key='{{ lookup('file', '/root/.ssh/id_rsa.pub') }}' path=/root/.ssh/authorized_keys manage_dir=no" --ask-pass




Ответ командной строки…:




SSH password:
server3 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "comment": null,
    "exclusive": false,
    "follow": false,
    "gid": 0,
    "group": "root",
    "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDKIz2wkoU3vrwAPKFORDfjJMw1+6G1nHASMcbUXf6rYauACbW8zSdKi4Br0Bgf+yok+79jehVMuWiiJlKfm2V2JsV/KNW+tmEwSqbuolKtjTDFnHZx/IW6yO+51qFLL152IRDk7FmNBJAZJ3NpXZnVq2OrPidEGr5j/1VbNp+0QNE8aT9Dy4V0axYXwa9/AEwXNTtclSh+zK0bwKoD978DGpGUyiOl3I9FPrz8uc/8M6xWPHLSaAvqYpc2aT5X5J0sFVMqpMKDVoLxsEM45KTci81SoAq1XlU2UCdX+LHuRhgbz0BYY/nCqJ9HWGb1CJwthuaRaVDX6dA6D1fwWHxd root@cos7serv.hamsterden.loc",
    "key_options": null,
    "keyfile": "/root/.ssh/authorized_keys",
    "manage_dir": false,
    "mode": "0600",
    "owner": "root",
    "path": "/root/.ssh/authorized_keys",
    "size": 410,
    "state": "file",
    "uid": 0,
    "user": "root",
    "validate_certs": true
}
    ... и так далее...




Проверяем вход пользователя root по SSH-ключам c сервера на узлы.




У нас их 3 штуки, поэтому тестируем вход на на каждый:




# ssh root@192.168.0.39
# ssh root@192.168.0.30
# ssh root@192.168.0.31




Ответ:







Также настроим вход с Ansible-сервера на самого себя:




# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys




Проверяем:




# cat /root/.ssh/authorized_keys




Ответ:







18. Проверка подключения к узлам.




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




# ansible all -m 'ping'




или, встроенной в Ansible, одноименной утилитой:




# ansible all -m ping




Модуль ping проверит, есть ли у вас учетные данные для подключения к узлам, определенным в файле инвентаря, и может ли Ansible запускать сценарии Python на удаленном сервере от имени root пользователя.




Ответ pong означает, что Ansible готов запускать команды и плейбуки на этом узле.




Ответ:







Проверять с целевыми узлами можно и поштучно через их алиасы:




# ansible server1 -m ping
# ansible server2 -m ping
# ansible server3 -m ping




Ответ:







И еще одну команду:




# ansible all -a 'uptime'




Ответ:







19. Примеры простых задач Ansible.




Так как простые задачи для Ansible реально простые, в буквальном смысле слова, то я принял решение вынести их в отдельную инструкцию:




Ссылка: «Ansible: Часть 2. Примеры простых задач.»




20. Сценарии — Playbooks.




Ansible позволяет не только выполнять единичные задачи, но и писать сценарии, которые необходимо выполнить на управляемых узлах.




Рассмотрим структуру и правила написания таких сценариев более подробно.




Ссылка: «Ansible: Часть 3. Сценарии (плейбуки) — Playbooks.»




По данной ссылке я создам небольшую подборку самых интересных и типовых плейбуков, которые могут пригодиться вам в повседневной работе.




Ссылка: «Ansible: Часть 4. Практические примеры плейбуков.»




Если ваши плейбуки Ansible содержат конфиденциальные данные, такие как пароли, ключи API и учетные данные, важно обеспечить их безопасность с помощью шифрования. Ansible предоставляет ansible-vault для шифрования файлов и переменных.




Несмотря на то, что любой файл данных Ansible, а также двоичные файлы, возможно зашифровать изначально, чаще для шифрования переменных файлов, содержащих конфиденциальные данные, используется ansible-vault. После шифрования файла с помощью этого инструмента вы сможете выполнять, редактировать или просматривать его, только предоставив соответствующий пароль, указанный при первом шифровании файла.




Ссылка: «Ansible: Часть 5. Настройка защищенных плейбуков.»




21. Файл инвентаря.




21.1. Пользовательский файл инвентаря.




Файл инвентаря по умолчанию обычно находится в /etc/ansible/hosts, но вы можете использовать опцию -i для указания пользовательских файлов при запуске команд и плейбуков Ansible.




Это удобный способ настройки индивидуального инвентаря для каждого проекта, который можно включить в системы контроля версий, такие как Git:




# ansible all -m ping -i my_custom_inventory




Такая опция действительна и для ansible-playbook:




# ansible-playbook myplaybook.yml -i my_custom_inventory




21.2. Динамический файл инвентаря.




Ansible поддерживает сценарии инвентаризации для создания динамических файлов. Это полезно, если ваш инвентарь часто меняется, когда серверы создаются и уничтожаются.




Вы можете найти ряд скриптов с открытым исходным кодом в официальном репозитории Ansible GitHub. После загрузки требуемого сценария на Ansible Control Machine и настройки необходимых параметров (например, учетных данных API) вы можете запустить исполняемый файл в качестве пользовательского инвентаря с любой командой Ansible, которая поддерживает эту опцию.




Следующая команда использует скрипт инвентаря my_inventory.py с командой ping для проверки подключения ко всем текущим активным серверам:




# ansible all -m ping -i my_inventory.py




За более подробной информацией о том, как использовать динамические файлы инвентаризации, пожалуйста, обратитесь к официальной документации Ansible.




Ссылка на документацию: docs.ansible.com.




22. Вызов справки по командам.




Существует еще много вариантов команд и флагов, которые могут пригодиться вам в работе с Ansible.




Чтобы получить обзор всех доступных опций, вы можете использовать команду help:




# ansible --help




Если вы хотите получить более полное представление об Ansible и всех его доступных командах и функциях, обратитесь к официальной документации Ansible.




Ссылка на документацию: docs.ansible.com.




23. Устранение неполадок.




Если вы сталкиваетесь с ошибками при выполнении команд и плейбуков, рекомендуется увеличить детализацию вывода, чтобы получить больше информации о проблеме.




Вы можете сделать это, включив в команду параметр -v:




# ansible-playbook myplaybook.yml -v




Если вам нужно больше деталей, вы можете использовать -vvv, и это увеличит детализацию вывода.




Если вы не можете подключиться к удаленным нодам через Ansible, используйте -vvvv для получения информации об отладке соединения:




# ansible-playbook myplaybook.yml -vvvv




24. Возможные ошибки.




24.1. Ошибка «[WARNING]: Updating cache and auto-installing missing dependency: python-apt».




Данная ошибка возникает во время попытки установит пакет с программным обеспечением на целевые хосты с CentOS 7:




# ansible server1 -m apt -a "name=vim"




Ответ с ошибкой:







Устранение ошибки: воспользуйтесь установщиком yum c CentOS 7 совместимых операционных систем, а не apt с Debian совместимых систем.




# ansible server1 -m yum -a "name=vim"




Вариант ответа без ошибки:







Программное обеспечение успешно установилось.




25. Оригиналы источников информации.




  1. selectel.ru «Система управления конфигурацией Ansible».
  2. dmosk.ru «Инструкция по установке и запуску Ansible на CentOS».
  3. dmosk.ru «Что такое ansible».
  4. 8host.com «Как работать с Ansible: простая удобная шпаргалка».
  5. habr.com «Автоматизируем и ускоряем процесс настройки облачных серверов с Ansible. Часть 1: Введение».
  6. kamaok.org.ua «Установка и использование Ansible на Centos7».
  7. dataenginer.ru «Что такое Ansible? Ansible Tutorial Guide для начинающих.»
  8. Источник: https://hamsterden.ru/ansible-install-setup/






2021-09-01T10:48:21
Software

Криптография с Python

Криптография, наука о шифрах, стала реальностью с помощью кодирования. Мы не можем решить, какой язык программирования лучше или хуже другого. Однако выбор подходящей криптографической библиотеки имеет решающее значение.

Python предоставляет несколько очень сложных библиотек и модулей для шифрования и дешифрования данных. Некоторые из них — Cryptography, hashlib, Simple-Crypt и т. д. В статье демонстрируется использование современных методов криптографии в Python с помощью библиотеки криптографии, демонстрируя, как шифровать и дешифровать текстовые строки и файлы.

 

Установка библиотеки криптографии

Cryptography — это библиотека на языке Python, которая предоставляет пользователям различные способы криптографии; одна из них — простое шифрование и дешифрование данных. Используйте следующую команду для установки библиотеки криптографии.

ubuntu@ubuntu:~$ pip install cryptography

Шифрование текста

Импорт Fernet

После успешной установки модуль fernet импортируется из библиотеки. Функция берет на себя ответственность как за шифрование, так и за расшифровку данных. Для этого создайте файл python и импортируйте модуль fernet из криптографической библиотеки следующим образом:

from cryptography.fernet import Fernet

Генерация ключа

Теперь сгенерируйте ключ аутентификации, определив функцию или просто используя генератор fernet в Python. Функция Fernet.generate_key() сгенерирует ключ для шифрования и дешифрования. Добавьте в код следующую строку:

>> key = Fernet.generate_key()

 

Теперь будет создан экземпляр класса Fernet с использованием сгенерированного ключа.

>> fernet= Fernet(key)

Шифрование текстовой строки

Теперь для шифрования текста достаточно нескольких строк кода. Добавьте следующие строки, чтобы зашифровать текст.

>> message = “This text will be encrypted”



>> encrypted_message= fernet.encrypt(message.encode())



>> print(‘исходная текстовая строка:’, message)



>> print(‘сообщение после шифрования:’ encrypted_message)

 

Выполнение вышеуказанного кода Python выводит неразборчивую строку буквенно-цифровых символов, как показано ниже. Это простейшая форма шифрования текстовой строки с помощью библиотеки Cryptography в Python. Во-первых, он кодирует строку, чтобы затем зашифровать ее с помощью рецепта криптографического шифрования.

$python main. py

original text string: This text will be encrypted message after encryption: gAAALI2cFS8dTm87KKKadrptluse5CM4t9_

 

Расшифровка текстовой строки

После шифрования строки с помощью метода шифрования хорька расшифруйте текст обратно в исходную форму. Успешное дешифрование гарантирует, что получатель может без проблем расшифровать информацию и получить к ней доступ.

Следовательно, для беспрепятственного дешифрования модули Fernet также обеспечивают простую функцию дешифрования. Добавление этих двух строк в ваш файл python плавно расшифрует одно и то же сообщение до его исходной формы.

decrypted_message=fernet.decrypt(encrypted_message).decode()



print(‘расшифрованная строка текста:’, decrypted_message )

 

В приведенных выше строках кода используется тот же экземпляр Fernet, который использует ключ, сохраненный в памяти программы, для дешифрования. Функция fernet.decrypt() возвращает закодированную строку после расшифровки, как она была закодирована до шифрования. Теперь функция декодирования возвращает закодированную строку в исходную форму.

 

Шифрование файлов

Как и при шифровании текста, импортируйте модуль fernet для шифрования файлов и генерации ключей. Импортируйте модуль fernet из библиотеки Cryptography.

from cryptography.fernet import Fernet

Генерация ключей

Как показано выше, используйте функцию генератора ключей Fernet для генерации ключа. Несмотря на то, что это лучший подход для проверки шифрования и дешифрования коротких текстов, он практически бесполезен, поскольку теряет ключ навсегда после завершения программы. Следовательно, рекомендуется безопасно хранить ключ в файле, чтобы его можно было прочитать и использовать в любое время.

Включите это, определив функцию генератора ключей в коде, который записывает ключ в файл. Это также можно сделать, сохранив ключ Fernet в текстовом файле. Создайте ключ и сохраните его в файле для использования в будущем.

>> key = Fernet.generate_key()



>> with open('keyfile.key', 'wb') as keyfile:



keyfile.write(key)

 

Этот код сгенерирует случайную буквенно-цифровую строку и сохранит ее в файле keyfile.key.

 

Шифрование

Используйте следующую строку кода, чтобы прочитать уже сохраненный ключ для шифрования файла.

>> with open('keyfile.key', 'rb') as keyfile:



>> key= keyfile.read()

 

Использование ключа для экземпляра fernet:

>> fernet= Fernet(key)

 

Откройте и прочтите файл, который нужно зашифровать, и зашифруйте данные в файле с помощью шифрования Fernet:

>> with open('list.csv', 'rb') as original_file:



original_data = original_file.read()



>> Encrypted_data= fernet.encrypt(original_data)

 

Теперь откройте файл в режиме записи и запишите зашифрованные данные обратно:

>> with open('list.csv', 'wb') as encrypted_file:



encrypted_file.write(encrypted_data)

 

При выполнении приведенного выше кода исходные данные файла заменяются массивом буквенно-цифровых строк.

 

Расшифровка файла

Снова используйте модуль Fernet, чтобы расшифровать файл с тем же ключом. Следующий код сначала считывает данные из зашифрованного файла и восстанавливает их в исходной форме с помощью функции дешифрования.

>> fernet= Fernet(key)



>> With open('list.csv', 'rb') as encrypted_file:



encrypted_data = encrypted_file.read()



>> decrypted_data = fernet.decrypt(encrypted_data)



>> with open('list.csv', 'wb') as decrypted_file:



decrypted_file.write(decrypted_data)

Заключение

Библиотека Cryptography — одна из многих библиотек и модулей, которые Python предлагает для безопасного обмена данными и шифрования. Модуль fernet библиотеки предоставляет встроенный генератор ключей и предоставляет функции шифрования и дешифрования для строки данных и больших файлов.



2021-09-01T10:02:29
Python

Как быстро стать программистом без ВУЗа?

Сейчас мир кардинально изменился,  и если еще пару лет назад все гнались за тем, чтобы получить новую профессию и закончить ВУЗ, то сегодня люди дают себе время на раздумья. Многие считают, что освоение профессии занимает много времени, если речь идет о классическом обучении в университете, то это действительно так. Однако есть и другие способы получения престижной и прибыльной профессии. К примеру, если вы мечтаете работать в сфере ИТ, то вы без проблем можете самостоятельно пройти обучение программированию онлайн.

Конечно, поступив в университет или колледж можно стать программистом 1С. Однако там вы сможете получить только устарелую теоретическую базу, которая по факту не совпадает с действительностью. ІТ — это сфера, которая постоянно развивается, поэтому вам необходимо будет самостоятельно учиться.

Сегодня существует уйма вариантов для образования. К примеру, вы можете самостоятельно пройти онлайн обучение программированию, заниматься на специализированных курсах, где вам структурировано подадут всю необходимую информацию и научат базовым навыкам, либо же вы можете стать помощником опытного программиста и учиться всему по ходу дела.

Конечно, в случае с самообразованием временные затраты будут не такими большими, как в случае с ВУЗом, однако они напрямую зависят от желаемого результата. Однако стоит добавить, что учиться нужно всегда, ведь в любой профессии со временем появляется что-то новое, и если вы хотите быть востребованным программистом, нужно следить за всеми новинками. Скорее всего вы слышали утверждение о том, что достаточно потратить всего лишь 10 000 часов для того, чтобы стать профессионалом в любой сфере. Это действительно так, однако для того, чтобы стать начинающим программистом, нужно будет потратить в разы меньше времени.

Тут все полностью индивидуально и зависит от талантов, но в большинстве случаев от 6 до 12 месяцев вполне достаточно для того, чтобы вырасти до уровня Junior в программировании.

С одной стороны, намного проще тем, у кого уже есть техническая база с колледжа или ВУЗа (желательно в математическом направлении), ведь в таком случае можно намного быстрее освоить хотя бы на начальном уровне HTML, CSS, JavaScript, фреймворки. Имея в арсенале только такие навыки вы можете смело брать первые заказы на фрилансе.

 

Работа программистом: модно или прибыльно

Перед тем, как начинать искать курсы программирования онлайн и принимать решение о кардинальной смене своей деятельности, необходимо решить, нужно ли это вам вообще. Многие идут в эту профессию исключительно из-за того, что она востребована и высокооплачиваемая. Безупречно, это так, но если вы не будете любить то, чем занимаетесь, то вряд ли с этого выйдет что-то толковое.

Но если вы все таки твердо решили идти в ИТ и хотите пройти unity 3d обучение, то эта сфера вас точно не разочарует, поскольку профессия программиста востребована на рынке. Огромное преимущество в возможности дистанционной работы.

 

Онлайн курсы программирования — современное обучение у вас дома

Ранее обучение у всех ассоциировалось с партой, старым преподавателем и тоннами ненужных лекций и конспектов по всем возможным предметам, которые по факту никогда не пригодятся. Сегодня все намного проще, ведь существуют онлайн курсы программирования. Это возможность за несколько месяцев освоить абсолютно новую, сложную и престижную профессию. Вам даже не нужно выходить из дома, чтобы получать знания или оттачивать навыки — только вы, компьютер и большое желание учиться.



2021-08-31T21:03:55
Программирование

Сброс пароля root в контейнерах LXC | Proxmox

В этой статье представлены команды для сброса пароля root в контейнерах LXC на Proxmox.




Бывает такое, что вы забрали пароль от учётной записи root в контейнерах на Proxmox. Как же быть в этой ситуации. Если в виртуальной машине на KVM можно загрузить в single режиме и сбросить пароль от root пользователя через web морду. То с LXC контейнерами этот номер не пройдет. Также я уже писал как при помощи терминала Proxmox можно сбросить пароль администратора или root пользователя в KVM контейнерах.




Для сброса пароля от root пользователя необходимо подключиться к proxmox, например через ssh, и в командной строке ввести следующее:




pct enter <VEID>
passwd <new password>
exit




Приведу пример с виртуальной машиной под номером 105




pct enter 105




после подключения к виртуальной машине вводим:




passwd new_pass
exit




  • new_pass – ваш новый пароль




После данной манипуляции пароль от контейнера в Proxmox будет изменён на новый.




Если же Вы забыли пароль от root пользователя в самом Proxmox, то для его сброса необходимо проделать немного другие мероприятия. Вот тут я уже писал как сбросить пароль от root пользователя в системе Linux.



[endtxt]




RSS




2021-08-30T17:39:44
Proxmox

Как использовать Vagrant с Libvirt в Linux

В этом руководстве мы рассмотрим, как использовать Vagrant с Libvirt в Linux. Vagrant — это программное обеспечение с открытым исходным кодом, написанное на Ruby, чтобы помочь вам создавать и поддерживать портативные виртуальные среды разработки программного обеспечения, например для VirtualBox, Hyper-V, контейнеров Docker, VMware, Libvirt и AWS. Vagrant упрощает создание, остановку и уничтожение виртуальных машин.

Самым популярным вариантом использования на локальных машинах является использование провайдера VirtualBox. Если вы являетесь пользователем KVM и QEMU, эта статья для вас. KVM, как известно, имеет лучшую производительность и меньшее использование ресурсов по сравнению с Virtualbox. Читать

Как использовать модуль Decimal в Python

В этой статье будет рассмотрена статья по использованию модуля Decimal в Python. Его можно использовать для выполнения различных математических операций с числами с плавающей запятой или числами, содержащими десятичные точки. Все примеры кода в этой статье протестированы с Python 3.9.5 в Ubuntu 21.04.

 

О десятичном модуле

Десятичный модуль, как следует из названия, может использоваться для обработки чисел с десятичной запятой или чисел с плавающей запятой. Методы, включенные в этот модуль, помогают округлять десятичные числа, преобразовывать числа и выполнять арифметические вычисления. Он также уделяет большое внимание точности и точности, и каждое число после десятичной точки считается значимым. Десятичный модуль рассматривает такое число, как 1,40, как 1,40, а не как 1,4. Использование десятичного модуля можно лучше понять на примерах. Некоторые из них описаны ниже.

 

Выполнение основных математических вычислений с использованием десятичного модуля

Вы можете вызвать модуль Decimal для преобразования числа в десятичный тип в Python. В приведенном ниже примере кода показана разница между основным математическим делением чисел целочисленного типа и числами десятичного типа.

from decimal import Decimal



a = 10

b = 11

c = a / b

d = Decimal(a) / Decimal(b)

print (c, type(c))

print (d, type(d))

 

Первый оператор импортирует класс Decimal из модуля decimal. Затем создаются две переменные «a» и «b» с некоторыми значениями. Переменная «c» хранит значение, полученное путем деления переменной a на b. Затем тот же процесс повторяется путем преобразования чисел в объекты десятичного типа. После выполнения приведенного выше примера кода вы должны получить следующий результат:

0.9090909090909091 <class 'float'>

0.9090909090909090909090909091 <class 'decimal.Decimal'>

Как вы можете видеть в выходных данных выше, объект типа float показывает числа с меньшей точностью, чем объект типа decimal, поскольку он использует гораздо более агрессивный метод аппроксимации, чем объект типа decimal. По умолчанию число десятичного типа в Python показывает до 28 чисел. Вы можете изменить это значение в соответствии с вашими потребностями, вызвав метод getcontext, доступный в модуле decimal.

from decimal import Decimal

from decimal import getcontext



getcontext().prec = 50

a = 10

b = 11

c = a / b

d = Decimal(a) / Decimal(b)

print (c, type(c))

print (d, type(d))

В приведенном выше примере кода функция getcontext была импортирована, а точное положение было установлено до 50 позиций. Метод getcontext можно использовать для просмотра текущего контекста в потоке и изменения некоторых параметров конфигурации по умолчанию для десятичного модуля. После выполнения приведенного выше примера кода вы должны получить следующий результат:

0.9090909090909091 <class 'float'>

0.90909090909090909090909090909090909090909090909091 <class 'decimal.Decimal'>

Вы можете выполнять любой тип арифметических вычислений с объектами десятичного типа, которые вы можете выполнять с объектами типа float в Python. Большое количество конечных десятичных чисел в объектах десятичного типа может дать очень точные числа, которые особенно полезны в финансовых, бухгалтерских, критически важных научных приложениях и т. д.

Обратите внимание, что вы можете создавать числа десятичного типа из чисел с плавающей запятой, целых чисел и строк, содержащих числа, вызывая основной конструктор Decimal.

 

Округление чисел с помощью десятичного модуля

Модуль decimal поставляется с некоторыми предопределенными режимами округления, которые можно использовать для округления чисел с десятичными точками. Эти режимы называются ROUND_FLOOR, ROUND_CEILING, ROUND_HALF_DOWN, ROUND_HALF_UP, ROUND_UP, ROUND_DOWN, ROUND_HALF_EVEN и ROUND_05UP. Согласно официальной документации Python, вот что делает каждый из этих режимов:

  • ROUND_FLOOR: число округляется до отрицательной бесконечности.
  • ROUND_CEILING: число округляется до бесконечности или положительной бесконечности.
  • ROUND_HALF_DOWN: числа округляются до ближайшего числа. Если есть ничья, число округляется до нуля. Связи — это равноотстоящие числа, которые можно округлять как в большую, так и в меньшую сторону. Например, такое число, как 4,25, можно округлить как в сторону 4,2, так и 4,3.
  • ROUND_HALF_UP: числа округляются до ближайшего числа. Если есть ничья, число округляется от нуля.
  • ROUND_UP: число округляется от нуля.
  • ROUND_DOWN: число округляется до нуля.
  • ROUND_HALF_EVEN: числа округляются до ближайшего числа. Любые связи округляются до ближайшего четного целого числа.
  • ROUND_05UP: числа округляются от нуля, если последнее число равно 0 или 5. Если нет, то числа округляются до нуля.

В приведенном ниже примере кода показано поведение этих режимов.

import decimal

from decimal import Decimal

from decimal import getcontext



getcontext().prec = 2



getcontext().rounding = decimal.ROUND_FLOOR

print (Decimal(3.961) + Decimal(0))



getcontext().rounding = decimal.ROUND_CEILING

print (Decimal(3.961) + Decimal(0))



getcontext().rounding = decimal.ROUND_HALF_DOWN

print (Decimal(3.705) + Decimal(0))



getcontext().rounding = decimal.ROUND_HALF_UP

print (Decimal(3.775) + Decimal(0))



getcontext().rounding = decimal.ROUND_UP

print (Decimal(3.775) + Decimal(0))



getcontext().rounding = decimal.ROUND_DOWN

print (Decimal(3.609) + Decimal(0))



getcontext().rounding = decimal.ROUND_HALF_EVEN

print (Decimal(3.665) + Decimal(0))



getcontext().rounding = decimal.ROUND_05UP

print (Decimal(3.675) + Decimal(0))

Пример кода довольно прост. Для округления чисел установлена ​​точность 2 цифры. Метод округления изменяется путем установки значения объекта «округление» (часть основного контекста). После выполнения приведенного выше примера кода вы должны получить следующий результат, в котором каждая строка соответствует соответствующему режиму округления:

3.9

4.0

3.7

3.8

3.8

3.6

3.7

3.6

Округление с использованием метода квантования

Вы также можете использовать метод «квантования», доступный в десятичном модуле, для округления чисел. Процесс идентичен описанному выше методу. Однако вместо того, чтобы устанавливать числа точности отдельно, вы можете указать показатель степени в качестве аргумента метода квантования, чтобы округлить число до определенной позиции. Ниже приведен пример кода.

import decimal

from decimal import Decimal



rounded = Decimal(3.961).quantize(Decimal('1.0'), rounding=decimal.ROUND_FLOOR)

print (rounded)

Методу квантования был предоставлен показатель степени «1.0», а в качестве дополнительного аргумента был предоставлен метод округления. Он вернет число в формате XX. После выполнения приведенного выше примера кода вы должны получить следующий результат:

3.9

Сравнение двух десятичных чисел

Вы можете сравнить любые два объекта десятичного типа, используя метод «сравнения», доступный в десятичном модуле. Примеры ниже показывают его использование.

from decimal import Decimal



print (Decimal(1.2).compare(Decimal(1.1)))

print (Decimal(1.0).compare(Decimal(1.1)))

print (Decimal(1.0).compare(Decimal(1.0)))

Вы можете вызвать метод сравнения для объекта десятичного типа и указать другое число в качестве аргумента. Будет возвращено значение 0, 1 или -1 в зависимости от сравниваемых чисел. Значение 0 указывает, что оба числа равны, значение 1 указывает, что первое число больше второго числа, а значение -1 указывает, что первое число меньше второго. После выполнения приведенного выше примера кода вы должны получить следующий результат:

1

- 1

0

Заключение

Хотя модуль decimal чаще всего используется для управления точностью десятичного разделителя и округления чисел после десятичной точки, он поставляется с некоторыми другими полезными методами, которые в дальнейшем можно использовать для управления десятичными числами для получения точных результатов арифметических вычислений. Базовое использование модуля decimal было рассмотрено в этой статье, и этого должно хватить для большинства ситуаций. Но вы всегда можете узнать больше о расширенных методах из официальной документации Python.



2021-08-29T22:06:23
Python