One place for hosting & domains

      Импорт

      Импорт и экспорт базы данных MongoDB в Ubuntu 20.04


      Автор выбрал COVID-19 Relief Fund для получения пожертвования в рамках программы Write for DOnations.

      Введение

      MongoDB — одна из самых популярных СУБД NoSQL. Она отличается масштабируемостью, мощностью и надежностью и удобством в использовании. В этом учебном модуле мы покажем, как импортировать и экспортировать ваши базы данных MongoDB.

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

      В этом учебном модуле мы не описываем задачи резервного копирования, восстановления и миграции. Более подробную информацию можно найти в учебном модуле Резервное копирование, восстановление и миграция баз данных MongoDB в Ubuntu 20.04.

      Предварительные требования

      Для этого учебного модуля вам потребуется следующее:

      Шаг 1 — Импортирование информации в MongoDB

      Чтобы узнать, как работает импорт информации в MongoDB, мы используем популярный образец базы данных MongoDB — базу о ресторанах. Эта база имеет формат json, и ее можно загрузить с помощью wget следующим образом:

      • wget https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json

      После завершения загрузки в текущем каталоге должен быть файл primer-dataset.json (размер 12 Мбайт). Импортируем данные из этого файла в новую базу данных newdb и в коллекцию restaurants.

      Используйте команду mongoimport следующим образом:

      • sudo mongoimport --db newdb --collection restaurants --file primer-dataset.json

      Результат будет выглядеть вот так:

      Output

      2020-11-11T19:37:55.607+0000 connected to: mongodb://localhost/ 2020-11-11T19:37:57.841+0000 25359 document(s) imported successfully. 0 document(s) failed to import

      Как показывает приведенная выше команда, были импортированы 25359 документов. Поскольку у нас не было базы данных с именем newdb, MongoDB создала ее автоматически.

      Давайте проверим импорт.

      Подключитесь к только что созданной базе данных newdb:

      Вы подключились к экземпляру базы данных newdb. Обратите внимание, что ваша командная строка изменилась. Это означает, что вы подключены к базе данных.

      Подсчитайте число документов в коллекции restaraunts с помощью команды:

      Будет выведен результат 25359, т. е. количество импортированных документов. Для еще более эффективной проверки вы можете выбрать первый документ из коллекции restaraunts следующим образом:

      Результат будет выглядеть вот так:

      [secondary label Output]
      {
          "_id" : ObjectId("5fac3d937f12c471b3f26733"),
          "address" : {
              "building" : "1007",
              "coord" : [
                  -73.856077,
                  40.848447
              ],
              "street" : "Morris Park Ave",
              "zipcode" : "10462"
          },
          "borough" : "Bronx",
          "cuisine" : "Bakery",
          "grades" : [
              {
                  "date" : ISODate("2014-03-03T00:00:00Z"),
                  "grade" : "A",
                  "score" : 2
              },
      ...
          ],
          "name" : "Morris Park Bake Shop",
          "restaurant_id" : "30075445"
      }
      

      Такая детальная проверка может выявить проблемы с содержанием документа, кодировкой и т. д. Формат json использует кодировку UTF-8, и ваши операции экспорта и импорта также должны использовать эту кодировку. Это необходимо помнить при редактировании файлов json вручную. В противном случае MongoDB автоматически сделает это за вас.

      Чтобы выйти из командной строки MongoDB, введите команду exit:

      Вы вернетесь в обычную командную строку как пользователь без привилегий root.

      Шаг 2 — Экспорт информации из MongoDB

      Как мы уже упоминали, при экспорте информации MongoDB вы можете получить удобный для чтения файлы с вашими данными. По умолчанию экспорт выполняется в формате json, но также вы можете использовать для экспорта формат csv (разделенные запятыми значения).

      Чтобы экспортировать информацию из MongoDB, используйте команду mongoexport. Это позволяет выполнять детализированный экспорт с указанием базы данных, коллекции, поля, или даже с использованием запроса для экспорта.

      Простой пример работы команды mongoexport — экспорт коллекции restaurants из базы данных newdb, куда мы ее до этого импортировали. Это можно сделать следующим образом:

      • sudo mongoexport --db newdb -c restaurants --out newdbexport.json

      В команде выше мы используем --db для определения базы данных, -c для определения коллекции и --out для определения файла, куда будут сохранены данные.

      Вывод успешной команды mongoexport должен выглядеть вот так:

      Output

      2020-11-11T19:39:57.595+0000 connected to: mongodb://localhost/ 2020-11-11T19:39:58.619+0000 [###############.........] newdb.restaurants 16000/25359 (63.1%) 2020-11-11T19:39:58.871+0000 [########################] newdb.restaurants 25359/25359 (100.0%) 2020-11-11T19:39:58.871+0000 exported 25359 records

      Этот вывод показывает, что было экспортировано 25359 документов, то есть, столько же документов, сколько мы импортировали.

      В некоторых случаях, вам может быть нужно экспортировать только часть коллекции. Учитывая структуру и содержание файла restaurants json, давайте экспортируем все рестораны китайской кухни, расположенные в Бронксе. Если мы хотим получить эту информацию напрямую при подключении к MongoDB, нам нужно снова подключиться к базе данных:

      Затем, используйте следующий запрос:

      • db.restaurants.find( { "borough": "Bronx", "cuisine": "Chinese" } )

      Результаты будут выведены на терминал:

      Output

      • 2020-12-03T01:35:25.366+0000 connected to: mongodb://localhost/
      • 2020-12-03T01:35:25.410+0000 exported 323 records

      Чтобы выйти из диалогового окна MongoDB, введите exit:

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

      • sudo mongoexport --db newdb -c restaurants -q "{"borough": "Bronx", "cuisine": "Chinese"}" --out Bronx_Chinese_retaurants.json

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

      Если экспорт выполнен успешно, результат будет выглядеть вот так:

      Output

      2020-11-11T19:49:21.727+0000 connected to: mongodb://localhost/ 2020-11-11T19:49:21.765+0000 exported 323 records

      Выше показано, что мы экспортировали 323 записи, которые можно будет найти в заданном нами файле Bronx_Chinese_retaurants.json.

      Используйте cat и less для сканирования данных:

      • cat Bronx_Chinese_retaurants.json | less

      Используйте пробел для прокрутки страниц данных:

      Output

      • date":{"$date":"2015-01-14T00:00:00Z"},"grade":"Z","score":36}],"na{"_id":{"$oid":"5fc8402d141f5e54f9054f8d"},"address":{"building":"1236","coord":[-73.8893654,40.81376179999999],"street":"238 Spofford Ave","zipcode":"10474"},"borough":"Bronx","cuisine":"Chinese","grades":[{"date":{"$date":"2013-12-30T00:00:00Z"},"grade":"A","score":8},{"date":{"$date":"2013-01-08T00:00:00Z"},"grade":"A","score":10},{"date":{"$date":"2012-06-12T00:00:00Z"},"grade":"B","score":15}],
      • . . .

      Нажмите q, чтобы выйти. Теперь вы можете импортировать и экспортировать базу данных MongoDB.

      Заключение

      В этом учебном модуле мы познакомили вас с основами экспорта информации из базы данных MongoDB и импорта информации в эту БД. Дополнительную информацию можно найти в учебном модуле Резервное копирование, восстановление и миграция базы данных MongoDB в Ubuntu 20.04.

      Также вы можете рассмотреть возможность использования репликации. Репликация позволяет продолжить выполнение службы MongoDB без перебоев на подчиненном сервере MongoDB во время восстановления главного сервера после неисправности. Частью процесса репликации является журнал операций (oplog), где записываются все операции, изменяющие данные. Вы можете использовать этот журнал, как если бы вы использовали двоичный журнал в MySQL для восстановления данных после последнего резервного копирования. Помните, что резервное копирование обычно выполняется ночью, и если вы решите восстановить данные вечером, вы потеряете все изменения, которые произошли с момента создания резервной копии.



      Source link

      Импорт существующих ресурсов DigitalOcean в Terraform


      Автор выбрал фонд Free and Open Source Fund для получения пожертвования в рамках программы Write for DOnations.

      Введение

      Terraform — созданный HashiCorp инструмент на базе модели «инфраструктура как код». Он помогает разработчикам эффективно развертывать, обновлять и удалять различные ресурсы инфраструктуры и обеспечивает поддержку масштабирования.

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

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

      Предварительные требования

      Шаг 1 — Локальная установка Terraform

      На первом шаге следует установить Terraform на локальный компьютер. На этом шаге описывается установка двоичного файла Linux. Если вы используете операционную систему Windows или Mac, вы можете воспользоваться страницей загрузки Terraform на сайте Terraform.

      Перейдите в папку на локальном компьютере, куда вы хотите загрузить Terraform, а затем используйте утилиту wget для загрузки двоичного файла Terraform 0.12.12:

      • cd /tmp
      • wget https://releases.hashicorp.com/terraform/0.12.12/terraform_0.12.12_linux_amd64.zip

      Чтобы проверить соответствие контрольной суммы sha256 указанному на сайте Terraform значению, загрузите файл контрольной суммы с помощью следующей команды:

      • wget -q https://releases.hashicorp.com/terraform/0.12.12/terraform_0.12.12_SHA256SUMS

      Затем запустите следующую команду для проверки контрольных сумм:

      • sha256sum -c --ignore-missing terraform_0.12.12_SHA256SUMS

      В загруженном вами файле SHA256SUMS содержится список имен файлов и значений хэш-сумм для этих файлов. Эта команда ищет локальный файл terraform_0.12.12_SHA256SUMS и проверяет соответствие хэш-сумм, используя флаг -c. Поскольку у этого файла имеется несколько имен файла, и указана его платформа, используйте флаг --ignore-missing для предотвращения ошибок, поскольку у вас нет копий других файлов.

      Вы увидите следующий результат:

      Output

      terraform_0.12.12_linux_amd64.zip: OK

      Используйте unzip для распаковки двоичного файла:

      • sudo unzip terraform_0.12.12_linux_amd64.zip -d /usr/local/bin/

      Убедитесь в правильности установки Terraform посредством проверки версии:

      Результат будет выглядеть примерно так:

      Output

      Terraform v0.12.12

      Мы установили Terraform на локальном компьютере и можем перейти к подготовке файлов конфигурации.

      Шаг 2 — Подготовка файлов конфигурации Terraform

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

      Запустите следующую команду для создания директории вашего проекта:

      • mkdir -p do_terraform_import

      Затем перейдите в эту директорию:

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

      ├── digitalocean_droplet.tf
      ├── digitalocean_firewall.tf
      └── provider.tf
      

      Для начала мы создадим файл provider.tf для определения токена доступа DigitalOcean как переменной среды вместо его программирования в конфигурации.

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

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

      Создайте файл provider.tf и откройте его для редактирования:

      Добавьте в файл provider.tf следующие строки:

      provider.tf

      variable "do_token" {}
      
      provider "digitalocean" {
          token   = "${var.do_token}"
          version = "1.9.1"
          }
      

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

      Далее мы создадим файл digitalocean_droplet.tf. Здесь мы указываем, какие ресурсы будем использовать. В данном случае это droplet.

      Создайте файл с помощью следующей команды:

      • nano digitalocean_droplet.tf

      Добавьте следующую конфигурацию:

      digitalocean_droplet.tf

      resource "digitalocean_droplet" "do_droplet" {
          name   = "testing-terraform"
          region = "fra1"
          tags   = ["terraform-testing"]
          count  = "1"
      }
      

      Здесь задается четыре параметра:

      • name: имя дроплета.

      • region: регион местонахождения дроплета.

      • tags: перечень всех тегов, применяемых к этому дроплету.

      • count: количество ресурсов, требуемых для этой конфигурации.

      Далее мы создадим файл конфигурации брандмауэра. Создайте файл digitalocean_firewall.tf с помощью следующей команды:

      • nano digitalocean_firewall.tf

      Добавьте в файл следующие строки:

      digitalocean_firewall.tf

      resource "digitalocean_firewall" "do_firewall" {
        name  = "testing-terraform-firewall"
        tags  = ["terraform-testing"]
        count = "1"
      }
      

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

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

      Теперь следует инициализировать эти изменения, чтобы у Terraform была возможность загрузить требуемые зависимости. Для этого используется команда terraform init, позволяющая инициализировать рабочую директорию с файлами конфигурации Terraform.

      Запустите в директории проекта следующую команду:

      Вывод должен выглядеть так:

      Output

      Terraform has been successfully initialized!

      Terraform успешно подготовил рабочую директорию, выполнив загрузку плагинов, поиск модулей и т. д. Теперь мы можем начать импорт ресурсов в Terraform.

      Шаг 3 — Импорт ресурсов в Terraform

      На этом шаге вы импортируете ресурсы DigitalOcean в Terraform. Используйте doctl для определения идентификационных номеров дроплетов, прежде чем начать импорт ресурсов. Также вы можете проверить конфигурацию импорта с помощью команд terraform show и terraform plan.

      Для начала экспортируйте токен доступа DigitalOcean как переменную среды, которая будет использоваться Terraform во время выполнения.

      Экспортируйте ее как переменную среды текущего сеанса оболочки с помощью следующей команды:

      • export DO_TOKEN="YOUR_TOKEN"

      Чтобы импортировать существующие дроплет и брандмауэр, вам потребуются их идентификационные номера. Вы можете использовать doctl, интерфейс командной строки DigitalOcean API. Запустите следующую команду для вывода списка дроплетов и получения доступа к их идентификаторам:

      • doctl compute droplet list

      Результат будет выглядеть примерно так:

      Output

      ID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image Status Tags Features Volumes DROPLET-ID DROPLET-NAME DROPLET-IPv4 1024 1 25 fra1 Ubuntu 18.04.3 (LTS) x64 active DROPLET-ID DROPLET-NAME DROPLET-IPv4 2048 1 50 fra1 Ubuntu 18.04.3 (LTS) x64 active DROPLET-ID DROPLET-NAME DROPLET-IPv4 1024 1 25 fra1 Ubuntu 18.04.3 (LTS) x64

      Теперь вы импортируете существующий дроплет и брандмауэр в Terraform:

      • terraform import -var "do_token=${DO_TOKEN}" digitalocean_droplet.do_droplet DROPLET_ID

      Мы используем флаг -var, чтобы задать токен доступа DigitalOcean, который вы ранее экспортировали в сеанс оболочки. Это требуется, чтобы DigitalOcean API мог проверить вашу личность и применить изменения к инфраструктуре.

      Теперь запустите эту же команду для вашего брандмауэра:

      • terraform import -var "do_token=${DO_TOKEN}" digitalocean_firewall.do_firewall FIREWALL_ID

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

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

      Вывод будет выглядеть следующим образом:

      Output

      . . . # digitalocean_droplet.do_droplet: resource "digitalocean_droplet" "do_droplet" { backups = false created_at = "2020-02-03T16:12:02Z" disk = 25 id = "DROPLET-ID" image = "DROPLET-IMAGE" ipv4_address = "DROPLET-IP" ipv6 = false locked = false memory = 1024 monitoring = false name = "testing-terraform-0" price_hourly = 0.00744 price_monthly = 5 private_networking = false region = "fra1" resize_disk = true size = "s-1vcpu-1gb" status = "active" tags = [ "terraform-testing", ] urn = "DROPLET-URN" vcpus = 1 volume_ids = [] . . . }

      В результатах вы увидите два ресурса совместно с атрибутами.

      После импорта дроплета и брандмауэра в состояние Terraform необходимо убедиться, что конфигурации представляют текущее состояние импортируемых ресурсов. Для этого следует указать образ Droplet и его размер. Эти два значения можно увидеть в результатах выполнения команды terraform show для ресурса digitalocean_droplet.do_droplet.

      Откройте файл digitalocean_droplet.tf:

      • nano digitalocean_droplet.tf

      В этом обучающем руководстве:

      • Образ операционной системы, используемый для нашего дроплета: ubuntu-16-04-x64.
      • Регион, где находится ваш дроплет: fra1.
      • Тег существующего дроплета: terraform-testing.

      Дроплет, импортированный с помощью конфигурации в digitalocean_droplet.tf, будет выглядеть следующим образом:

      digitalocean_droplet.tf

      resource "digitalocean_droplet" "do_droplet" {
          image   = "ubuntu-16-04-x64"
          name    = "testing-terraform"
          region  = "fra1"
          size    = "s-1vcpu-1gb"
          tags    = ["terraform-testing"]
      }
      

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

      Откройте файл digitalocean_firewall.tf:

      • nano digitalocean_firewall.tf

      Добавьте следующую конфигурацию:

      digitalocean_firewall.tf

      resource "digitalocean_firewall" "do_firewall" {
        name  = "testing-terraform-firewall"
        tags  = ["terraform-testing"]
        count = "1"
      
        inbound_rule {
            protocol                = "tcp"
            port_range              = "22"
            source_addresses        = ["0.0.0.0/0", "::/0"]
          }
        inbound_rule {
            protocol                = "tcp"
            port_range              = "80"
            source_addresses        = ["0.0.0.0/0", "::/0"]
          }
        inbound_rule {
            protocol                = "tcp"
            port_range              = "443"
            source_addresses        = ["0.0.0.0/0", "::/0"]
          }
      
        outbound_rule {
            protocol                = "tcp"
            port_range              = "all"
            destination_addresses   = ["0.0.0.0/0", "::/0"]
          }
        outbound_rule {
            protocol                = "udp"
            port_range              = "all"
            destination_addresses   = ["0.0.0.0/0", "::/0"]
          }
        outbound_rule {
            protocol                = "icmp"
            destination_addresses   = ["0.0.0.0/0", "::/0"]
          }
      }
      

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

      После обновления файлов Terraform используйте команду plan, чтобы увидеть, соответствуют ли внесенные изменения состоянию существующих ресурсов в DigitalOcean.

      Команда terraform plan используется для пробного прогона. С ее помощью вы можете проверить, соответствуют ли вносимые Terraform изменения желаемым. Эту команду всегда полезно запускать для подтверждения перед применением изменений.

      Запустите команду terraform plan со следующим синтаксисом:

      • terraform plan -var "do_token=$DO_TOKEN"

      Вы увидите следующие результаты:

      Output

      No changes. Infrastructure is up-to-date.

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

      Шаг 4 — Создание новых ресурсов через Terraform

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

      Откройте файл digitalocean_droplet.tf для добавления правил для новых дроплетов:

      • nano digitalocean_droplet.tf

      Добавьте в файл следующие строки:

      digitalocean_droplet.tf

      resource "digitalocean_droplet" "do_droplet" {
          image   = "ubuntu-16-04-x64"
          name    = "testing-terraform"
          region  = "fra1"
          size    = "s-1vcpu-1gb"
          tags    = ["terraform-testing"]
          count   = "1"
      }
      
      resource "digitalocean_droplet" "do_droplet_new" {
          image   = "ubuntu-18-04-x64"
          name    = "testing-terraform-${count.index}"
          region  = "fra1"
          size    = "s-1vcpu-1gb"
          tags    = ["terraform-testing"]
          count   = "2"
      }
      

      Вы используете мета-аргумент count, чтобы указать Terraform, сколько дроплетов с такими же спецификациями вам потребуется. Эти новые дроплеты также будут добавлены в брандмауэр, поскольку вы указываете тот же тег, что и для брандмауэра.

      Примените эти правила для проверки изменений, задаваемых в digitalocean_droplet.tf:

      • terraform plan -var "do_token=$DO_TOKEN"

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

      Результат будет выглядеть примерно так:

      Output

      . . . # digitalocean_droplet.do_droplet_new[1] will be created + resource "digitalocean_droplet" "do_droplet_new" { + backups = false + created_at = (known after apply) + disk = (known after apply) + id = (known after apply) + image = "ubuntu-18-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + ipv6_address_private = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "testing-terraform-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = true + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + tags = [ + "terraform-testing", ] + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) } Plan: 2 to add, 1 to change, 0 to destroy.

      Когда вы будете довольны результатами, используйте команду terraform apply для применения указанных изменений к состоянию конфигурации:

      • terraform apply -var "do_token=$DO_TOKEN"

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

      Output

      . . . digitalocean_droplet.do_droplet_new[1]: Creating... digitalocean_droplet.do_droplet_new[0]: Creating... digitalocean_firewall.do_firewall[0]: Modifying... [id=FIREWALL-ID] digitalocean_firewall.do_firewall[0]: Modifications complete after 1s [id=FIREWALL-ID] digitalocean_droplet.do_droplet_new[0]: Still creating... [10s elapsed] digitalocean_droplet.do_droplet_new[1]: Still creating... [10s elapsed] digitalocean_droplet.do_droplet_new[0]: Creation complete after 16s [id=DROPLET-ID] digitalocean_droplet.do_droplet_new[1]: Still creating... [20s elapsed] digitalocean_droplet.do_droplet_new[1]: Creation complete after 22s [id=DROPLET-ID] Apply complete! Resources: 2 added, 1 changed, 0 destroyed.

      Вы увидите два новых дроплета на веб-панели DigitalOcean: новые дроплеты

      Также вы увидите, что они прикреплены к существующему брандмауэру: существующий брандмауэр

      Вы создали с помощью Terraform новые ресурсы, использовав для этого имеющиеся ресурсы. На следующем шаге вы можете узнать, как уничтожить эти ресурсы.

      Шаг 5 — Уничтожение импортированных и созданных ресурсов (необязательно)

      На этом шаге мы уничтожим импортированные и созданные ресурсы посредством изменения конфигурации.

      Откройте digitalocean_droplet.tf:

      • nano digitalocean_droplet.tf

      Задайте в файле для параметра count значение 0, как показано здесь:

      digitalocean_droplet.tf

      resource "digitalocean_droplet" "do_droplet" {
          image   = "ubuntu-16-04-x64"
          name    = "testing-terraform"
          region  = "fra1"
          size    = "s-1vcpu-1gb"
          tags    = ["terraform-testing"]
          count   = "0"
      }
      
      resource "digitalocean_droplet" "do_droplet_new" {
          image   = "ubuntu-18-04-x64"
          name    = "testing-terraform-${count.index}"
          region  = "fra1"
          size    = "s-1vcpu-1gb"
          tags    = ["terraform-testing"]
          count   = "0"
      }
      

      Сохраните и закройте файл.

      Откройте файл конфигурации брандмауэра и измените в нем параметр count:

      • nano digitalocean_firewall.tf

      Задайте для параметра count значение 0, как в следующей строке:

      digitalocean_firewall.tf

      resource "digitalocean_firewall" "do_firewall" {
        name  = "testing-terraform-firewall"
        tags  = ["terraform-testing"]
        count = "0"
      
        inbound_rule {
            protocol                = "tcp"
            port_range              = "22"
            source_addresses        = ["0.0.0.0/0", "::/0"]
          }
        inbound_rule {
            protocol                = "tcp"
            port_range              = "80"
            source_addresses        = ["0.0.0.0/0", "::/0"]
          }
        inbound_rule {
            protocol                = "tcp"
            port_range              = "443"
            source_addresses        = ["0.0.0.0/0", "::/0"]
          }
      
        outbound_rule {
            protocol                = "tcp"
            port_range              = "all"
            destination_addresses   = ["0.0.0.0/0", "::/0"]
          }
        outbound_rule {
            protocol                = "udp"
            port_range              = "all"
            destination_addresses   = ["0.0.0.0/0", "::/0"]
          }
        outbound_rule {
            protocol                = "icmp"
            destination_addresses   = ["0.0.0.0/0", "::/0"]
          }
      }
      

      Сохраните и закройте файл.

      Примените изменения с помощью следующей команды:

      • terraform apply -var "do_token=${DO_TOKEN}"

      Terraform предложит подтвердить уничтожение дроплетов и брандмауэра. Эта команда уничтожит все ресурсы, импортированные и созданные с помощью Terraform, так что вводите yes, только если уверены, что хотите продолжить.

      Результат будет выглядеть примерно так:

      Output

      . . . digitalocean_droplet.do_droplet[0]: Destroying... [id=YOUR-DROPLET-ID]] digitalocean_droplet.do_droplet_new[0]: Destroying... [id=YOUR-DROPLET-ID] digitalocean_droplet.do_droplet_new[1]: Destroying... [id=YOUR-DROPLET-ID] digitalocean_firewall.do_firewall[0]: Destroying... [id=YOUR-FIREWALL-ID] digitalocean_firewall.do_firewall[0]: Destruction complete after 1s digitalocean_droplet.do_droplet_new[1]: Still destroying... [id=YOUR-DROPLET-ID, 10s elapsed] digitalocean_droplet.do_droplet[0]: Still destroying... [id=YOUR-DROPLET-ID, 10s elapsed] digitalocean_droplet.do_droplet_new[0]: Still destroying... [id=YOUR-DROPLET-ID, 10s elapsed] digitalocean_droplet.do_droplet_new[1]: Still destroying... [id=YOUR-DROPLET-ID, 20s elapsed] digitalocean_droplet.do_droplet_new[0]: Still destroying... [id=YOUR-DROPLET-ID, 20s elapsed] digitalocean_droplet.do_droplet[0]: Still destroying... [id=YOUR-DROPLET-ID, 20s elapsed] digitalocean_droplet.do_droplet_new[1]: Destruction complete after 22s digitalocean_droplet.do_droplet[0]: Destruction complete after 22s digitalocean_droplet.do_droplet_new[0]: Destruction complete after 22s Apply complete! Resources: 0 added, 0 changed, 4 destroyed.

      Вы удалили все ресурсы, управляемые Terraform. Это полезный рабочий процесс для удаления ненужных ресурсов или в случае уменьшения масштаба.

      Заключение

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

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



      Source link

      Импорт пакетов в Go


      Введение

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

      В этом обучающем руководстве вы научитесь выполнять установку, импорт и присвоение имен пакетов.

      Пакеты стандартной библиотеки

      Стандартная библиотека, входящая в комплект Go, представляет собой набор пакетов. Эти пакеты содержат множество фундаментальных компонентов для современного программного обеспечения. Например, пакет fmt содержит базовые функции для форматирования и вывода строк. Пакет net/http содержит функции, позволяющие разработчику создавать веб-службы, отправлять и получать данные по протоколу http и т. д.

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

      Например, в файле программы Go с именем random.go вы можете импортировать пакет math/rand для генерирования случайных чисел с помощью следующей команды:

      random.go

      import "math/rand"
      

      При импорте пакета мы делаем его доступной в текущей программе в качестве отдельного пространства имен. Это означает, что мы будем ссылаться на функцию в точечной нотации, например package.function.

      На практике функция из пакета math/rand может выглядеть, как показано в этих примерах:

      • rand.Int() вызывает функцию, возвращающую случайное целое число.
      • rand.Intn() вызывает функцию, возвращающую случайный элемент от 0 до заданного числа.

      Создадим цикл for, показывающий, как мы вызываем функцию пакета math/rand в нашей программе random.go:

      random.go

      package main
      
      import "math/rand"
      
      func main() {
        for i := 0; i < 10; i++ {
          println(rand.Intn(25))
        }
      }
      

      Вначале программа импортирует пакет math/rand в третьей строке, а затем переходит к циклу for, который выполняется 10 раз. В этом цикле программа выводит случайное целое число в диапазоне от 0 до 25. Целое число 25 передается функции rand.Intn() как параметр.

      При запуске программы с помощью команды go run random.go мы получаем 10 случайных чисел. Поскольку это случайные числа, они скорее всего будут разными при каждом запуске программы. Результат будет выглядеть примерно так:

      Output

      6 12 22 9 6 18 0 15 6 0

      Выводимые целые числа никогда не будут меньше 0 или больше 24.

      При импорте нескольких пакетов вы можете использовать () для создания блока. Используя блоки, вы можете не повторять ключевое слово import на каждой строчке. Так ваш код будет выглядеть лучше:

      random.go

      
      import (
        "fmt"
        "math/rand"
      )
      

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

      random.go

      package main
      
      import (
        "fmt"
        "math/rand"
      )
      
      func main() {
        for i := 0; i < 10; i++ {
          fmt.Printf("%d) %dn", i, rand.Intn(25))
        }
      }
      

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

      Output

      0) 6 1) 12 2) 22 3) 9 4) 6 5) 18 6) 0 7) 15 8) 6 9) 0

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

      Установка пакетов

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

      Цепочка инструментов Go содержит команду go get. Эта команда позволяет устанавливать сторонние пакеты в локальную среду разработки и использовать их в вашей программе.

      При использовании go get для установки сторонних пакетов часто используется канонический путь пакета. Это может быть путь к публичному проекту, размещенному в таком хранилище кода, как GitHub. Если вы захотите импортировать пакет flect, вы используете полный канонический путь:

      • go get github.com/gobuffalo/flect

      Инструмент go get найдет пакет на GitHub и установит его в каталог $GOPATH.

      В этом примере код будет устанавливаться в следующий каталог:

      $GOPATH/src/github.com/gobuffalo/flect
      

      Авторы часто обновляют пакеты, устраняя ошибки и добавляя новые возможности. В этом случае вам нужно использовать последнюю версию пакета для применения новых функций или устранения ошибок. Для обновления пакета вы можете использовать флаг -u с командой go get:

      • go get -u github.com/gobuffalo/flect

      Эта команда также установит пакет в Go, если он отсутствует в локальной среде. Если пакет уже установлен, Go попытается обновить его до последней версии.

      Команда go get всегда получает последнюю доступную версию пакета. Однако возможны обновления предыдущих версий пакета, которые все равно новее используемых, и поэтому программу будет полезно обновить. Чтобы получить определенную версию пакета, вам потребуется инструмент для управления пакетами, например Go Modules.

      В версии Go 1.11 модули Go используются для определения версии пакета, которую вы хотите импортировать. В настоящей статье мы не рассматриваем тему управления пакетами, но вы можете прочитать об этом на странице Go Modules на GitHub.

      Присвоение имен импортируемым пакетам

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

      Данное выражение выглядит следующим образом:

      import another_name "package"
      

      В этом примере мы изменяем имя пакета fmt в файле программы random.go. Мы изменим имя пакета fmt на f для сокращения. Измененная программа будет выглядеть следующим образом:

      random.go

      package main
      
      import (
       f "fmt"
        "math/rand"
      )
      
      func main() {
        for i := 0; i < 10; i++ {
          f.Printf("%d) %dn", i, rand.Intn(25))
        }
      }
      

      Теперь внутри программы мы ссылаемся на функцию Printf как на f.Printf, а не на fmt.Printf.

      В других языках изменение имен пакетов поощряется для упрощения их использования в программе, в Go дела обстоят иначе. Например, изменение имени пакета fmt на f не будет соответствовать указаниям руководства по стилю.

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

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

      Форматирование при импорте

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

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

      Здесь показано, как может выглядеть блок импорта до форматирования:

      import (
        "fmt"
        "os"
        "github.com/digital/ocean/godo"
        "github.com/sammy/foo"
        "math/rand"
        "github.com/sammy/bar"
      )
      

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

      import (
        "fmt"
        "math/rand"
        "os"
      
        "github.com/sammy/foo"
        "github.com/sammy/bar"
      
        "github.com/digital/ocean/godo"
      )
      

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

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

      Заключение

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

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



      Source link