{"id":26194108,"url":"https://github.com/fl64/trytravisrepo","last_synced_at":"2026-02-19T14:31:17.059Z","repository":{"id":113954270,"uuid":"129390983","full_name":"fl64/trytravisrepo","owner":"fl64","description":"TravisCI test repo","archived":false,"fork":false,"pushed_at":"2018-04-13T16:35:59.000Z","size":55,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"ansible-3","last_synced_at":"2025-10-19T23:52:42.832Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"HCL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fl64.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-04-13T11:09:22.000Z","updated_at":"2018-04-13T16:36:00.000Z","dependencies_parsed_at":null,"dependency_job_id":"7762c409-98eb-4fac-8f66-92d6352bef8e","html_url":"https://github.com/fl64/trytravisrepo","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/fl64/trytravisrepo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fl64%2Ftrytravisrepo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fl64%2Ftrytravisrepo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fl64%2Ftrytravisrepo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fl64%2Ftrytravisrepo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fl64","download_url":"https://codeload.github.com/fl64/trytravisrepo/tar.gz/refs/heads/ansible-3","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fl64%2Ftrytravisrepo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29618234,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-19T13:04:20.082Z","status":"ssl_error","status_checked_at":"2026-02-19T13:03:33.775Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-12T01:55:06.698Z","updated_at":"2026-02-19T14:31:17.025Z","avatar_url":"https://github.com/fl64.png","language":"HCL","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Table of content\n\n\n\n- [Table of content](#table-of-content)\n- [4. Homework-4: Intro in GCP](#4-homework-4-intro-in-gcp)\n    - [4.1 Description](#41-description)\n    - [4.2 Homework](#42-homework)\n    - [4.3 Additional homework](#43-additional-homework)\n- [5. Homework-5: Deploy if the test app](#5-homework-5-deploy-if-the-test-app)\n    - [5.1 Description](#51-description)\n    - [5.2 What was done](#52-what-was-done)\n    - [5.3 Description of startup parameters](#53-description-of-startup-parameters)\n    - [5.4 How to check](#54-how-to-check)\n    - [5.5 How do remove](#55-how-do-remove)\n- [6. Homework-6: Packer](#6-homework-6-packer)\n    - [6.1 What was done](#61-what-was-done)\n    - [6.2 How to run the project](#62-how-to-run-the-project)\n        - [6.2.1 hw6-Base](#621-hw6-base)\n        - [6.2.2 hw6--](#622-hw6-)\n    - [6.3 How to check](#63-how-to-check)\n- [7. Homework-7: Terraform](#7-homework-7-terraform)\n    - [7.1 What was done](#71-what-was-done)\n    - [7.2 How to run the project](#72-how-to-run-the-project)\n    - [7.3 How to check](#73-how-to-check)\n- [8. Homework-8: Terraform-2](#8-homework-8-terraform-2)\n    - [8.1 What was done](#81-what-was-done)\n    - [8.2 Brief description of the solution ](#82-Brief-description-of-the-solution)\n    - [8.3 How to run the project](#83-how-to-run-the-project)\n    - [8.4 How to check](#84-how-to-check)\n- [9. Homework-9: Ansible-1](#9-homework-9-ansible-1)\n    - [9.1 What was done](#91-what-was-done)\n    - [9.2 How to run the project](#92-how-to-run-the-project)\n    - [9.3 How to check](#93-how-to-check)\n- [10. Homework-10: Ansible-2](#10-homework-10-ansible-2)\n    - [10.1 What was done](#101-what-was-done)\n    - [10.2 Brief description of the solution ](#102-Brief-description-of-the-solution)\n    - [10.3 How to run the project](#103-how-to-run-the-project)\n    - [10.4 How to check](#104-how-to-check)\n\n# 4. Homework-4: Intro in GCP\n\n## 4.1 Description\n\nbastion_IP = 35.204.252.224\n\nsomeinternalhost_IP = 10.164.0.3\n\nДетальное описание:\n\n- Host: bastion\n    - Ext ip: 35.204.252.224\n    - Int ip: 10.164.0.2\n\n- Host: someinternalhost\n    - Ext ip: none\n    - Int ip: 10.164.0.3\n\n## 4.2 Homework\n\n\u003e Исследовать способ подключения к someinternalhost в одну команду из вашего рабочего устройства,  проверить работоспособность найденного решения и внести его в README.md\n\u003e в вашем репозитории\n\nВарианты выполнения:\n\n```shell\nssh -i ~/.ssh/appuser -A -t appuser@35.204.252.224 ssh 10.164.0.3\n```\nРезультат:\n\n![](https://i.imgur.com/eB8WmVF.png)\n\n```shell\nssh -i ~/.ssh/appuser -J appuser@35.204.252.224 appuser@10.164.0.3\n```\nРезультат:\n\n![](https://i.imgur.com/Uq5WydF.png)\n\n## 4.3 Additional homework\n\n\u003e **Доп. задание: ** Предложить вариант решения для подключения из консоли при помощи команды вида ssh internalhost из локальной консоли рабочего устройства, чтобы подключение выполнялось по алиасу internalhost и внести его в README.md в вашем репозитории\n\nДобавиьт следующие варианты в ~/.ssh/config\n\n```\nHost bastion\n    HostName 35.204.252.224\n    User appuser\n    Port 22\n    ForwardAgent yes\n    AddKeysToAgent yes\n    IdentityFile ~/.ssh/appuser\n\nHost someinternalhost\n    User appuser\n    Hostname 10.164.0.3\n    Port 22\n    ProxyJump bastion\n    ForwardAgent Yes\n\n```\n\nПроверка:\n```shell\nssh someinternalhost\n```\n\nРезультат:\n\n![](https://i.imgur.com/abzl05D.png)\n\n# 5. Homework-5: Deploy if the test app\n\n## 5.1 Description\n\ntestapp_IP = 35.204.89.147\n\ntestapp_port = 9292\n\n## 5.2 What was done\n- перенесены скритпы установки и конфиги VPN в каталог VPN\n- созданы скрипты установки и настройки приложения (install_rubby.sh, install_mongodb.sh, deploy.sh)\n- создан скрипт startup.sh для автоматической установки и настройки приложения при развертывании VM\n- Создана VM reddit-app\n- Назначен статический-ip\n\n## 5.3 Description of startup parameters\n\nПерейти в корень репозитория fl64_infra.\n\nСоздание VM:\n```\ngcloud compute instances create reddit-app\\\n  --boot-disk-size=10GB \\\n  --image-family ubuntu-1604-lts \\\n  --image-project=ubuntu-os-cloud \\\n  --machine-type=g1-small \\\n  --tags puma-server \\\n  --restart-on-failure \\\n  --metadata-from-file startup-script=startup.sh\n```\n\nили\n\n```\ngcloud compute instances create reddit-app\\\n  --boot-disk-size=10GB \\\n  --image-family ubuntu-1604-lts \\\n  --image-project=ubuntu-os-cloud \\\n  --machine-type=g1-small \\\n  --tags puma-server \\\n  --restart-on-failure\n  --metadata startup-script-url=https://gist.githubusercontent.com/fl64/e1b838ebe8e142d449ef4435e7a43ff7/raw/676c9fe32b17541a63b80398779ec1bf42fa5bbb/startup.sh\n\n```\n\nСоздание правил МЭ:\n```\ngcloud compute firewall-rules create default-puma-server \\\n  --allow=tcp:9292 \\\n  --target-tags=puma-server \\\n  --description=\"Allow access to puma server\"\n```\n\n\n## 5.4 How to check\n\nВ веб-браузере перейти по адресу http://35.204.89.147:9292, в окне браузера отобразится интерфейс приложения.\n\n## 5.5 How do remove\n\nУдаление VM\n```\ngcloud compute instances delete reddit-app\n```\n\nУдаление правила МЭ\n```\ngcloud compute firewall-rules delete default-puma-server\n\n```\n\n# 6. Homework-6: Packer\n## 6.1 What was done\n- созданные в hw6 скрипты перенесены в каталог config-scripts\n- создан каталог packer для шаблона ubuntu16.json и подкаталог scripts для скриптов установки сервисов и приложений\n- в соотвествии с заданием параметризованы переменные создания шаблона ВМ\n\nВ рамках задания со *:\n- создан шабаблон ВМ reddit-full (packer/immutable.json)\n- создан скрипт packer/scripts/deploy.sh для деплоя приложения\n- создан скрипт запуска ВМ (config-scripts/create-reddit-vm.sh)\n\n## 6.2 How to run the project\n### 6.2.1 hw6-Base\n- Запустить создание шаблона:\n```\ncd packer\npacker validate ubuntu16.json\npacker build ubuntu16.json\n```\nдоп задание:\n```\ncd packer\npacker validate \\\n       -var 'prj_id=infra-198313' \\\n       -var 'src_img_fam=ubuntu-1604-lts' \\\n       ubuntu16.json\npacker build \\\n       -var 'prj_id=infra-198313' \\\n       -var 'src_img_fam=ubuntu-1604-lts' \\\n       ubuntu16.json\n\nили\n\npacker validate -var-file=variables.json ubuntu16.json\npacker build -var-file=variables.json ubuntu16.json\n```\n- Создать правила для МЭ (если отсуствуют)\n```\ngcloud compute firewall-rules create default-puma-server \\\n  --allow=tcp:9292 \\\n  --target-tags=puma-server \\\n  --description=\"Allow access to puma server\"\n```\n- Создать ВМ:\n![](https://i.imgur.com/1gVdBKJ.png)\n- Задеплоить приложение\n```\ncd\nssh appuser@35.204.252.224 \"bash -s\" \u003c config-scripts/deploy.sh\n```\n- Done!\n\n### 6.2.2 hw6-*\n\n- Запустить создание шаблона:\n```\ncd packer\npacker validate -var 'prj_id=infra-198313' -var 'src_img_fam=ubuntu-1604-lts' immutable.json\npacker build -var 'prj_id=infra-198313' -var 'src_img_fam=ubuntu-1604-lts' immutable.json\n```\n- Создать и запустить ВМ (при создании ВМ спользуется последний из соданных шаблонов reddit-full):\n```\nconfig-scripts/create-reddit-vm.sh\n```\n\n## 6.3 How to check\nС использованием веб-браузера перейти по адресу http://внешний-адрес-ВМ:9292 (Например: https://35.204.252.224:9292 ).\nВ окне веб браузера отобразится установленное приложение.\n\n# 7. Homework-7: Terraform\n## 7.1 What was done\n- создан каталог terraform\n- в нем созданы конфигурации *.tf для автоматизированного развертывания ВМ с приложением в облаке GCP\n\nВ рамках задания со *:\n- в конфиг main.tf добавлена возможность добавления ssh-ключей в метаданные проекта\n- создан конфиг lb.tf для создания группы ресурсов и баллансировщика нагрузки\n\n## 7.2 How to run the project\n\n- создать файл terraform.tfvars и задать в нем значения переменных tf  (пример заполнения в terraform.tfvars.example);\n- выполнить `terraform plan`, убедится в отсутствии ошибок;\n- выполнить `terraform apply`\n- Done!\n\n## 7.3 How to check\n\nВыполнтиь `terraform output lb_external_ip`\n\nС использованием веб-браузера перейти по адресу указанному в выводе команды.\nВ окне веб браузера отобразится установленное приложение.\n\n# 8. Homework-8: Terraform-2\n## 8.1 What was done\n- созданы два описания конфигурации образа для packer (app.json, db.json)\n- созданы 2 конфигурации TF для приложения и БД;\n- конфигурация и деплой приложения и бд, а также сетевые настройки предаставлены в виде модулей (app, db, vpc);\n- созданы два окружения **stage** (доступный с ограниченного числа IP-адресов), и **prod**, доступный всем;\n- создана когфигурация storage-bucket.tf для создания бакетов в GCS;\n\nВ рамках задания со *:\n- состояние TF хранится в созданном бакете **fl64-terraform-backend** и описано в файле backend.tf\n- для модулей добавлены возможность провизионинга, которая выполняется в зависимости от значения переменной deply (true\\false), значение по умолчанию которой = false\n\n## 8.2 Brief description of the solution\n\nПровизион выполняется в зависимости от значения переменной deploy, условие запуска провизионинга выполнено в виде ресурса null_resource\n\n```\nresource \"null_resource\" \"app\" {\n  count = \"${var.deploy ? 1 : 0}\"\n\n  triggers {\n    cluster_instance_ids = \"${join(\",\", google_compute_instance.app.*.id)}\"\n  }\n\n  connection {\n    host = \"${element(google_compute_instance.app.*.network_interface.0.access_config.0.assigned_nat_ip, 0)}\"\n    type        = \"ssh\"\n    user        = \"appuser\"\n    private_key = \"${file(var.private_key_path)}\"\n  }\n\n  provisioner \"file\" {\n\n    content     = \"${data.template_file.reddit_app_service.rendered}\"\n    destination = \"/tmp/puma.service\"\n  }\n  provisioner \"remote-exec\" {\n    script = \"${path.module}/files/deploy.sh\"\n  }\n}\n\n```\n\n## 8.3 How to run the project\n\n- cd $GITREPO/packer\n  - выполнить `packer build -var-file=variables.json app.json`\n  - выполнить `packer build -var-file=variables.json db.json`\n- cd $GITREPO/terraform/{prod,stage}\n  - для stage в **main.tf** необходио задать значние source_ranges = [\"внешний-IP\"], где внешний ip получаем выполняя `curl ifconfig.co`\n  - выполняем `terraform init` для установки нужных модулей и провайдеров, можно просто `terraform get` в случае если провайдеры уже установлены.\n  - создать файл terraform.tfvars и задать в нем значения переменных tf  (пример заполнения в terraform.tfvars.example);\n  - выполнить `terraform plan`, убедится в отсутствии ошибок;\n  - выполнить `terraform apply`\n- Done!\n\nпри единовременном запуске `terraform apply`, в stage и prod из-за блокировки tflock запустится тольк один процесс установки\n\n## 8.4 How to check\n\nВыполнтиь `terraform output app_external_ip`\n\nС использованием веб-браузера перейти по адресу указанному в выводе команды.\nВ окне веб браузера отобразится установленное приложение.\n\n# 9. Homework-9: Ansible-1\n## 9.1 What was done\n- создан каталог ansible\n- созданы файл конфигурации и инвентори файлы (ini, yml, json*) для ansible\n\nВ рамках задания со *:\n- создан скрипт на bash позволяющий передать json-inventory в ansible\n\n## 9.2 How to run the project\n\n- cd $GIT_REPO_ROOT/terraform/stage\n  - выполнить `curl ifconfig.me`\n  - добавить IP-адрес из вывода предыдущей команды в main.tf (переменна source_ranges = [\"xxx.xxx.xxx.xxx\"])\n  - выполнить `terraform apply`\n- cd $GIT_REPO_ROOT/ansible/stage\n  - выполнить `ansible all -m ping`\n  - выполнить `ansible all -m ping -i ./inventory`\n  - выполнить `ansible all -m ping -i ./inventory.yml`\n  - выполнить `ansible all -m ping -i ./showmejson.sh`\n- Done!\n\n## 9.3 How to check\n\nРезульататы выполнения ansible должны показать нечто похожее:\n\n```\n[user@default ~/git/fl64_infra/ansible]$ ansible all -m ping\ndbserver | SUCCESS =\u003e {\n    \"changed\": false,\n    \"ping\": \"pong\"\n}\nappserver | SUCCESS =\u003e {\n    \"changed\": false,\n    \"ping\": \"pong\"\n}\n\n```\nОшибки отсутствуют.\n\n# 10. Homework-10: Ansible-2\n## 10.1 What was done\n- в соотвествии с заданием созданы плейбуки:\n  - reddit_app_one_play.yml\n  - reddit_app_multiple_play.yml\n  - {app,db,deploy}.yml + site.yml\n  - packer_{app,db}.yml\n- в конфиги пакера добавлена возможность установки софта из созданных плейбуков\n\nВ рамках задания со *:\n- создан инвентори-скрипт для получения данных об инстансах GCP\n\n## 10.2 Brief description of the solution\n\nЗадание со *.\nДля работы инвентори-скрипта необходимо:\n- наличие установленного пакета GCP SDK\n- аутентифкация в GCP: `gcloud auth login`\n\nСледуя рекомендации не зацикливаться на gce.py и в соотествии с принципами YAGNI\\KISS, был разработан простой инвентори-скрипт на питоне. Краткое описание его работы:\n- с ипользованием gcloud запрашивается запущенные инстаннсы в формате json.\n- данные парсятся и добавляются в sqlite базу, с целью упрощения дальнейшей выборки\n- формируется словарь с инстансами и значениями переменной ansible_host(белый адрес хоста), int_ip (локальный адрес хоста \\ прикручивать который к плейбуку в итоге не стал)\n- название группы в ansible inventory формируется из тега GCP (берется второе слово после \"-\"), поэтому из этого вытекают правила формирования тегов (приложение-типинстанса)\n\nТ.к. с этим скриптом не проходят чеки TravisCI, пришлось в ansible.cfg оставить ссылку на стаический инвентори файл.\n\nДля запуска необходимо выполнить: `ansible-playbook -i ./my_gcp_inv.py site.yml`\n\n## 10.3 How to run the project\n\n- cd $GIT_REPO_ROOT\n  - выполнить `packer build -var-file=packer/variables.json packer/app.json`\n  - выполнить `packer build -var-file=packer/variables.json packer/db.json`\n- cd $GIT_REPO_ROOT/terraform/stage\n  - для stage в **main.tf** необходио задать значние source_ranges = [\"внешний-IP\"], где внешний ip получаем выполняя `curl ifconfig.co`\n  - выполнить `terraform apply`\n- cd $GIT_REPO_ROOT/ansible\n  - выполнить `ansible-playbook site.yml`\n- Done!\n\n## 10.4 How to check\n\nВыполнтиь `terraform output app_external_ip`\n\nС использованием веб-браузера перейти по адресу указанному в выводе команды.\nНапример: http://35.204.131.204:9292\nВ окне веб браузера отобразится установленное приложение.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffl64%2Ftrytravisrepo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffl64%2Ftrytravisrepo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffl64%2Ftrytravisrepo/lists"}