From 55d1ac16d4cfed42dc638cc34f0e85c33c2d67e3 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sun, 12 Feb 2023 11:53:31 +0400 Subject: [PATCH 001/146] Update README.md --- 08-ansible-01-base/playbook/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/08-ansible-01-base/playbook/README.md b/08-ansible-01-base/playbook/README.md index e2a380aef..f8e4d8cc6 100644 --- a/08-ansible-01-base/playbook/README.md +++ b/08-ansible-01-base/playbook/README.md @@ -1,11 +1,20 @@ # Самоконтроль выполненения задания 1. Где расположен файл с `some_fact` из второго пункта задания? +./group_vars/all/examp.yml 2. Какая команда нужна для запуска вашего `playbook` на окружении `test.yml`? +ansible-playbook -i inventory/test.yml site.yml 3. Какой командой можно зашифровать файл? +ansible-vault encrypt 4. Какой командой можно расшифровать файл? +ansible-vault decrypt 5. Можно ли посмотреть содержимое зашифрованного файла без команды расшифровки файла? Если можно, то как? +ansible-vault view 6. Как выглядит команда запуска `playbook`, если переменные зашифрованы? +ansible-playbook --ask-vault-pass playbook.yml 7. Как называется модуль подключения к host на windows? +winrm 8. Приведите полный текст команды для поиска информации в документации ansible для модуля подключений ssh +ansible-doc -t connection ssh 9. Какой параметр из модуля подключения `ssh` необходим для того, чтобы определить пользователя, под которым необходимо совершать подключение? +remote_user From 9c26707fc381df693d6c5ab47e694eff8867cf02 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sun, 12 Feb 2023 11:54:43 +0400 Subject: [PATCH 002/146] Update README.md --- 08-ansible-01-base/playbook/README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/08-ansible-01-base/playbook/README.md b/08-ansible-01-base/playbook/README.md index f8e4d8cc6..89948721b 100644 --- a/08-ansible-01-base/playbook/README.md +++ b/08-ansible-01-base/playbook/README.md @@ -1,20 +1,20 @@ # Самоконтроль выполненения задания 1. Где расположен файл с `some_fact` из второго пункта задания? -./group_vars/all/examp.yml +# ./group_vars/all/examp.yml 2. Какая команда нужна для запуска вашего `playbook` на окружении `test.yml`? -ansible-playbook -i inventory/test.yml site.yml +# ansible-playbook -i inventory/test.yml site.yml 3. Какой командой можно зашифровать файл? -ansible-vault encrypt +# ansible-vault encrypt 4. Какой командой можно расшифровать файл? -ansible-vault decrypt +# ansible-vault decrypt 5. Можно ли посмотреть содержимое зашифрованного файла без команды расшифровки файла? Если можно, то как? -ansible-vault view +# ansible-vault view 6. Как выглядит команда запуска `playbook`, если переменные зашифрованы? -ansible-playbook --ask-vault-pass playbook.yml +# ansible-playbook --ask-vault-pass playbook.yml 7. Как называется модуль подключения к host на windows? -winrm +# winrm 8. Приведите полный текст команды для поиска информации в документации ansible для модуля подключений ssh -ansible-doc -t connection ssh +# ansible-doc -t connection ssh 9. Какой параметр из модуля подключения `ssh` необходим для того, чтобы определить пользователя, под которым необходимо совершать подключение? -remote_user +# remote_user From 8698e18872d51f8ccc1986e40aafe5ea3477daa7 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Wed, 15 Feb 2023 20:26:52 +0400 Subject: [PATCH 003/146] Create docker-compose.yml --- 08-ansible-01-base/docker-compose.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 08-ansible-01-base/docker-compose.yml diff --git a/08-ansible-01-base/docker-compose.yml b/08-ansible-01-base/docker-compose.yml new file mode 100644 index 000000000..8acea8e2a --- /dev/null +++ b/08-ansible-01-base/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3' +services: + centos7: + image: pycontribs/centos:7 + container_name: centos7 + restart: unless-stopped + entrypoint: "sleep infinity" + + ubuntu: + image: pycontribs/ubuntu + container_name: ubuntu + restart: unless-stopped + entrypoint: "sleep infinity" + + fedora: + image: pycontribs/fedora + container_name: fedora + restart: unless-stopped + entrypoint: "sleep infinity" From ac832ed641a0c60cdb5d27c91b92575d1c75d045 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Wed, 15 Feb 2023 21:12:18 +0400 Subject: [PATCH 004/146] Update README.md --- 08-ansible-01-base/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/08-ansible-01-base/README.md b/08-ansible-01-base/README.md index 1519ea5e5..95f9fad73 100644 --- a/08-ansible-01-base/README.md +++ b/08-ansible-01-base/README.md @@ -2,13 +2,19 @@ ## Подготовка к выполнению 1. Установите ansible версии 2.10 или выше. +![Иллюстрация к ДЗ](https://i.imgur.com/BUeH8km.png) 2. Создайте свой собственный публичный репозиторий на github с произвольным именем. +https://github.com/NamorNinayzuk/mnt-homeworks/edit/MNT-video/08-ansible-01-base 3. Скачайте [playbook](./playbook/) из репозитория с домашним заданием и перенесите его в свой репозиторий. ## Основная часть 1. Попробуйте запустить playbook на окружении из `test.yml`, зафиксируйте какое значение имеет факт `some_fact` для указанного хоста при выполнении playbook'a. +![Иллюстрация к ДЗ](https://i.imgur.com/TMn7fmE.png) 2. Найдите файл с переменными (group_vars) в котором задаётся найденное в первом пункте значение и поменяйте его на 'all default fact'. +![Иллюстрация к ДЗ](https://i.imgur.com//prqbQsl.png) +![Иллюстрация к ДЗ](https://i.imgur.com//0ofOvB1.png) 3. Воспользуйтесь подготовленным (используется `docker`) или создайте собственное окружение для проведения дальнейших испытаний. +![Иллюстрация к ДЗ](https://i.imgur.com//0rGqtc4.png) 4. Проведите запуск playbook на окружении из `prod.yml`. Зафиксируйте полученные значения `some_fact` для каждого из `managed host`. 5. Добавьте факты в `group_vars` каждой из групп хостов так, чтобы для `some_fact` получились следующие значения: для `deb` - 'deb default fact', для `el` - 'el default fact'. 6. Повторите запуск playbook на окружении `prod.yml`. Убедитесь, что выдаются корректные значения для всех хостов. From 758fe6942dd399b5c98eaf78763eb9256fe29501 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 16 Feb 2023 23:15:18 +0400 Subject: [PATCH 005/146] Update README.md --- 08-ansible-01-base/README.md | 54 ++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/08-ansible-01-base/README.md b/08-ansible-01-base/README.md index 95f9fad73..4e6709219 100644 --- a/08-ansible-01-base/README.md +++ b/08-ansible-01-base/README.md @@ -17,13 +17,57 @@ https://github.com/NamorNinayzuk/mnt-homeworks/edit/MNT-video/08-ansible-01-base ![Иллюстрация к ДЗ](https://i.imgur.com//0rGqtc4.png) 4. Проведите запуск playbook на окружении из `prod.yml`. Зафиксируйте полученные значения `some_fact` для каждого из `managed host`. 5. Добавьте факты в `group_vars` каждой из групп хостов так, чтобы для `some_fact` получились следующие значения: для `deb` - 'deb default fact', для `el` - 'el default fact'. +![Иллюстрация к ДЗ](https://i.imgur.com//cBWAHiz.png) 6. Повторите запуск playbook на окружении `prod.yml`. Убедитесь, что выдаются корректные значения для всех хостов. +![Иллюстрация к ДЗ](https://i.imgur.com//3IMEj5y.png) 7. При помощи `ansible-vault` зашифруйте факты в `group_vars/deb` и `group_vars/el` с паролем `netology`. -8. Запустите playbook на окружении `prod.yml`. При запуске `ansible` должен запросить у вас пароль. Убедитесь в работоспособности. -9. Посмотрите при помощи `ansible-doc` список плагинов для подключения. Выберите подходящий для работы на `control node`. -10. В `prod.yml` добавьте новую группу хостов с именем `local`, в ней разместите localhost с необходимым типом подключения. -11. Запустите playbook на окружении `prod.yml`. При запуске `ansible` должен запросить у вас пароль. Убедитесь что факты `some_fact` для каждого из хостов определены из верных `group_vars`. -12. Заполните `README.md` ответами на вопросы. Сделайте `git push` в ветку `master`. В ответе отправьте ссылку на ваш открытый репозиторий с изменённым `playbook` и заполненным `README.md`. +![Иллюстрация к ДЗ](https://i.imgur.com//lwwMQFe.png) +8. Запустите playbook на окружении `prod.yml`. При запуске `ansible` должен запросить у вас пароль. Убедитесь в работоспособности. +![Иллюстрация к ДЗ](https://i.imgur.com//fKvZRf8.png) +10. Посмотрите при помощи `ansible-doc` список плагинов для подключения. Выберите подходящий для работы на `control node`. +ansible-doc -t connection -l +![Иллюстрация к ДЗ](https://i.imgur.com//v8WKvqF.png) +11. В `prod.yml` добавьте новую группу хостов с именем `local`, в ней разместите localhost с необходимым типом подключения. +![Иллюстрация к ДЗ](https://i.imgur.com//pTBqxEg.png) +12. Запустите playbook на окружении `prod.yml`. При запуске `ansible` должен запросить у вас пароль. Убедитесь что факты `some_fact` для каждого из хостов определены из верных `group_vars`. +![Иллюстрация к ДЗ](https://i.imgur.com//Qm8pQ6j.png) +13. Заполните `README.md` ответами на вопросы. Сделайте `git push` в ветку `master`. В ответе отправьте ссылку на ваш открытый репозиторий с изменённым `playbook` и заполненным `README.md`. + + + +Самоконтроль выполнения задания +1. Где расположен файл с some_fact из второго пункта задания? +group_vars/all/examp.yml + +2. Какая команда нужна для запуска вашего playbook на окружении test.yml? +ansible-playbook -i inventory/test.yml site.yml + +3. Какой командой можно зашифровать файл? +ansible-vault encrypt group_vars/el/examp.yml + +4. Какой командой можно расшифровать файл? +ansible-vault decrypt group_vars/el/examp.yml + +5. Можно ли посмотреть содержимое зашифрованного файла без команды расшифровки файла? Если можно, то как? +ansible-vault view group_vars/el/examp.yml + +6. Как выглядит команда запуска playbook, если переменные зашифрованы? +ansible-playbook -i inventory/prod.yml site.yml --ask-vault-pass + +7. Как называется модуль подключения к host на windows? +winrm + +8. Приведите полный текст команды для поиска информации в документации ansible для модуля подключений ssh +ansible-doc -t connection ssh + +9. Какой параметр из модуля подключения ssh необходим для того, чтобы определить пользователя, под которым необходимо совершать подключение? +remote_user + + + + + + ## Необязательная часть From 8c348de7c9aab871935fc3d9d3284973acb731d7 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 16 Feb 2023 23:16:25 +0400 Subject: [PATCH 006/146] Update docker-compose.yml --- 08-ansible-01-base/docker-compose.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/08-ansible-01-base/docker-compose.yml b/08-ansible-01-base/docker-compose.yml index 8acea8e2a..e77a26bd0 100644 --- a/08-ansible-01-base/docker-compose.yml +++ b/08-ansible-01-base/docker-compose.yml @@ -12,8 +12,4 @@ services: restart: unless-stopped entrypoint: "sleep infinity" - fedora: - image: pycontribs/fedora - container_name: fedora - restart: unless-stopped - entrypoint: "sleep infinity" + From 55d3380fdd17d3295d8b018db68858a5c5c95108 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 16 Feb 2023 23:18:24 +0400 Subject: [PATCH 007/146] Update examp.yml --- 08-ansible-01-base/playbook/group_vars/el/examp.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/08-ansible-01-base/playbook/group_vars/el/examp.yml b/08-ansible-01-base/playbook/group_vars/el/examp.yml index 4c066eb64..6015c84bf 100644 --- a/08-ansible-01-base/playbook/group_vars/el/examp.yml +++ b/08-ansible-01-base/playbook/group_vars/el/examp.yml @@ -1,2 +1,8 @@ ---- - some_fact: "el" \ No newline at end of file +$ANSIBLE_VAULT;1.1;AES256 +36633766613265373837313864333732343731646332336630343264633331623761656137656162 +6434643665663536363536643263303537363866326362390a653335343235306539323266343135 +30303838393461333362373862323637353066376230303230316363326166376236613232666632 +6663636365366532350a623739613561663732363235356530383239613366613731643862373662 +63636464643964303763353932666330383863633230383861666666653062333133313232356362 +6164313833316230363033623734393262303064363535653366 + From a523789b87bf9420858f8a906252dba4d0cac941 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 16 Feb 2023 23:19:33 +0400 Subject: [PATCH 008/146] Update examp.yml --- 08-ansible-01-base/playbook/group_vars/deb/examp.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/08-ansible-01-base/playbook/group_vars/deb/examp.yml b/08-ansible-01-base/playbook/group_vars/deb/examp.yml index 11bc6fe03..f5e734659 100644 --- a/08-ansible-01-base/playbook/group_vars/deb/examp.yml +++ b/08-ansible-01-base/playbook/group_vars/deb/examp.yml @@ -1,2 +1,7 @@ ---- - some_fact: "deb" \ No newline at end of file +$ANSIBLE_VAULT;1.1;AES256 +30656231313463313961333531363332636262613333636466613536346539636132326332336536 +3635323533663232313465653866613361666361643234350a646264313465343565373031623361 +35343935343066646535643338306566356636653336616333633563373366386637633230663338 +3938643366396235360a386536663264373961333739633038366466393762303836376331353065 +38363731386334343935633633376630376239393930383337626531393631386232396436383563 +6334353935613365666137303839623237353337656538383637 From abd29b6781dcb06ae6461a65c0087a1d1c11eb9e Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 16 Feb 2023 23:20:31 +0400 Subject: [PATCH 009/146] Update examp.yml --- 08-ansible-01-base/playbook/group_vars/all/examp.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/08-ansible-01-base/playbook/group_vars/all/examp.yml b/08-ansible-01-base/playbook/group_vars/all/examp.yml index aae018217..b3d6bef82 100644 --- a/08-ansible-01-base/playbook/group_vars/all/examp.yml +++ b/08-ansible-01-base/playbook/group_vars/all/examp.yml @@ -1,2 +1,5 @@ --- - some_fact: 12 \ No newline at end of file +# some_fact: 12 + some_fact: all default fact + + From 30ffb7b9eef311b4bfa2b68411c2451687a7cfb4 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 16 Feb 2023 23:21:53 +0400 Subject: [PATCH 010/146] Update prod.yml --- 08-ansible-01-base/playbook/inventory/prod.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/08-ansible-01-base/playbook/inventory/prod.yml b/08-ansible-01-base/playbook/inventory/prod.yml index 56470ed41..d7c2c347d 100644 --- a/08-ansible-01-base/playbook/inventory/prod.yml +++ b/08-ansible-01-base/playbook/inventory/prod.yml @@ -6,4 +6,9 @@ deb: hosts: ubuntu: - ansible_connection: docker \ No newline at end of file + ansible_connection: docker + local: + hosts: + localhost: + ansible_connection: local + From 66b1e01ce5a1c9f2bd79726dff774fb6744771f0 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 16 Feb 2023 23:22:34 +0400 Subject: [PATCH 011/146] Update test.yml --- 08-ansible-01-base/playbook/inventory/test.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/08-ansible-01-base/playbook/inventory/test.yml b/08-ansible-01-base/playbook/inventory/test.yml index 93c1550cf..2a9c9335a 100644 --- a/08-ansible-01-base/playbook/inventory/test.yml +++ b/08-ansible-01-base/playbook/inventory/test.yml @@ -2,4 +2,5 @@ inside: hosts: localhost: - ansible_connection: local \ No newline at end of file + ansible_connection: local + From 0285adc3fa3e26beb90c289b98a641d7b9e5f229 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 18 Mar 2023 18:45:14 +0400 Subject: [PATCH 012/146] Update README.md --- 08-ansible-02-playbook/README.md | 206 ++++++++++++++++++++++++++++++- 1 file changed, 204 insertions(+), 2 deletions(-) diff --git a/08-ansible-02-playbook/README.md b/08-ansible-02-playbook/README.md index 7dc35db1b..feefe97f0 100644 --- a/08-ansible-02-playbook/README.md +++ b/08-ansible-02-playbook/README.md @@ -9,15 +9,217 @@ ## Основная часть -1. Приготовьте свой собственный inventory файл `prod.yml`. -2. Допишите playbook: нужно сделать ещё один play, который устанавливает и настраивает [vector](https://vector.dev). +1. Приготовьте свой собственный inventory файл `prod.yml` + -
prod.yml +
+    ---
+clickhouse:
+  hosts:
+    clickhouse-01:
+      ansible_host: "172.17.0.110"
+    
+
+2. Допишите playbook: нужно сделать ещё один play, который устанавливает и настраивает [vector](https://vector.dev). +![Play_install_deb_pack_vector](https://imgur.com/a/gUdVPXT) +![Play_install_deb_pack_clickhouse](https://i.imgur.com/LyPSTf4.png) +![Play_deinstall_deb_pack_vector](https://i.imgur.com/mbHQkO7.png) +![Play_deinstall_deb_pack_clickhouse](https://i.imgur.com/QdtNPxo.png) 3. При создании tasks рекомендую использовать модули: `get_url`, `template`, `unarchive`, `file`. + -
Mods +
+ansible.builtin.get_url
+ansible.builtin.apt
+ansible.builtin.meta
+ansible.builtin.pause
+ansible.builtin.command
+ansible.builtin.file
+ansible.builtin.unarchive
+ansible.builtin.copy
+ansible.builtin.replace
+ansible.builtin.user
+ansible.builtin.service
+ansible.builtin.systemd
+    
+
4. Tasks должны: скачать нужной версии дистрибутив, выполнить распаковку в выбранную директорию, установить vector. +
+ All in site.yml + + ``` + --- +- name: Install Clickhouse & Vector + hosts: clickhouse + gather_facts: false + + handlers: + - name: Start clickhouse service + become: true + ansible.builtin.service: + name: clickhouse-server + state: restarted + + - name: Start Vector service + become: true + ansible.builtin.systemd: + daemon_reload: true + enabled: false + name: vector.service + state: started + + tasks: + - block: + - block: + - name: Clickhouse. Get clickhouse distrib + ansible.builtin.get_url: + url: "https://packages.clickhouse.com/deb/pool/stable/{{ item }}_{{ clickhouse_version }}_all.deb" + dest: "./{{ item }}_{{ clickhouse_version }}_all.deb" + mode: 0644 + with_items: "{{ clickhouse_packages }}" + rescue: + - name: Clickhouse. Get clickhouse distrib + ansible.builtin.get_url: + url: "https://packages.clickhouse.com/deb/pool/stable/clickhouse-common-static_{{ clickhouse_version }}_amd64.deb" + dest: "./clickhouse-common-static_{{ clickhouse_version }}_amd64.deb" + mode: 0644 + with_items: "{{ clickhouse_packages }}" + + - name: Clickhouse. Install package clickhouse-common-static + become: true + ansible.builtin.apt: + deb: ./clickhouse-common-static_{{ clickhouse_version }}_amd64.deb + notify: Start clickhouse service + + - name: Clickhouse. Install package clickhouse-client + become: true + ansible.builtin.apt: + deb: ./clickhouse-client_{{ clickhouse_version }}_all.deb + notify: Start clickhouse service + + - name: Clickhouse. Install clickhouse package clickhouse-server + become: true + ansible.builtin.apt: + deb: ./clickhouse-server_{{ clickhouse_version }}_all.deb + notify: Start clickhouse service + + - name: Clickhouse. Flush handlers + ansible.builtin.meta: flush_handlers + + - name: Clickhouse. Waiting while clickhouse-server is available... + ansible.builtin.pause: + seconds: 10 + echo: false + + - name: Clickhouse. Create database + ansible.builtin.command: "clickhouse-client -q 'create database logs;'" + register: create_db + failed_when: create_db.rc != 0 and create_db.rc !=82 + changed_when: create_db.rc == 0 + tags: clickhouse + + - block: + - name: Vector. Create work directory + ansible.builtin.file: + path: "{{ vector_workdir }}" + state: directory + mode: 0755 + + - name: Vector. Get Vector distributive + ansible.builtin.get_url: + url: "https://packages.timber.io/vector/{{ vector_version }}/vector-{{ vector_version }}-{{ vector_os_arh }}-unknown-linux-gnu.tar.gz" + dest: "{{ vector_workdir }}/vector-{{ vector_version }}-{{ vector_os_arh }}-unknown-linux-gnu.tar.gz" + mode: 0644 + + - name: Vector. Unzip archive + ansible.builtin.unarchive: + remote_src: true + src: "{{ vector_workdir }}/vector-{{ vector_version }}-{{ vector_os_arh }}-unknown-linux-gnu.tar.gz" + dest: "{{ vector_workdir }}" + + - name: Vector. Install vector binary file + become: true + ansible.builtin.copy: + remote_src: true + src: "{{ vector_workdir }}/vector-{{ vector_os_arh }}-unknown-linux-gnu/bin/vector" + dest: "/usr/bin/" + mode: 0755 + owner: root + group: root + + - name: Vector. Check Vector installation + ansible.builtin.command: "vector --version" + register: var_vector + failed_when: var_vector.rc != 0 + changed_when: var_vector.rc == 0 + + - name: Vector. Create Vector config vector.toml + become: true + ansible.builtin.copy: + remote_src: true + src: "{{ vector_workdir }}/vector-{{ vector_os_arh }}-unknown-linux-gnu/config/vector.toml" + dest: "/etc/vector/" + mode: 0644 + owner: root + group: root + + - name: Vector. Create vector.service daemon + become: true + ansible.builtin.copy: + remote_src: true + src: "{{ vector_workdir }}/vector-{{ vector_os_arh }}-unknown-linux-gnu/etc/systemd/vector.service" + dest: "/lib/systemd/system/" + mode: 0644 + owner: root + group: root + notify: Start Vector service + + - name: Vector. Modify vector.service file + become: true + ansible.builtin.replace: + backup: true + path: "/lib/systemd/system/vector.service" + regexp: "^ExecStart=/usr/bin/vector$" + replace: "ExecStart=/usr/bin/vector --config /etc/vector/vector.toml" + notify: Start Vector service + + - name: Vector. Create user vector + become: true + ansible.builtin.user: + create_home: false + name: "{{ vector_os_user }}" + + - name: Vector. Create data_dir + become: true + ansible.builtin.file: + path: "/var/lib/vector" + state: directory + mode: 0755 + owner: "{{ vector_os_user }}" + + + - name: Vector. Remove work directory + ansible.builtin.file: + path: "{{ vector_workdir }}" + state: absent + + tags: vector + + ``` +
5. Запустите `ansible-lint site.yml` и исправьте ошибки, если они есть. +![ansible-lint](https://i.imgur.com/EQQbee9.png) 6. Попробуйте запустить playbook на этом окружении с флагом `--check`. +![check-kek-chebureg](https://i.imgur.com/vtgI53W.png) 7. Запустите playbook на `prod.yml` окружении с флагом `--diff`. Убедитесь, что изменения на системе произведены. +![1](https://i.imgur.com/XwDE6A4.png) +![2](https://i.imgur.com/hAFMIWp.png) +![3](https://i.imgur.com/nwWK9W4.png) +![4](https://i.imgur.com/NAGswJQ.png) 8. Повторно запустите playbook с флагом `--diff` и убедитесь, что playbook идемпотентен. +![1](https://i.imgur.com/ZgY4OQF.png) +![2](https://i.imgur.com/4ZA5LsP.png) +![3](https://i.imgur.com/C4kBZTX.png) 9. Подготовьте README.md файл по своему playbook. В нём должно быть описано: что делает playbook, какие у него есть параметры и теги. + 10. Готовый playbook выложите в свой репозиторий, поставьте тег `08-ansible-02-playbook` на фиксирующий коммит, в ответ предоставьте ссылку на него. --- From ecbcfaa1389709aa0d277110fe286a670fc370c6 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 18 Mar 2023 18:48:22 +0400 Subject: [PATCH 013/146] 08-ansible-02-playbook 08-ansible-02-playbook --- 08-ansible-02-playbook/playbook/site.yml | 172 +++++++++++++++++++---- 1 file changed, 146 insertions(+), 26 deletions(-) diff --git a/08-ansible-02-playbook/playbook/site.yml b/08-ansible-02-playbook/playbook/site.yml index ab99c50b6..a763bbe45 100755 --- a/08-ansible-02-playbook/playbook/site.yml +++ b/08-ansible-02-playbook/playbook/site.yml @@ -1,36 +1,156 @@ ---- -- name: Install Clickhouse + --- +- name: Install Clickhouse & Vector hosts: clickhouse + gather_facts: false + handlers: - name: Start clickhouse service become: true ansible.builtin.service: name: clickhouse-server state: restarted + + - name: Start Vector service + become: true + ansible.builtin.systemd: + daemon_reload: true + enabled: false + name: vector.service + state: started + tasks: - block: - - name: Get clickhouse distrib - ansible.builtin.get_url: - url: "https://packages.clickhouse.com/rpm/stable/{{ item }}-{{ clickhouse_version }}.noarch.rpm" - dest: "./{{ item }}-{{ clickhouse_version }}.rpm" - with_items: "{{ clickhouse_packages }}" - rescue: - - name: Get clickhouse distrib + - block: + - name: Clickhouse. Get clickhouse distrib + ansible.builtin.get_url: + url: "https://packages.clickhouse.com/deb/pool/stable/{{ item }}_{{ clickhouse_version }}_all.deb" + dest: "./{{ item }}_{{ clickhouse_version }}_all.deb" + mode: 0644 + with_items: "{{ clickhouse_packages }}" + rescue: + - name: Clickhouse. Get clickhouse distrib + ansible.builtin.get_url: + url: "https://packages.clickhouse.com/deb/pool/stable/clickhouse-common-static_{{ clickhouse_version }}_amd64.deb" + dest: "./clickhouse-common-static_{{ clickhouse_version }}_amd64.deb" + mode: 0644 + with_items: "{{ clickhouse_packages }}" + + - name: Clickhouse. Install package clickhouse-common-static + become: true + ansible.builtin.apt: + deb: ./clickhouse-common-static_{{ clickhouse_version }}_amd64.deb + notify: Start clickhouse service + + - name: Clickhouse. Install package clickhouse-client + become: true + ansible.builtin.apt: + deb: ./clickhouse-client_{{ clickhouse_version }}_all.deb + notify: Start clickhouse service + + - name: Clickhouse. Install clickhouse package clickhouse-server + become: true + ansible.builtin.apt: + deb: ./clickhouse-server_{{ clickhouse_version }}_all.deb + notify: Start clickhouse service + + - name: Clickhouse. Flush handlers + ansible.builtin.meta: flush_handlers + + - name: Clickhouse. Waiting while clickhouse-server is available... + ansible.builtin.pause: + seconds: 10 + echo: false + + - name: Clickhouse. Create database + ansible.builtin.command: "clickhouse-client -q 'create database logs;'" + register: create_db + failed_when: create_db.rc != 0 and create_db.rc !=82 + changed_when: create_db.rc == 0 + tags: clickhouse + + - block: + - name: Vector. Create work directory + ansible.builtin.file: + path: "{{ vector_workdir }}" + state: directory + mode: 0755 + + - name: Vector. Get Vector distributive ansible.builtin.get_url: - url: "https://packages.clickhouse.com/rpm/stable/clickhouse-common-static-{{ clickhouse_version }}.x86_64.rpm" - dest: "./clickhouse-common-static-{{ clickhouse_version }}.rpm" - - name: Install clickhouse packages - become: true - ansible.builtin.yum: - name: - - clickhouse-common-static-{{ clickhouse_version }}.rpm - - clickhouse-client-{{ clickhouse_version }}.rpm - - clickhouse-server-{{ clickhouse_version }}.rpm - notify: Start clickhouse service - - name: Flush handlers - meta: flush_handlers - - name: Create database - ansible.builtin.command: "clickhouse-client -q 'create database logs;'" - register: create_db - failed_when: create_db.rc != 0 and create_db.rc !=82 - changed_when: create_db.rc == 0 + url: "https://packages.timber.io/vector/{{ vector_version }}/vector-{{ vector_version }}-{{ vector_os_arh }}-unknown-linux-gnu.tar.gz" + dest: "{{ vector_workdir }}/vector-{{ vector_version }}-{{ vector_os_arh }}-unknown-linux-gnu.tar.gz" + mode: 0644 + + - name: Vector. Unzip archive + ansible.builtin.unarchive: + remote_src: true + src: "{{ vector_workdir }}/vector-{{ vector_version }}-{{ vector_os_arh }}-unknown-linux-gnu.tar.gz" + dest: "{{ vector_workdir }}" + + - name: Vector. Install vector binary file + become: true + ansible.builtin.copy: + remote_src: true + src: "{{ vector_workdir }}/vector-{{ vector_os_arh }}-unknown-linux-gnu/bin/vector" + dest: "/usr/bin/" + mode: 0755 + owner: root + group: root + + - name: Vector. Check Vector installation + ansible.builtin.command: "vector --version" + register: var_vector + failed_when: var_vector.rc != 0 + changed_when: var_vector.rc == 0 + + - name: Vector. Create Vector config vector.toml + become: true + ansible.builtin.copy: + remote_src: true + src: "{{ vector_workdir }}/vector-{{ vector_os_arh }}-unknown-linux-gnu/config/vector.toml" + dest: "/etc/vector/" + mode: 0644 + owner: root + group: root + + - name: Vector. Create vector.service daemon + become: true + ansible.builtin.copy: + remote_src: true + src: "{{ vector_workdir }}/vector-{{ vector_os_arh }}-unknown-linux-gnu/etc/systemd/vector.service" + dest: "/lib/systemd/system/" + mode: 0644 + owner: root + group: root + notify: Start Vector service + + - name: Vector. Modify vector.service file + become: true + ansible.builtin.replace: + backup: true + path: "/lib/systemd/system/vector.service" + regexp: "^ExecStart=/usr/bin/vector$" + replace: "ExecStart=/usr/bin/vector --config /etc/vector/vector.toml" + notify: Start Vector service + + - name: Vector. Create user vector + become: true + ansible.builtin.user: + create_home: false + name: "{{ vector_os_user }}" + + - name: Vector. Create data_dir + become: true + ansible.builtin.file: + path: "/var/lib/vector" + state: directory + mode: 0755 + owner: "{{ vector_os_user }}" + + + - name: Vector. Remove work directory + ansible.builtin.file: + path: "{{ vector_workdir }}" + state: absent + + tags: vector From aca4effd0b84227070a1e91fba10e270e31f9fa1 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 18 Mar 2023 18:49:54 +0400 Subject: [PATCH 014/146] 08-ansible-02-playbook 08-ansible-02-playbook --- .../playbook/group_vars/clickhouse/vars.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/08-ansible-02-playbook/playbook/group_vars/clickhouse/vars.yml b/08-ansible-02-playbook/playbook/group_vars/clickhouse/vars.yml index da987492b..4842537dc 100644 --- a/08-ansible-02-playbook/playbook/group_vars/clickhouse/vars.yml +++ b/08-ansible-02-playbook/playbook/group_vars/clickhouse/vars.yml @@ -4,3 +4,9 @@ clickhouse_packages: - clickhouse-client - clickhouse-server - clickhouse-common-static + +vector_version: "0.21.1" +vector_os_arh: "x86_64" +vector_workdir: "/home/vector" +vector_os_user: "vector" +vector_os_group: "vector" From 290280319bcd4e175b313af620cac574be9e33d3 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 18 Mar 2023 18:50:30 +0400 Subject: [PATCH 015/146] 08-ansible-02-playbook 08-ansible-02-playbook --- 08-ansible-02-playbook/playbook/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/08-ansible-02-playbook/playbook/.gitignore b/08-ansible-02-playbook/playbook/.gitignore index 5ed0cb64c..6e8363b29 100644 --- a/08-ansible-02-playbook/playbook/.gitignore +++ b/08-ansible-02-playbook/playbook/.gitignore @@ -1 +1 @@ -files/* \ No newline at end of file +files/* From 6cb5a59d7cb904f3ba86c13bda126ce31ddb2081 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 18 Mar 2023 18:53:37 +0400 Subject: [PATCH 016/146] 08-ansible-02-playbook 08-ansible-02-playbook --- 08-ansible-02-playbook/playbook/inventory/prod.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/08-ansible-02-playbook/playbook/inventory/prod.yml b/08-ansible-02-playbook/playbook/inventory/prod.yml index 83ddf34cb..099e07b62 100644 --- a/08-ansible-02-playbook/playbook/inventory/prod.yml +++ b/08-ansible-02-playbook/playbook/inventory/prod.yml @@ -2,4 +2,4 @@ clickhouse: hosts: clickhouse-01: - ansible_host: + ansible_host: "172.17.0.110" From 536fecd8874c5c9578a55989baad8b6ad5109d40 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 18 Mar 2023 18:59:38 +0400 Subject: [PATCH 017/146] Update README.md --- 08-ansible-02-playbook/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/08-ansible-02-playbook/README.md b/08-ansible-02-playbook/README.md index feefe97f0..4a0fcca73 100644 --- a/08-ansible-02-playbook/README.md +++ b/08-ansible-02-playbook/README.md @@ -12,15 +12,14 @@ 1. Приготовьте свой собственный inventory файл `prod.yml` -
prod.yml
-    ---
-clickhouse:
+    clickhouse:
   hosts:
     clickhouse-01:
       ansible_host: "172.17.0.110"
     
2. Допишите playbook: нужно сделать ещё один play, который устанавливает и настраивает [vector](https://vector.dev). -![Play_install_deb_pack_vector](https://imgur.com/a/gUdVPXT) +![Play_install_deb_pack_vector] (https://imgur.com/a/gUdVPXT) ![Play_install_deb_pack_clickhouse](https://i.imgur.com/LyPSTf4.png) ![Play_deinstall_deb_pack_vector](https://i.imgur.com/mbHQkO7.png) ![Play_deinstall_deb_pack_clickhouse](https://i.imgur.com/QdtNPxo.png) From 0161b67ddb4b77c173bee2d1bfddedc4ca8f0fac Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 18 Mar 2023 19:08:41 +0400 Subject: [PATCH 018/146] Update README.md --- 08-ansible-02-playbook/README.md | 82 +++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 6 deletions(-) diff --git a/08-ansible-02-playbook/README.md b/08-ansible-02-playbook/README.md index 4a0fcca73..2a5b345ab 100644 --- a/08-ansible-02-playbook/README.md +++ b/08-ansible-02-playbook/README.md @@ -10,19 +10,29 @@ ## Основная часть 1. Приготовьте свой собственный inventory файл `prod.yml` - -
prod.yml -
-    clickhouse:
+
+ 
+ Example + + ``` + --- +clickhouse: hosts: clickhouse-01: ansible_host: "172.17.0.110" -
-
-2. Допишите playbook: нужно сделать ещё один play, который устанавливает и настраивает [vector](https://vector.dev). + ``` + + +2. Допишите playbook: нужно сделать ещё один play, который устанавливает и настраивает [vector](https://vector.dev). + ![Play_install_deb_pack_vector] (https://imgur.com/a/gUdVPXT) + ![Play_install_deb_pack_clickhouse](https://i.imgur.com/LyPSTf4.png) + ![Play_deinstall_deb_pack_vector](https://i.imgur.com/mbHQkO7.png) + ![Play_deinstall_deb_pack_clickhouse](https://i.imgur.com/QdtNPxo.png) + 3. При создании tasks рекомендую использовать модули: `get_url`, `template`, `unarchive`, `file`. -
Mods
@@ -205,20 +215,80 @@ ansible.builtin.systemd
   ```
 
5. Запустите `ansible-lint site.yml` и исправьте ошибки, если они есть. + ![ansible-lint](https://i.imgur.com/EQQbee9.png) + 6. Попробуйте запустить playbook на этом окружении с флагом `--check`. + ![check-kek-chebureg](https://i.imgur.com/vtgI53W.png) + 7. Запустите playbook на `prod.yml` окружении с флагом `--diff`. Убедитесь, что изменения на системе произведены. + ![1](https://i.imgur.com/XwDE6A4.png) + ![2](https://i.imgur.com/hAFMIWp.png) + ![3](https://i.imgur.com/nwWK9W4.png) + ![4](https://i.imgur.com/NAGswJQ.png) + 8. Повторно запустите playbook с флагом `--diff` и убедитесь, что playbook идемпотентен. + ![1](https://i.imgur.com/ZgY4OQF.png) + ![2](https://i.imgur.com/4ZA5LsP.png) + ![3](https://i.imgur.com/C4kBZTX.png) + 9. Подготовьте README.md файл по своему playbook. В нём должно быть описано: что делает playbook, какие у него есть параметры и теги. +playbook/site.yml содержит 2 блока задач: + +
+ Первый + + ``` + Блок инсталяции Clickhouse. Тэг - clickhouse. В нем: +clickhouse_version: "22.3.3.44" - версия Clickhouse +clickhouse_packages: ["clickhouse-client", "clickhouse-server", "clickhouse-common-static"] - список пакетов для установки +Task'и: +TASK [Clickhouse. Get clickhouse distrib] - скачивает deb-пакеты с дистрибутивами с помощью модуля ansible.builtin.get_url +TASK [Clickhouse. Install package clickhouse-common-static] - устанавливает deb-пакет с помощью модуля ansible.builtin.apt +TASK [Clickhouse. Install package clickhouse-client] - устанавливает deb-пакет с помощью модуля ansible.builtin.apt +TASK [Clickhouse. Install clickhouse package clickhouse-server] - устанавливает deb-пакеты с помощью модуля ansible.builtin.apt +TASK [Clickhouse. Flush handlers] - инициирует внеочередной запуск хандлера Start clickhouse service +RUNNING HANDLER [Start clickhouse service] - для старта сервера clickhouse в хандлере используется модуль ansible.builtin.service +TASK [Clickhouse. Waiting while clickhouse-server is available...] - устанавливает паузу в 10 секунд с помощью модуля ansible.builtin.pause, чтобы сервер Clickhouse успел запуститься. Иначе следующая задача по созданию БД может завершиться ошибкой, т.к. сервер еще не успел подняться +TASK [Clickhouse. Create database] - создает инстанс базы данных Clickhouse + ``` +
+ +
+ Второй + + ``` + Блок инсталяции Vector. Тэг - vector. Используются параметры: +vector_version: "0.21.1" - версия Vector +vector_os_arh: "x86_64" - архитектура ОС +vector_workdir: "/home/vector" - рабочий каталог, в котором будут сохранены скачанные deb-пакеты +vector_os_user: "vector" - имя пользователя-владельца Vector в ОС +vector_os_group: "vector" - имя группы пользователя-владельца Vector в ОС +Task'и: +TASK [Vector. Create work directory] - создает рабочий каталог, в котором будут сохранены скачанные deb-пакеты, с помощью модуля ansible.builtin.file +TASK [Vector. Get Vector distributive] - скачивает архив с дистрибутивом с помощью модуля ansible.builtin.get_url +TASK [Vector. Unzip archive] - распаковывает скачанный архив с помощью модуля ansible.builtin.unarchive +TASK [Vector. Install vector binary file] - копирует исполняемый файл Vector в /usr/bin с помощью модуля ansible.builtin.copy +TASK [Vector. Check Vector installation] - проверяет, что бинарный файл Vector работает корректно, с помощью модуля ansible.builtin.command +TASK [Vector. Create Vector config vector.toml] - создает файл /etc/vector/vector.toml с конфигом Vector с помощью модуля ansible.builtin.copy +TASK [Vector. Create vector.service daemon] - создает файл юнита systemd /lib/systemd/system/vector.service с помощью модуля ansible.builtin.copy +TASK [Vector. Modify vector.service file] - редактирует файл юнита systemd /lib/systemd/system/vector.service с помощью модуля ansible.builtin.replace +TASK [Vector. Create user vector] - создает пользователя ОС с помощью модуля ansible.builtin.user +TASK [Vector. Create data_dir] - создает каталог дял данных Vector с помощью модуля ansible.builtin.file +TASK [Vector. Remove work directory] - удаляет рабочий каталог с помощью модуля ansible.builtin.file +RUNNING HANDLER [Start Vector service] - инициируется запуск хандлера Start Vector service, обновляющего конфигурацию systemd и стартующего сервис vector.service с помощью модуляansible.builtin.systemd + ``` +
+ 10. Готовый playbook выложите в свой репозиторий, поставьте тег `08-ansible-02-playbook` на фиксирующий коммит, в ответ предоставьте ссылку на него. --- From 3a906802d236babd4ed2a84edf2583201ae2ac61 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 18 Mar 2023 19:23:31 +0400 Subject: [PATCH 019/146] Update README.md --- 08-ansible-02-playbook/README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/08-ansible-02-playbook/README.md b/08-ansible-02-playbook/README.md index 2a5b345ab..1ce73b4a1 100644 --- a/08-ansible-02-playbook/README.md +++ b/08-ansible-02-playbook/README.md @@ -12,7 +12,7 @@ 1. Приготовьте свой собственный inventory файл `prod.yml`
- Example + [prod.yml](https://github.com/NamorNinayzuk/mnt-homeworks/blob/MNT-video/08-ansible-02-playbook/playbook/inventory/prod.yml "жмакай") ``` --- @@ -25,7 +25,7 @@ clickhouse: 2. Допишите playbook: нужно сделать ещё один play, который устанавливает и настраивает [vector](https://vector.dev). -![Play_install_deb_pack_vector] (https://imgur.com/a/gUdVPXT) +![Play_install_deb_pack_vector](https://imgur.com/a/gUdVPXT) ![Play_install_deb_pack_clickhouse](https://i.imgur.com/LyPSTf4.png) @@ -52,7 +52,7 @@ ansible.builtin.systemd
4. Tasks должны: скачать нужной версии дистрибутив, выполнить распаковку в выбранную директорию, установить vector.
- All in site.yml + All in [site.yml](https://github.com/NamorNinayzuk/mnt-homeworks/blob/MNT-video/08-ansible-02-playbook/playbook/site.yml "жмакай") ``` --- @@ -242,7 +242,7 @@ ansible.builtin.systemd 9. Подготовьте README.md файл по своему playbook. В нём должно быть описано: что делает playbook, какие у него есть параметры и теги. -playbook/site.yml содержит 2 блока задач: +[playbook/site.yml](https://github.com/NamorNinayzuk/mnt-homeworks/blob/MNT-video/08-ansible-02-playbook/playbook/site.yml "жмакай") содержит 2 блока задач:
Первый @@ -291,6 +291,7 @@ RUNNING HANDLER [Start Vector service] - инициируется запуск 10. Готовый playbook выложите в свой репозиторий, поставьте тег `08-ansible-02-playbook` на фиксирующий коммит, в ответ предоставьте ссылку на него. +[playbook](https://github.com/NamorNinayzuk/mnt-homeworks/tree/MNT-video/08-ansible-02-playbook/playbook "жмакай") --- ### Как оформить ДЗ? From 3de47fcfe77e07e87abe363352182161ab400e51 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 18 Mar 2023 19:28:32 +0400 Subject: [PATCH 020/146] Update README.md --- 08-ansible-02-playbook/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/08-ansible-02-playbook/README.md b/08-ansible-02-playbook/README.md index 1ce73b4a1..4ded2c188 100644 --- a/08-ansible-02-playbook/README.md +++ b/08-ansible-02-playbook/README.md @@ -9,10 +9,10 @@ ## Основная часть -1. Приготовьте свой собственный inventory файл `prod.yml` +1. Приготовьте свой собственный inventory файл [prod.yml](https://github.com/NamorNinayzuk/mnt-homeworks/blob/MNT-video/08-ansible-02-playbook/playbook/inventory/prod.yml "жмакай")
- [prod.yml](https://github.com/NamorNinayzuk/mnt-homeworks/blob/MNT-video/08-ansible-02-playbook/playbook/inventory/prod.yml "жмакай") + `prod.yml` ``` --- @@ -52,7 +52,7 @@ ansible.builtin.systemd
4. Tasks должны: скачать нужной версии дистрибутив, выполнить распаковку в выбранную директорию, установить vector.
- All in [site.yml](https://github.com/NamorNinayzuk/mnt-homeworks/blob/MNT-video/08-ansible-02-playbook/playbook/site.yml "жмакай") + All in `site.yml` ``` --- From cd66d2771fb93816c7b33dc7caf5852a52fbda80 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 18 Mar 2023 19:30:54 +0400 Subject: [PATCH 021/146] Update README.md --- 08-ansible-02-playbook/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/08-ansible-02-playbook/README.md b/08-ansible-02-playbook/README.md index 4ded2c188..a8e12e686 100644 --- a/08-ansible-02-playbook/README.md +++ b/08-ansible-02-playbook/README.md @@ -24,8 +24,8 @@ clickhouse:
2. Допишите playbook: нужно сделать ещё один play, который устанавливает и настраивает [vector](https://vector.dev). - -![Play_install_deb_pack_vector](https://imgur.com/a/gUdVPXT) + +![Play_install_deb_pack_clickhouse](https://imgur.com/a/gUdVPXT) ![Play_install_deb_pack_clickhouse](https://i.imgur.com/LyPSTf4.png) From 2f748ce5cf5c29b794dc527220741518453437d8 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 18 Mar 2023 19:31:25 +0400 Subject: [PATCH 022/146] Update README.md --- 08-ansible-02-playbook/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/08-ansible-02-playbook/README.md b/08-ansible-02-playbook/README.md index a8e12e686..e33c6baca 100644 --- a/08-ansible-02-playbook/README.md +++ b/08-ansible-02-playbook/README.md @@ -25,6 +25,8 @@ clickhouse: 2. Допишите playbook: нужно сделать ещё один play, который устанавливает и настраивает [vector](https://vector.dev). + + ![Play_install_deb_pack_clickhouse](https://imgur.com/a/gUdVPXT) ![Play_install_deb_pack_clickhouse](https://i.imgur.com/LyPSTf4.png) From 880e322670acfd62cadd14b034885e539b73e71a Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 18 Mar 2023 19:35:03 +0400 Subject: [PATCH 023/146] Update README.md --- 08-ansible-02-playbook/README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/08-ansible-02-playbook/README.md b/08-ansible-02-playbook/README.md index e33c6baca..3a362d787 100644 --- a/08-ansible-02-playbook/README.md +++ b/08-ansible-02-playbook/README.md @@ -25,9 +25,7 @@ clickhouse: 2. Допишите playbook: нужно сделать ещё один play, который устанавливает и настраивает [vector](https://vector.dev). - - -![Play_install_deb_pack_clickhouse](https://imgur.com/a/gUdVPXT) +![Play_install_deb_pack_clickhouse](https://imgur.com/p8L2wjV.png) ![Play_install_deb_pack_clickhouse](https://i.imgur.com/LyPSTf4.png) From 2c7626669458a67593796552d4836c59c20ce7ac Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Wed, 29 Mar 2023 20:19:03 +0400 Subject: [PATCH 024/146] Update README.md --- 08-ansible-02-playbook/README.md | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/08-ansible-02-playbook/README.md b/08-ansible-02-playbook/README.md index 3a362d787..a0e450917 100644 --- a/08-ansible-02-playbook/README.md +++ b/08-ansible-02-playbook/README.md @@ -244,11 +244,7 @@ ansible.builtin.systemd [playbook/site.yml](https://github.com/NamorNinayzuk/mnt-homeworks/blob/MNT-video/08-ansible-02-playbook/playbook/site.yml "жмакай") содержит 2 блока задач: -
- Первый - - ``` - Блок инсталяции Clickhouse. Тэг - clickhouse. В нем: +Первый блок объединяет последовательность задач по инсталяции Clickhouse. Блоку соответствует тэг clickhouse. В блоке используются параметры: clickhouse_version: "22.3.3.44" - версия Clickhouse clickhouse_packages: ["clickhouse-client", "clickhouse-server", "clickhouse-common-static"] - список пакетов для установки Task'и: @@ -260,14 +256,9 @@ TASK [Clickhouse. Flush handlers] - инициирует внеочередно RUNNING HANDLER [Start clickhouse service] - для старта сервера clickhouse в хандлере используется модуль ansible.builtin.service TASK [Clickhouse. Waiting while clickhouse-server is available...] - устанавливает паузу в 10 секунд с помощью модуля ansible.builtin.pause, чтобы сервер Clickhouse успел запуститься. Иначе следующая задача по созданию БД может завершиться ошибкой, т.к. сервер еще не успел подняться TASK [Clickhouse. Create database] - создает инстанс базы данных Clickhouse - ``` -
-
- Второй - ``` - Блок инсталяции Vector. Тэг - vector. Используются параметры: +Второй блок объединяет последовательность задач по инсталяции Vector. Блоку соответствует тэг vector. В блоке используются параметры: vector_version: "0.21.1" - версия Vector vector_os_arh: "x86_64" - архитектура ОС vector_workdir: "/home/vector" - рабочий каталог, в котором будут сохранены скачанные deb-пакеты @@ -286,8 +277,7 @@ TASK [Vector. Create user vector] - создает пользователя ОС TASK [Vector. Create data_dir] - создает каталог дял данных Vector с помощью модуля ansible.builtin.file TASK [Vector. Remove work directory] - удаляет рабочий каталог с помощью модуля ansible.builtin.file RUNNING HANDLER [Start Vector service] - инициируется запуск хандлера Start Vector service, обновляющего конфигурацию systemd и стартующего сервис vector.service с помощью модуляansible.builtin.systemd - ``` -
+ 10. Готовый playbook выложите в свой репозиторий, поставьте тег `08-ansible-02-playbook` на фиксирующий коммит, в ответ предоставьте ссылку на него. From 262c14087fe48ccb07ded8755767fd760f21a75c Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Wed, 29 Mar 2023 20:22:50 +0400 Subject: [PATCH 025/146] Update README.md --- 08-ansible-02-playbook/README.md | 35 +++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/08-ansible-02-playbook/README.md b/08-ansible-02-playbook/README.md index a0e450917..513203514 100644 --- a/08-ansible-02-playbook/README.md +++ b/08-ansible-02-playbook/README.md @@ -245,37 +245,66 @@ ansible.builtin.systemd [playbook/site.yml](https://github.com/NamorNinayzuk/mnt-homeworks/blob/MNT-video/08-ansible-02-playbook/playbook/site.yml "жмакай") содержит 2 блока задач: Первый блок объединяет последовательность задач по инсталяции Clickhouse. Блоку соответствует тэг clickhouse. В блоке используются параметры: + clickhouse_version: "22.3.3.44" - версия Clickhouse + clickhouse_packages: ["clickhouse-client", "clickhouse-server", "clickhouse-common-static"] - список пакетов для установки -Task'и: +Task' +из них: + TASK [Clickhouse. Get clickhouse distrib] - скачивает deb-пакеты с дистрибутивами с помощью модуля ansible.builtin.get_url + TASK [Clickhouse. Install package clickhouse-common-static] - устанавливает deb-пакет с помощью модуля ansible.builtin.apt + TASK [Clickhouse. Install package clickhouse-client] - устанавливает deb-пакет с помощью модуля ansible.builtin.apt + TASK [Clickhouse. Install clickhouse package clickhouse-server] - устанавливает deb-пакеты с помощью модуля ansible.builtin.apt + TASK [Clickhouse. Flush handlers] - инициирует внеочередной запуск хандлера Start clickhouse service + RUNNING HANDLER [Start clickhouse service] - для старта сервера clickhouse в хандлере используется модуль ansible.builtin.service -TASK [Clickhouse. Waiting while clickhouse-server is available...] - устанавливает паузу в 10 секунд с помощью модуля ansible.builtin.pause, чтобы сервер Clickhouse успел запуститься. Иначе следующая задача по созданию БД может завершиться ошибкой, т.к. сервер еще не успел подняться + +TASK [Clickhouse. Waiting while clickhouse-server is available...] - устанавливает паузу в 10 секунд с помощью модуля ansible.builtin.pause, чтобы сервер Clickhouse успел запуститься. Иначе следующая задача по созданию БД может завершиться ошибкой, т.к. сервер еще не успел подняться. + TASK [Clickhouse. Create database] - создает инстанс базы данных Clickhouse Второй блок объединяет последовательность задач по инсталяции Vector. Блоку соответствует тэг vector. В блоке используются параметры: + vector_version: "0.21.1" - версия Vector + vector_os_arh: "x86_64" - архитектура ОС + vector_workdir: "/home/vector" - рабочий каталог, в котором будут сохранены скачанные deb-пакеты + vector_os_user: "vector" - имя пользователя-владельца Vector в ОС + vector_os_group: "vector" - имя группы пользователя-владельца Vector в ОС -Task'и: + +Task: + TASK [Vector. Create work directory] - создает рабочий каталог, в котором будут сохранены скачанные deb-пакеты, с помощью модуля ansible.builtin.file + TASK [Vector. Get Vector distributive] - скачивает архив с дистрибутивом с помощью модуля ansible.builtin.get_url + TASK [Vector. Unzip archive] - распаковывает скачанный архив с помощью модуля ansible.builtin.unarchive + TASK [Vector. Install vector binary file] - копирует исполняемый файл Vector в /usr/bin с помощью модуля ansible.builtin.copy + TASK [Vector. Check Vector installation] - проверяет, что бинарный файл Vector работает корректно, с помощью модуля ansible.builtin.command + TASK [Vector. Create Vector config vector.toml] - создает файл /etc/vector/vector.toml с конфигом Vector с помощью модуля ansible.builtin.copy + TASK [Vector. Create vector.service daemon] - создает файл юнита systemd /lib/systemd/system/vector.service с помощью модуля ansible.builtin.copy + TASK [Vector. Modify vector.service file] - редактирует файл юнита systemd /lib/systemd/system/vector.service с помощью модуля ansible.builtin.replace + TASK [Vector. Create user vector] - создает пользователя ОС с помощью модуля ansible.builtin.user + TASK [Vector. Create data_dir] - создает каталог дял данных Vector с помощью модуля ansible.builtin.file + TASK [Vector. Remove work directory] - удаляет рабочий каталог с помощью модуля ansible.builtin.file + RUNNING HANDLER [Start Vector service] - инициируется запуск хандлера Start Vector service, обновляющего конфигурацию systemd и стартующего сервис vector.service с помощью модуляansible.builtin.systemd From e2e479827ef2a6248716dcfd0a1c3a6ac747c354 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 8 Apr 2023 22:46:34 +0400 Subject: [PATCH 026/146] one --- .../playbook/group_vars/clickhouse/vars.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 08-ansible-03-yandex/playbook/group_vars/clickhouse/vars.yml diff --git a/08-ansible-03-yandex/playbook/group_vars/clickhouse/vars.yml b/08-ansible-03-yandex/playbook/group_vars/clickhouse/vars.yml new file mode 100644 index 000000000..da987492b --- /dev/null +++ b/08-ansible-03-yandex/playbook/group_vars/clickhouse/vars.yml @@ -0,0 +1,6 @@ +--- +clickhouse_version: "22.3.3.44" +clickhouse_packages: + - clickhouse-client + - clickhouse-server + - clickhouse-common-static From f71d07f5041fada196ddb1050e55f834b76e0fa6 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 8 Apr 2023 22:48:38 +0400 Subject: [PATCH 027/146] Create vars.yaml --- 08-ansible-03-yandex/playbook/group_vars/lighthouse/vars.yaml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 08-ansible-03-yandex/playbook/group_vars/lighthouse/vars.yaml diff --git a/08-ansible-03-yandex/playbook/group_vars/lighthouse/vars.yaml b/08-ansible-03-yandex/playbook/group_vars/lighthouse/vars.yaml new file mode 100644 index 000000000..c458044ac --- /dev/null +++ b/08-ansible-03-yandex/playbook/group_vars/lighthouse/vars.yaml @@ -0,0 +1,3 @@ +ighthouse_vcs: https://github.com/VKCOM/lighthouse.git +lighthouse_location_dir: /home/lsd/ligthouse +lighthouse_access_log_name: lighthouse_access From 9b9084ea6785aa0dacea0cf6adf0fe4633215a3f Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 8 Apr 2023 22:50:56 +0400 Subject: [PATCH 028/146] Create vars.yaml --- 08-ansible-03-yandex/playbook/group_vars/vector/vars.yaml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 08-ansible-03-yandex/playbook/group_vars/vector/vars.yaml diff --git a/08-ansible-03-yandex/playbook/group_vars/vector/vars.yaml b/08-ansible-03-yandex/playbook/group_vars/vector/vars.yaml new file mode 100644 index 000000000..57900f57b --- /dev/null +++ b/08-ansible-03-yandex/playbook/group_vars/vector/vars.yaml @@ -0,0 +1,3 @@ +--- +vector_url: "https://packages.timber.io/vector/0.28.0/vector-0.28.0-1.x86_64.rpm" +vector_version: "0.28.0" From fb6c77a6a50bfa055a662e9411f5f588f9925804 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 8 Apr 2023 22:54:26 +0400 Subject: [PATCH 029/146] Create prod.yml --- 08-ansible-03-yandex/playbook/inventory/prod.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 08-ansible-03-yandex/playbook/inventory/prod.yml diff --git a/08-ansible-03-yandex/playbook/inventory/prod.yml b/08-ansible-03-yandex/playbook/inventory/prod.yml new file mode 100644 index 000000000..c5275863e --- /dev/null +++ b/08-ansible-03-yandex/playbook/inventory/prod.yml @@ -0,0 +1,16 @@ +--- +clickhouse: + hosts: + clickhouse: + ansible_host: 130.193.34.245 + ansible_user: admin +vector: + hosts: + vector: + ansible_host: 158.160.19.60 + ansible_user: admin +lighthouse: + hosts: + lighthouse: + ansible_host: 158.160.17.118 + ansible_user: admin From 0a9d8e88ab9f0bd4d2816e4e7c4fff7b3aaba129 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 8 Apr 2023 22:56:49 +0400 Subject: [PATCH 030/146] Create lighthouse.conf.j2 --- .../playbook/template/lighthouse.conf.j2 | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 08-ansible-03-yandex/playbook/template/lighthouse.conf.j2 diff --git a/08-ansible-03-yandex/playbook/template/lighthouse.conf.j2 b/08-ansible-03-yandex/playbook/template/lighthouse.conf.j2 new file mode 100644 index 000000000..d6bbe193c --- /dev/null +++ b/08-ansible-03-yandex/playbook/template/lighthouse.conf.j2 @@ -0,0 +1,12 @@ +server { + listen 80; + server_name localhost; + + access_log /var/log/nginx/{{ lighthouse_access_log_name }}.log main; + + location / { + root {{ lighthouse_location_dir }}; + index index.html; + } + +} From bddf6e52fde562bb34eb0b9765bee7074c8b265b Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 8 Apr 2023 22:58:38 +0400 Subject: [PATCH 031/146] Create nging.conf.j2 --- .../playbook/template/nging.conf.j2 | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 08-ansible-03-yandex/playbook/template/nging.conf.j2 diff --git a/08-ansible-03-yandex/playbook/template/nging.conf.j2 b/08-ansible-03-yandex/playbook/template/nging.conf.j2 new file mode 100644 index 000000000..fd980bf06 --- /dev/null +++ b/08-ansible-03-yandex/playbook/template/nging.conf.j2 @@ -0,0 +1,22 @@ +user lsd; ## Default: nobody +worker_processes 1; ## Default: 1 + +error_log /var/log/nginx/error.log; +pid /var/run/nginx.pid; + + +events { + worker_connections 1024; ## Default: 1024 +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] $status ' + '"$request" $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; From f76e91bfce3fac6a68bf19111a51b6ab8a578732 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 8 Apr 2023 22:59:53 +0400 Subject: [PATCH 032/146] Create vector.cfg.j2 --- .../playbook/template/vector.cfg.j2 | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 08-ansible-03-yandex/playbook/template/vector.cfg.j2 diff --git a/08-ansible-03-yandex/playbook/template/vector.cfg.j2 b/08-ansible-03-yandex/playbook/template/vector.cfg.j2 new file mode 100644 index 000000000..cf9414aaf --- /dev/null +++ b/08-ansible-03-yandex/playbook/template/vector.cfg.j2 @@ -0,0 +1,19 @@ +vector_config: + sources: + our_log: + type: file + ignore_older_secs: 600 + include: + - /home/lsd/logs/*.log + read_from: beginning + sinks: + to_clickhouse: + type: clickhouse + inputs: + - our_log + database: custom + endpoint: http://158.160.19.60:8123 + table: my_table + compression: gzip + healthcheck: false + skip_unknown_fields: true From 7471ad8772d58e7be8cfc53bea27a8ea0a6eaecb Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 8 Apr 2023 23:02:55 +0400 Subject: [PATCH 033/146] Create requirements.yml --- 08-ansible-03-yandex/playbook/requirements.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 08-ansible-03-yandex/playbook/requirements.yml diff --git a/08-ansible-03-yandex/playbook/requirements.yml b/08-ansible-03-yandex/playbook/requirements.yml new file mode 100644 index 000000000..41e3f42eb --- /dev/null +++ b/08-ansible-03-yandex/playbook/requirements.yml @@ -0,0 +1,18 @@ +-- +- name: nginx-role + src: https://github.com/NamorNinayzuk/nginx-role + scm: git + version: 0.0.1 +- name: lighthouse-role + src: https://github.com/NamorNinayzuk/lighthouse-role + scm: git + version: 0.0.3 +- name: vector-role + src: https://github.com/NamorNinayzuk/vector-role + scm: git + version: 0.0.4 +- src: git@github.com:AlexeySetevoi/ansible-clickhouse.git +# - src: git@gitlab.com:naturalis/core/analytics/ansible-clickhouse.git + name: clickhouse + scm: git + version: "1.11.0" From 5d462d3e6244a7d147802255cd8b2e3f28fa946d Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sat, 8 Apr 2023 23:05:03 +0400 Subject: [PATCH 034/146] Create site.yml --- 08-ansible-03-yandex/playbook/site.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 08-ansible-03-yandex/playbook/site.yml diff --git a/08-ansible-03-yandex/playbook/site.yml b/08-ansible-03-yandex/playbook/site.yml new file mode 100644 index 000000000..68d18b635 --- /dev/null +++ b/08-ansible-03-yandex/playbook/site.yml @@ -0,0 +1,14 @@ +--- +- name: Install nginx, lighthouse + hosts: lighthouse + roles: + - nginx-role + - lighthouse-role +- name: Install vector + hosts: vector + roles: + - vector-role +- name: Install clickhouse + hosts: clickhouse + roles: + - clickhouse From 183f72fe82645b1514d6d32e9d018352d1253350 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sun, 9 Apr 2023 18:48:14 +0400 Subject: [PATCH 035/146] 08-ansible-03-yandex --- .../README.md" | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 "08-ansible-03-\321\217\320\275\320\264\320\265\320\272\321\201/\321\201\320\261\320\276\321\200\320\275\320\270\320\272 \320\277\321\214\320\265\321\201/README.md" diff --git "a/08-ansible-03-\321\217\320\275\320\264\320\265\320\272\321\201/\321\201\320\261\320\276\321\200\320\275\320\270\320\272 \320\277\321\214\320\265\321\201/README.md" "b/08-ansible-03-\321\217\320\275\320\264\320\265\320\272\321\201/\321\201\320\261\320\276\321\200\320\275\320\270\320\272 \320\277\321\214\320\265\321\201/README.md" new file mode 100644 index 000000000..2549e55bc --- /dev/null +++ "b/08-ansible-03-\321\217\320\275\320\264\320\265\320\272\321\201/\321\201\320\261\320\276\321\200\320\275\320\270\320\272 \320\277\321\214\320\265\321\201/README.md" @@ -0,0 +1,39 @@ +### Описание Play + +Предназначен для установки `clickhouse`, `vector`, `nginx` и `lighthouse` на 3 VM в yandex cloud. + +### ГРУППОВЫЕ ВАРИАЦИИ + +`lighthouse_vcs` - git репозиторий lighthouse + +`lighthouse_location_dir` - локальная директория lighthouse + +`clickhouse_version` - версия clickhouse + +`clickhouse_packages` - необходимые для установки пакеты clickhouse + +`vector_version` - версия vector + +`vector_home` - домашняя директория vector + +### Установить вектор + +__Установлены теги:__ + +`vector_dir` - создание домашней директории + +`vector` - распаковка установочного архива в домашнюю директорию + +`vector_template` - копирование файла конфигурации + +`install nginx` - установлен nginx + +`установить маяк` - установлен маяк + +### Шаблон + +`lighthouse.conf` - конфигурация lighthouse + +`nginx.conf` - конфигурация nginx + +`vector.cfg` - конфигурация vector From 328667dd34114269d98970a34fdee864927a6970 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sun, 9 Apr 2023 18:50:39 +0400 Subject: [PATCH 036/146] 08-ansible-03-yandex --- 08-ansible-03-yandex/README.md | 126 ++++++++++++++++++++++++++++++--- 1 file changed, 117 insertions(+), 9 deletions(-) diff --git a/08-ansible-03-yandex/README.md b/08-ansible-03-yandex/README.md index d891825c8..01d2a1c02 100644 --- a/08-ansible-03-yandex/README.md +++ b/08-ansible-03-yandex/README.md @@ -1,28 +1,136 @@ -# Домашнее задание к занятию "3. Использование Yandex Cloud" - ## Подготовка к выполнению 1. Подготовьте в Yandex Cloud три хоста: для `clickhouse`, для `vector` и для `lighthouse`. +

+ +

+ Ссылка на репозиторий LightHouse: https://github.com/VKCOM/lighthouse ## Основная часть 1. Допишите playbook: нужно сделать ещё один play, который устанавливает и настраивает lighthouse. + +``yaml +- название: Установить NGINX + хосты: lighthouse + обработчики: + - название: start-nginx + стать: истинным + команда: nginx + - название: перезагрузка-nginx + стать: истинным + команда: перезагрузка nginx -s + задачи: + - название: Установить epel-релиз + стать: истинным + ansible.builtin.yum: + название: epel-release.noarch + состояние: последняя версия + - название: Установить NGINX + стать: истинным + ansible.builtin.yum: + название: nginx + состояние: настоящее время + уведомить: запустить-nginx + - название: Создать общую конфигурацию NGINX + стать: истинным + шаблон: + src: "template/nging.conf.j2" + dest: "/etc/nginx/nginx.conf" + режим: 0755 + уведомить: перезагрузить-nginx + теги: установить nginx +- название: Установить маяк + обработчики: + - название: start-nginx + стать: истинным + команда: nginx + - название: перезагрузка-nginx + стать: истинным + команда: перезагрузка nginx -s + хосты: lighthouse + предварительные задачи: + - название: Установить маяк зависимостей + стать: истинным + ansible.builtin.yum: + название: git + состояние: настоящее время + задачи: + - название: Копия из git lighthouse + git: + репо: "{{ lighthouse_vcs }}" + версия: master + dest: "{{ lighthouse_location_dir }}" + - название: Создать конфигурацию маяка + стать: истинным + шаблон: + src: "шаблон/lighthouse.conf.j2" + dest: "/etc/nginx/conf.d/default.conf" + режим: 0644 + уведомить: перезагрузить-nginx +``` + 2. При создании tasks рекомендую использовать модули: `get_url`, `template`, `yum`, `apt`. + 3. Tasks должны: скачать статику lighthouse, установить nginx или любой другой webserver, настроить его конфиг для открытия lighthouse, запустить webserver. + +``yaml +пользователь lsd; +worker_processes 1; +error_log /var/log/nginx/ошибка.log; +pid /var/выполнить/nginx.pid; +события { + worker_connections 1024; ## По умолчанию: 1024 +} +http { + включить /etc/nginx/mime.types; + default_type приложение/октет-поток; + log_format main '$remote_addr - $remote_user [$time_local] $статус ' + '"$request" $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + access_log /var/log/nginx/access.log главная; + отправить файл на; + #tcp_nopush на; + + сохраняйте время выполнения 65; + gzip на; + включить /etc/nginx/conf.d/*.conf; +``` + 4. Приготовьте свой собственный inventory файл `prod.yml`. + +``yaml +--- +clickhouse: + hosts: + clickhouse: + ansible_host: 130.193.34.245 + ansible_user: admin +vector: + hosts: + vector: + ansible_host: 158.160.19.60 + ansible_user: admin +lighthouse: + hosts: + lighthouse: + ansible_host: 158.160.17.118 + ansible_user: admin + +``` + 5. Запустите `ansible-lint site.yml` и исправьте ошибки, если они есть. + 6. Попробуйте запустить playbook на этом окружении с флагом `--check`. + 7. Запустите playbook на `prod.yml` окружении с флагом `--diff`. Убедитесь, что изменения на системе произведены. -8. Повторно запустите playbook с флагом `--diff` и убедитесь, что playbook идемпотентен. -9. Подготовьте README.md файл по своему playbook. В нём должно быть описано: что делает playbook, какие у него есть параметры и теги. -10. Готовый playbook выложите в свой репозиторий, поставьте тег `08-ansible-03-yandex` на фиксирующий коммит, в ответ предоставьте ссылку на него. ---- +8. Повторно запустите playbook с флагом `--diff` и убедитесь, что playbook идемпотентен. -### Как оформить ДЗ? +9. Подготовьте [README.md](https://github.com/NamorNinayzuk/mnt-homeworks/tree/MNT-video/08-ansible-03-yandex/README.md) файл по своему playbook. В нём должно быть описано: что делает playbook, какие у него есть параметры и теги. -Выполненное домашнее задание пришлите ссылкой на .md-файл в вашем репозитории. +10. Готовый playbook выложите в свой репозиторий, поставьте тег `08-ansible-03-yandex` на фиксирующий коммит, в ответ предоставьте ссылку на него. ---- +https://github.com/NamorNinayzuk/mnt-homeworks/tree/MNT-video/08-ansible-03-yandex/playbook From b8ac2c36e59eb7f5f1999919d2fda9f4507706c8 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sun, 9 Apr 2023 19:15:21 +0400 Subject: [PATCH 037/146] 08-ansible-03-yandex --- 08-ansible-03-yandex/README.md | 145 ++++++++++++++++----------------- 1 file changed, 71 insertions(+), 74 deletions(-) diff --git a/08-ansible-03-yandex/README.md b/08-ansible-03-yandex/README.md index 01d2a1c02..395d3cda6 100644 --- a/08-ansible-03-yandex/README.md +++ b/08-ansible-03-yandex/README.md @@ -2,106 +2,104 @@ 1. Подготовьте в Yandex Cloud три хоста: для `clickhouse`, для `vector` и для `lighthouse`. -

- -

+![Yandex Cloud](https://imgur.com/a/ZI47mGz) Ссылка на репозиторий LightHouse: https://github.com/VKCOM/lighthouse ## Основная часть 1. Допишите playbook: нужно сделать ещё один play, который устанавливает и настраивает lighthouse. -``yaml -- название: Установить NGINX - хосты: lighthouse - обработчики: - - название: start-nginx - стать: истинным - команда: nginx - - название: перезагрузка-nginx - стать: истинным - команда: перезагрузка nginx -s - задачи: - - название: Установить epel-релиз - стать: истинным +```yaml +- name: Install NGINX + hosts: lighthouse + handlers: + - name: start-nginx + become: true + command: nginx + - name: reload-nginx + become: true + command: nginx -s reload + tasks: + - name: Install epel-release + become: true ansible.builtin.yum: - название: epel-release.noarch - состояние: последняя версия - - название: Установить NGINX - стать: истинным + name: epel-release.noarch + state: latest + - name: Install NGINX + become: true ansible.builtin.yum: - название: nginx - состояние: настоящее время - уведомить: запустить-nginx - - название: Создать общую конфигурацию NGINX - стать: истинным - шаблон: + name: nginx + state: present + notify: start-nginx + - name: Create general config NGINX + become: true + template: src: "template/nging.conf.j2" dest: "/etc/nginx/nginx.conf" - режим: 0755 - уведомить: перезагрузить-nginx - теги: установить nginx -- название: Установить маяк - обработчики: - - название: start-nginx - стать: истинным - команда: nginx - - название: перезагрузка-nginx - стать: истинным - команда: перезагрузка nginx -s - хосты: lighthouse - предварительные задачи: - - название: Установить маяк зависимостей - стать: истинным + mode: 0755 + notify: reload-nginx + tags: install nginx +- name: Install lighthouse + handlers: + - name: start-nginx + become: true + command: nginx + - name: reload-nginx + become: true + command: nginx -s reload + hosts: lighthouse + pre_tasks: + - name: Install dependencies lighthouse + become: true ansible.builtin.yum: - название: git - состояние: настоящее время - задачи: - - название: Копия из git lighthouse + name: git + state: present + tasks: + - name: Copy from git lighthouse git: - репо: "{{ lighthouse_vcs }}" - версия: master + repo: "{{ lighthouse_vcs }}" + version: master dest: "{{ lighthouse_location_dir }}" - - название: Создать конфигурацию маяка - стать: истинным - шаблон: - src: "шаблон/lighthouse.conf.j2" + - name: Create lighthouse config + become: true + template: + src: "template/lighthouse.conf.j2" dest: "/etc/nginx/conf.d/default.conf" - режим: 0644 - уведомить: перезагрузить-nginx + mode: 0644 + notify: reload-nginx ``` 2. При создании tasks рекомендую использовать модули: `get_url`, `template`, `yum`, `apt`. 3. Tasks должны: скачать статику lighthouse, установить nginx или любой другой webserver, настроить его конфиг для открытия lighthouse, запустить webserver. -``yaml -пользователь lsd; -worker_processes 1; -error_log /var/log/nginx/ошибка.log; -pid /var/выполнить/nginx.pid; -события { - worker_connections 1024; ## По умолчанию: 1024 +```yaml +user lsd; ## Default: nobody +worker_processes 1; ## Default: 1 +error_log /var/log/nginx/error.log; +pid /var/run/nginx.pid; +events { + worker_connections 1024; ## Default: 1024 } http { - включить /etc/nginx/mime.types; - default_type приложение/октет-поток; - log_format main '$remote_addr - $remote_user [$time_local] $статус ' + include /etc/nginx/mime.types; + default_type application/octet-stream; + log_format main '$remote_addr - $remote_user [$time_local] $status ' '"$request" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; - access_log /var/log/nginx/access.log главная; - отправить файл на; - #tcp_nopush на; + access_log /var/log/nginx/access.log main; + sendfile on; + #tcp_nopush on; - сохраняйте время выполнения 65; - gzip на; - включить /etc/nginx/conf.d/*.conf; + keepalive_timeout 65; + gzip on; + include /etc/nginx/conf.d/*.conf; ``` 4. Приготовьте свой собственный inventory файл `prod.yml`. -``yaml +```yaml --- clickhouse: hosts: @@ -129,8 +127,7 @@ lighthouse: 8. Повторно запустите playbook с флагом `--diff` и убедитесь, что playbook идемпотентен. -9. Подготовьте [README.md](https://github.com/NamorNinayzuk/mnt-homeworks/tree/MNT-video/08-ansible-03-yandex/README.md) файл по своему playbook. В нём должно быть описано: что делает playbook, какие у него есть параметры и теги. - +9. Подготовьте README.md файл по своему playbook. В нём должно быть описано: что делает playbook, какие у него есть параметры и теги. +[README.md](https://github.com/NamorNinayzuk/mnt-homeworks/tree/MNT-video/08-ansible-03-yandex/README.md) 10. Готовый playbook выложите в свой репозиторий, поставьте тег `08-ansible-03-yandex` на фиксирующий коммит, в ответ предоставьте ссылку на него. - -https://github.com/NamorNinayzuk/mnt-homeworks/tree/MNT-video/08-ansible-03-yandex/playbook +[Playbook](https://github.com/NamorNinayzuk/mnt-homeworks/tree/MNT-video/08-ansible-03-yandex/playbook) From 7a96960b8590b98524d0a18291699250e7bcccac Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sun, 9 Apr 2023 19:16:44 +0400 Subject: [PATCH 038/146] Update README.md --- 08-ansible-03-yandex/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/08-ansible-03-yandex/README.md b/08-ansible-03-yandex/README.md index 395d3cda6..8dbc74268 100644 --- a/08-ansible-03-yandex/README.md +++ b/08-ansible-03-yandex/README.md @@ -3,7 +3,7 @@ 1. Подготовьте в Yandex Cloud три хоста: для `clickhouse`, для `vector` и для `lighthouse`. -![Yandex Cloud](https://imgur.com/a/ZI47mGz) +![Yandex Cloud]([https://imgur.com/a/ZI47mGz](https://i.imgur.com/YDbMeOd.png)) Ссылка на репозиторий LightHouse: https://github.com/VKCOM/lighthouse ## Основная часть From cdfdfbd78fbef76ca7f416a3e5506eb8a56bb583 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sun, 9 Apr 2023 19:19:40 +0400 Subject: [PATCH 039/146] Update README.md --- 08-ansible-03-yandex/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/08-ansible-03-yandex/README.md b/08-ansible-03-yandex/README.md index 8dbc74268..e1e9135bf 100644 --- a/08-ansible-03-yandex/README.md +++ b/08-ansible-03-yandex/README.md @@ -3,7 +3,7 @@ 1. Подготовьте в Yandex Cloud три хоста: для `clickhouse`, для `vector` и для `lighthouse`. -![Yandex Cloud]([https://imgur.com/a/ZI47mGz](https://i.imgur.com/YDbMeOd.png)) +![Yandex Cloud](https://i.imgur.com/YDbMeOd.png) Ссылка на репозиторий LightHouse: https://github.com/VKCOM/lighthouse ## Основная часть From 7a22f826de30ac78e368d057c1df06abbc8d70b3 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sun, 9 Apr 2023 19:43:33 +0400 Subject: [PATCH 040/146] 08-ansible-02-playbook --- 08-ansible-02-playbook/README.md | 112 +++++++++++++++---------------- 1 file changed, 53 insertions(+), 59 deletions(-) diff --git a/08-ansible-02-playbook/README.md b/08-ansible-02-playbook/README.md index 513203514..e8d7929a6 100644 --- a/08-ansible-02-playbook/README.md +++ b/08-ansible-02-playbook/README.md @@ -11,17 +11,15 @@ 1. Приготовьте свой собственный inventory файл [prod.yml](https://github.com/NamorNinayzuk/mnt-homeworks/blob/MNT-video/08-ansible-02-playbook/playbook/inventory/prod.yml "жмакай") -
- `prod.yml` - - ``` +`prod.yml` + ```yml --- clickhouse: hosts: clickhouse-01: ansible_host: "172.17.0.110" ``` -
+ 2. Допишите playbook: нужно сделать ещё один play, который устанавливает и настраивает [vector](https://vector.dev). @@ -34,27 +32,24 @@ clickhouse: ![Play_deinstall_deb_pack_clickhouse](https://i.imgur.com/QdtNPxo.png) 3. При создании tasks рекомендую использовать модули: `get_url`, `template`, `unarchive`, `file`. - -
Mods -
-ansible.builtin.get_url
-ansible.builtin.apt
-ansible.builtin.meta
-ansible.builtin.pause
-ansible.builtin.command
-ansible.builtin.file
-ansible.builtin.unarchive
-ansible.builtin.copy
-ansible.builtin.replace
-ansible.builtin.user
-ansible.builtin.service
-ansible.builtin.systemd
-    
-
+ - Mods +`ansible.builtin.get_url` +`ansible.builtin.apt` +`ansible.builtin.meta` +`ansible.builtin.pause` +`ansible.builtin.command` +`ansible.builtin.file` +`ansible.builtin.unarchive` +`ansible.builtin.copy` +`ansible.builtin.replace` +`ansible.builtin.user` +`ansible.builtin.service` +`ansible.builtin.systemd` + 4. Tasks должны: скачать нужной версии дистрибутив, выполнить распаковку в выбранную директорию, установить vector. -
- All in `site.yml` +All in `site.yml` - ``` + ```yml --- - name: Install Clickhouse & Vector hosts: clickhouse @@ -213,7 +208,7 @@ ansible.builtin.systemd tags: vector ``` -
+ 5. Запустите `ansible-lint site.yml` и исправьте ошибки, если они есть. ![ansible-lint](https://i.imgur.com/EQQbee9.png) @@ -242,70 +237,71 @@ ansible.builtin.systemd 9. Подготовьте README.md файл по своему playbook. В нём должно быть описано: что делает playbook, какие у него есть параметры и теги. -[playbook/site.yml](https://github.com/NamorNinayzuk/mnt-homeworks/blob/MNT-video/08-ansible-02-playbook/playbook/site.yml "жмакай") содержит 2 блока задач: +[playbook/site.yml](https://github.com/NamorNinayzuk/mnt-homeworks/blob/MNT-video/08-ansible-02-playbook/playbook/site.yml ) содержит 2 блока задач: + +Первый блок объединяет последовательность задач по инсталяции Clickhouse. Блоку соответствует тэг `clickhouse`. В блоке используются параметры: -Первый блок объединяет последовательность задач по инсталяции Clickhouse. Блоку соответствует тэг clickhouse. В блоке используются параметры: +`clickhouse_version: "22.3.3.44"` - версия Clickhouse -clickhouse_version: "22.3.3.44" - версия Clickhouse +`clickhouse_packages: ["clickhouse-client", "clickhouse-server", "clickhouse-common-static"]` - список пакетов для установки -clickhouse_packages: ["clickhouse-client", "clickhouse-server", "clickhouse-common-static"] - список пакетов для установки -Task' +### Task's из них: -TASK [Clickhouse. Get clickhouse distrib] - скачивает deb-пакеты с дистрибутивами с помощью модуля ansible.builtin.get_url +`TASK [Clickhouse. Get clickhouse distrib]` - скачивает deb-пакеты с дистрибутивами с помощью модуля ansible.builtin.get_url -TASK [Clickhouse. Install package clickhouse-common-static] - устанавливает deb-пакет с помощью модуля ansible.builtin.apt +`TASK [Clickhouse. Install package clickhouse-common-static]` - устанавливает deb-пакет с помощью модуля ansible.builtin.apt -TASK [Clickhouse. Install package clickhouse-client] - устанавливает deb-пакет с помощью модуля ansible.builtin.apt +`TASK [Clickhouse. Install package clickhouse-client]` - устанавливает deb-пакет с помощью модуля ansible.builtin.apt -TASK [Clickhouse. Install clickhouse package clickhouse-server] - устанавливает deb-пакеты с помощью модуля ansible.builtin.apt +`TASK [Clickhouse. Install clickhouse package clickhouse-server]` - устанавливает deb-пакеты с помощью модуля ansible.builtin.apt -TASK [Clickhouse. Flush handlers] - инициирует внеочередной запуск хандлера Start clickhouse service +`TASK [Clickhouse. Flush handlers]` - инициирует внеочередной запуск хандлера Start clickhouse service -RUNNING HANDLER [Start clickhouse service] - для старта сервера clickhouse в хандлере используется модуль ansible.builtin.service +`RUNNING HANDLER [Start clickhouse service]` - для старта сервера clickhouse в хандлере используется модуль ansible.builtin.service -TASK [Clickhouse. Waiting while clickhouse-server is available...] - устанавливает паузу в 10 секунд с помощью модуля ansible.builtin.pause, чтобы сервер Clickhouse успел запуститься. Иначе следующая задача по созданию БД может завершиться ошибкой, т.к. сервер еще не успел подняться. +`TASK [Clickhouse. Waiting while clickhouse-server is available...]` - устанавливает паузу в 10 секунд с помощью модуля ansible.builtin.pause, чтобы сервер Clickhouse успел запуститься. Иначе следующая задача по созданию БД может завершиться ошибкой, т.к. сервер еще не успел подняться. -TASK [Clickhouse. Create database] - создает инстанс базы данных Clickhouse +`TASK [Clickhouse. Create database]` - создает инстанс базы данных Clickhouse -Второй блок объединяет последовательность задач по инсталяции Vector. Блоку соответствует тэг vector. В блоке используются параметры: +Второй блок объединяет последовательность задач по инсталяции Vector. Блоку соответствует тэг `vector`. В блоке используются параметры: -vector_version: "0.21.1" - версия Vector +`vector_version: "0.21.1"` - версия Vector -vector_os_arh: "x86_64" - архитектура ОС +`vector_os_arh: "x86_64"` - архитектура ОС -vector_workdir: "/home/vector" - рабочий каталог, в котором будут сохранены скачанные deb-пакеты +`vector_workdir: "/home/vector"` - рабочий каталог, в котором будут сохранены скачанные deb-пакеты -vector_os_user: "vector" - имя пользователя-владельца Vector в ОС +`vector_os_user: "vector"` - имя пользователя-владельца Vector в ОС -vector_os_group: "vector" - имя группы пользователя-владельца Vector в ОС +`vector_os_group: "vector"` - имя группы пользователя-владельца Vector в ОС -Task: +### Task: -TASK [Vector. Create work directory] - создает рабочий каталог, в котором будут сохранены скачанные deb-пакеты, с помощью модуля ansible.builtin.file +`TASK [Vector. Create work directory]` - создает рабочий каталог, в котором будут сохранены скачанные deb-пакеты, с помощью модуля ansible.builtin.file -TASK [Vector. Get Vector distributive] - скачивает архив с дистрибутивом с помощью модуля ansible.builtin.get_url +`TASK [Vector. Get Vector distributive]` - скачивает архив с дистрибутивом с помощью модуля ansible.builtin.get_url -TASK [Vector. Unzip archive] - распаковывает скачанный архив с помощью модуля ansible.builtin.unarchive +`TASK [Vector. Unzip archive]` - распаковывает скачанный архив с помощью модуля ansible.builtin.unarchive -TASK [Vector. Install vector binary file] - копирует исполняемый файл Vector в /usr/bin с помощью модуля ansible.builtin.copy +`TASK [Vector. Install vector binary file]` - копирует исполняемый файл Vector в /usr/bin с помощью модуля ansible.builtin.copy -TASK [Vector. Check Vector installation] - проверяет, что бинарный файл Vector работает корректно, с помощью модуля ansible.builtin.command +`TASK [Vector. Check Vector installation]` - проверяет, что бинарный файл Vector работает корректно, с помощью модуля ansible.builtin.command -TASK [Vector. Create Vector config vector.toml] - создает файл /etc/vector/vector.toml с конфигом Vector с помощью модуля ansible.builtin.copy +`TASK [Vector. Create Vector config vector.toml]` - создает файл /etc/vector/vector.toml с конфигом Vector с помощью модуля ansible.builtin.copy -TASK [Vector. Create vector.service daemon] - создает файл юнита systemd /lib/systemd/system/vector.service с помощью модуля ansible.builtin.copy +`TASK [Vector. Create vector.service daemon]` - создает файл юнита systemd /lib/systemd/system/vector.service с помощью модуля ansible.builtin.copy -TASK [Vector. Modify vector.service file] - редактирует файл юнита systemd /lib/systemd/system/vector.service с помощью модуля ansible.builtin.replace +`TASK [Vector. Modify vector.service file]` - редактирует файл юнита systemd /lib/systemd/system/vector.service с помощью модуля ansible.builtin.replace -TASK [Vector. Create user vector] - создает пользователя ОС с помощью модуля ansible.builtin.user +`TASK [Vector. Create user vector]` - создает пользователя ОС с помощью модуля ansible.builtin.user -TASK [Vector. Create data_dir] - создает каталог дял данных Vector с помощью модуля ansible.builtin.file +`TASK [Vector. Create data_dir]` - создает каталог дял данных Vector с помощью модуля ansible.builtin.file -TASK [Vector. Remove work directory] - удаляет рабочий каталог с помощью модуля ansible.builtin.file +`TASK [Vector. Remove work directory]` - удаляет рабочий каталог с помощью модуля ansible.builtin.file -RUNNING HANDLER [Start Vector service] - инициируется запуск хандлера Start Vector service, обновляющего конфигурацию systemd и стартующего сервис vector.service с помощью модуляansible.builtin.systemd +`RUNNING HANDLER [Start Vector service]` - инициируется запуск хандлера Start Vector service, обновляющего конфигурацию systemd и стартующего сервис vector.service с помощью модуляansible.builtin.systemd 10. Готовый playbook выложите в свой репозиторий, поставьте тег `08-ansible-02-playbook` на фиксирующий коммит, в ответ предоставьте ссылку на него. @@ -316,5 +312,3 @@ RUNNING HANDLER [Start Vector service] - инициируется запуск ### Как оформить ДЗ? Выполненное домашнее задание пришлите ссылкой на .md-файл в вашем репозитории. - ---- From ded8a43bc10708290604d2c5185ffd2f6fc612d0 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sun, 9 Apr 2023 19:46:09 +0400 Subject: [PATCH 041/146] 08-ansible-02-playbook --- 08-ansible-02-playbook/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/08-ansible-02-playbook/README.md b/08-ansible-02-playbook/README.md index e8d7929a6..480988bc8 100644 --- a/08-ansible-02-playbook/README.md +++ b/08-ansible-02-playbook/README.md @@ -33,17 +33,29 @@ clickhouse: 3. При создании tasks рекомендую использовать модули: `get_url`, `template`, `unarchive`, `file`. - Mods + `ansible.builtin.get_url` + `ansible.builtin.apt` + `ansible.builtin.meta` + `ansible.builtin.pause` + `ansible.builtin.command` + `ansible.builtin.file` + `ansible.builtin.unarchive` + `ansible.builtin.copy` + `ansible.builtin.replace` + `ansible.builtin.user` + `ansible.builtin.service` + `ansible.builtin.systemd` 4. Tasks должны: скачать нужной версии дистрибутив, выполнить распаковку в выбранную директорию, установить vector. From 2cf96f72a88043d574be559885cf83a2b7ca41c8 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Mon, 10 Apr 2023 00:16:39 +0400 Subject: [PATCH 042/146] Update README.md --- 08-ansible-04-role/README.md | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/08-ansible-04-role/README.md b/08-ansible-04-role/README.md index 79410726c..482f83521 100644 --- a/08-ansible-04-role/README.md +++ b/08-ansible-04-role/README.md @@ -20,8 +20,42 @@ ``` 2. При помощи `ansible-galaxy` скачать себе эту роль. + +Загрузка ролей выполняется командой: `ansible-galaxy install -r <файл>`, где `<файл>` - YAML файл с информацией о требуемых компонентах (ролях), включая информацию о способе их получения. + +Если используемая роль уже загружена или её нужно обновить, то необходимо добавить ключ `--force` +```console +┌──(kali㉿kali)-[~/devops-netology8.4] +└─$ ansible-galaxy install -r requirements.yml +Starting galaxy role install process +- extracting clickhouse to /home/kali/.ansible/roles/clickhouse +- clickhouse (1.11.0) was installed successfully +┌──(kali㉿kali)-[~/devops-netology8.4] +└─$ +``` 3. Создать новый каталог с ролью при помощи `ansible-galaxy role init vector-role`. -4. На основе tasks из старого playbook заполните новую role. Разнесите переменные между `vars` и `default`. + +Для упрощения подготовки роли можно воспользоваться командой `ansible-galaxy role init <роль>`, где `<роль>` - имя инициализируемой роли. +Данная команда создаст шаблон новой роли, а именно - набор каталогов и предзаполненных файлов внутри директории `<роль>`. + +Пример вывода команды: +```console +┌──(kali㉿kali)-[~/devops-netology8.4] +└─$ ansible-galaxy role init vector-role +- Role vector-role was created successfully +┌──(kali㉿kali)-[~/devops-netology8.4] +└─$ ansible-galaxy role init lighthouse-role +- Role lighthouse-role was created successfully + +``` + +4. На основе tasks из старого playbook заполните новую role. Разнесите переменные между `vars` и `default`. + +В структуре каталогов роли переменные делятся на две группы: `defaults` и `vars`. +В **defaults** хранятся переменные и их значения по умолчанию, которые пользователь может переопределить на любом уровне (**group vars**, **host vars** и т.п.) +В **vars** хранятся переменные и их значения, которые обычно не предназначены для переопределения пользователем, а используются для упрощения дальнейшей разработки роли. +Исключение [--extra-vars](https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html), которые при передаче в командной строке `ansible-playbook` могут их переопределить. + 5. Перенести нужные шаблоны конфигов в `templates`. 6. Описать в `README.md` обе роли и их параметры. 7. Повторите шаги 3-6 для lighthouse. Помните, что одна роль должна настраивать один продукт. From 088c19eeccfb0fda130c09d56e3b82e3b944d433 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Tue, 11 Apr 2023 01:10:07 +0400 Subject: [PATCH 043/146] =?UTF-8?q?Delete=2008-ansible-03-=D1=8F=D0=BD?= =?UTF-8?q?=D0=B4=D0=B5=D0=BA=D1=81/=D1=81=D0=B1=D0=BE=D1=80=D0=BD=D0=B8?= =?UTF-8?q?=D0=BA=20=D0=BF=D1=8C=D0=B5=D1=81=20directory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md" | 39 ------------------- 1 file changed, 39 deletions(-) delete mode 100644 "08-ansible-03-\321\217\320\275\320\264\320\265\320\272\321\201/\321\201\320\261\320\276\321\200\320\275\320\270\320\272 \320\277\321\214\320\265\321\201/README.md" diff --git "a/08-ansible-03-\321\217\320\275\320\264\320\265\320\272\321\201/\321\201\320\261\320\276\321\200\320\275\320\270\320\272 \320\277\321\214\320\265\321\201/README.md" "b/08-ansible-03-\321\217\320\275\320\264\320\265\320\272\321\201/\321\201\320\261\320\276\321\200\320\275\320\270\320\272 \320\277\321\214\320\265\321\201/README.md" deleted file mode 100644 index 2549e55bc..000000000 --- "a/08-ansible-03-\321\217\320\275\320\264\320\265\320\272\321\201/\321\201\320\261\320\276\321\200\320\275\320\270\320\272 \320\277\321\214\320\265\321\201/README.md" +++ /dev/null @@ -1,39 +0,0 @@ -### Описание Play - -Предназначен для установки `clickhouse`, `vector`, `nginx` и `lighthouse` на 3 VM в yandex cloud. - -### ГРУППОВЫЕ ВАРИАЦИИ - -`lighthouse_vcs` - git репозиторий lighthouse - -`lighthouse_location_dir` - локальная директория lighthouse - -`clickhouse_version` - версия clickhouse - -`clickhouse_packages` - необходимые для установки пакеты clickhouse - -`vector_version` - версия vector - -`vector_home` - домашняя директория vector - -### Установить вектор - -__Установлены теги:__ - -`vector_dir` - создание домашней директории - -`vector` - распаковка установочного архива в домашнюю директорию - -`vector_template` - копирование файла конфигурации - -`install nginx` - установлен nginx - -`установить маяк` - установлен маяк - -### Шаблон - -`lighthouse.conf` - конфигурация lighthouse - -`nginx.conf` - конфигурация nginx - -`vector.cfg` - конфигурация vector From d6a3e5278d3f0880e46d2cae537c828295eea1ab Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Tue, 11 Apr 2023 01:14:06 +0400 Subject: [PATCH 044/146] Create prod.yml --- 08-ansible-04-role/inventory/prod.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 08-ansible-04-role/inventory/prod.yml diff --git a/08-ansible-04-role/inventory/prod.yml b/08-ansible-04-role/inventory/prod.yml new file mode 100644 index 000000000..c5275863e --- /dev/null +++ b/08-ansible-04-role/inventory/prod.yml @@ -0,0 +1,16 @@ +--- +clickhouse: + hosts: + clickhouse: + ansible_host: 130.193.34.245 + ansible_user: admin +vector: + hosts: + vector: + ansible_host: 158.160.19.60 + ansible_user: admin +lighthouse: + hosts: + lighthouse: + ansible_host: 158.160.17.118 + ansible_user: admin From 3f7fc480294760a09207ff5b24e10d255fcf197d Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Tue, 11 Apr 2023 01:18:32 +0400 Subject: [PATCH 045/146] Create requirements.yml --- 08-ansible-04-role/playbook/requirements.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 08-ansible-04-role/playbook/requirements.yml diff --git a/08-ansible-04-role/playbook/requirements.yml b/08-ansible-04-role/playbook/requirements.yml new file mode 100644 index 000000000..9cdca71fa --- /dev/null +++ b/08-ansible-04-role/playbook/requirements.yml @@ -0,0 +1,14 @@ +--- +- name: lighthouse-role + src: https://github.com/NamorNinayzuk/lighthouse-role + scm: git + version: 1.0.0 +- name: vector-role + src: https://github.com/NamorNinayzuk/vector-role + scm: git + version: 1.0.0 +- src: git@github.com:AlexeySetevoi/ansible-clickhouse.git + name: clickhouse + scm: git + version: "1.11.0" +--- From 1661bb0aae3fcbc8c42e4c5b28ee906a82956be2 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Tue, 11 Apr 2023 01:19:47 +0400 Subject: [PATCH 046/146] Create site.yml --- 08-ansible-04-role/playbook/site.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 08-ansible-04-role/playbook/site.yml diff --git a/08-ansible-04-role/playbook/site.yml b/08-ansible-04-role/playbook/site.yml new file mode 100644 index 000000000..0b7e45d3d --- /dev/null +++ b/08-ansible-04-role/playbook/site.yml @@ -0,0 +1,22 @@ +--- +- name: Install Clickhouse + hosts: clickhouse + roles: + - clickhouse + +- name: Install Vector + hosts: vector + roles: + - vector-role + +- name: Install Lighthouse + hosts: lighthouse + pre_tasks: + - name: install unzip + become: true + ansible.builtin.apt: + name: unzip + state: present + update_cache: yes + roles: + - lighthouse-role From 4be39da027f0296e878a38ea80bbe4693987c5dc Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Tue, 11 Apr 2023 23:58:46 +0400 Subject: [PATCH 047/146] Update README.md --- 08-ansible-04-role/README.md | 57 +++++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 7 deletions(-) diff --git a/08-ansible-04-role/README.md b/08-ansible-04-role/README.md index 482f83521..ec0bda7d9 100644 --- a/08-ansible-04-role/README.md +++ b/08-ansible-04-role/README.md @@ -56,13 +56,56 @@ Starting galaxy role install process В **vars** хранятся переменные и их значения, которые обычно не предназначены для переопределения пользователем, а используются для упрощения дальнейшей разработки роли. Исключение [--extra-vars](https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html), которые при передаче в командной строке `ansible-playbook` могут их переопределить. -5. Перенести нужные шаблоны конфигов в `templates`. -6. Описать в `README.md` обе роли и их параметры. -7. Повторите шаги 3-6 для lighthouse. Помните, что одна роль должна настраивать один продукт. -8. Выложите все roles в репозитории. Проставьте тэги, используя семантическую нумерацию Добавьте roles в `requirements.yml` в playbook. -9. Переработайте playbook на использование roles. Не забудьте про зависимости lighthouse и возможности совмещения `roles` с `tasks`. -10. Выложите playbook в репозиторий. -11. В ответ приведите ссылки на оба репозитория с roles и одну ссылку на репозиторий с playbook. + +# Playbook для установки Clickhouse, Vector и LightHouse +## Описание + +Репозиторий файлов [clickhouse](https://github.com/NamorNinayzuk/ansible-clickhouse) + +Репозиторий роли для [Vector](https://github.com/NamorNinayzuk/vector-role) + +Репозиторий роли для [Lighthouse](https://github.com/NamorNinayzuk/lighthouse-role) + +### Verctor-role +========= +Роль устанавливает ПО Vector. + +Предварительные требования +------------ + +Предполагается что роль будет выполняться на deb-based дистрибутивах Linux (Debian, Ubuntu). + +Переменные роли +-------------- + +В [переменных по умолчанию](./defaults/main.yml) указана версию ПО Vector 0.25.0, в случае необходимости её нужно изменить. + +Зависимости +------------ + +Нет зависимостей + +### Lighthouse-role +========= + +Роль устанавливает ПО Nginx и Lighthouse. + +Предварительные требования +------------ + +Предполагается что роль будет выполняться на deb-based дистрибутивах Linux (Debian, Ubuntu). +Предполагается что на машине уже будет установлена утилита unzip. + +Переменные роли +-------------- + +В [переменных по умолчанию](./defaults/main.yml) указана версия ПО Nginx 1.18.0, в случае необходимости её нужно изменить. +В [изменяемых переменных](./defaults/main.yml) указан порт по которому будет слушать ПО Lighthouse. По умолчанию это порт 80, в случае необходимости его можно изменить. + +Зависимости +------------ + +Нет зависимостей --- From 4b1c937e800e1806f5fc57198e2ddd53fb0567a7 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Wed, 12 Apr 2023 00:03:14 +0400 Subject: [PATCH 048/146] Update README.md --- 08-ansible-04-role/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/08-ansible-04-role/README.md b/08-ansible-04-role/README.md index ec0bda7d9..c27906009 100644 --- a/08-ansible-04-role/README.md +++ b/08-ansible-04-role/README.md @@ -78,7 +78,7 @@ Starting galaxy role install process Переменные роли -------------- -В [переменных по умолчанию](./defaults/main.yml) указана версию ПО Vector 0.25.0, в случае необходимости её нужно изменить. +В [переменных по умолчанию](https://github.com/NamorNinayzuk/vector-role/blob/main/defaults/main.yml) указана версию ПО Vector 0.25.0, в случае необходимости её нужно изменить. Зависимости ------------ @@ -99,8 +99,8 @@ Starting galaxy role install process Переменные роли -------------- -В [переменных по умолчанию](./defaults/main.yml) указана версия ПО Nginx 1.18.0, в случае необходимости её нужно изменить. -В [изменяемых переменных](./defaults/main.yml) указан порт по которому будет слушать ПО Lighthouse. По умолчанию это порт 80, в случае необходимости его можно изменить. +В [переменных по умолчанию](https://github.com/NamorNinayzuk/lighthouse-role/blob/main/defaults/main.yml) указана версия ПО Nginx 1.18.0, в случае необходимости её нужно изменить. +В [изменяемых переменных](https://github.com/NamorNinayzuk/lighthouse-role/blob/main/vars/main.yml) указан порт по которому будет слушать ПО Lighthouse. По умолчанию это порт 80, в случае необходимости его можно изменить. Зависимости ------------ From 700155a3f68a3a3ac8445240d46b04c0068f526c Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Wed, 12 Apr 2023 00:05:10 +0400 Subject: [PATCH 049/146] Update README.md --- 08-ansible-04-role/README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/08-ansible-04-role/README.md b/08-ansible-04-role/README.md index c27906009..ed375c354 100644 --- a/08-ansible-04-role/README.md +++ b/08-ansible-04-role/README.md @@ -107,6 +107,21 @@ Starting galaxy role install process Нет зависимостей +Пример с установкой утилиты Unzip в рамках pre_tasks в плее использующем данную роль: + +```yaml +- name: Install Lighthouse + hosts: lighthouse + pre_tasks: + - name: install unzip + become: true + ansible.builtin.apt: + name: unzip + state: present + update_cache: yes + roles: + - lighthouse-role +``` --- ### Как оформить ДЗ? From 2f585571b56d1c6a3882c5ea1bbcd02c2da090c4 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Wed, 12 Apr 2023 00:06:04 +0400 Subject: [PATCH 050/146] Update README.md --- 08-ansible-04-role/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/08-ansible-04-role/README.md b/08-ansible-04-role/README.md index ed375c354..48b0ba515 100644 --- a/08-ansible-04-role/README.md +++ b/08-ansible-04-role/README.md @@ -107,6 +107,16 @@ Starting galaxy role install process Нет зависимостей +Пример плейбука с использованием роли +---------------- +Пример для использования на машинах на которых уже установлена утилита Unzip: +``` +- name: Install Lighthouse + hosts: lighthouse + roles: + - lighthouse-role +``` + Пример с установкой утилиты Unzip в рамках pre_tasks в плее использующем данную роль: ```yaml From 744887f5603413b94f5014e118972aee3bc87bc7 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Wed, 12 Apr 2023 00:08:35 +0400 Subject: [PATCH 051/146] Update README.md --- 08-ansible-04-role/README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/08-ansible-04-role/README.md b/08-ansible-04-role/README.md index 48b0ba515..29c27e314 100644 --- a/08-ansible-04-role/README.md +++ b/08-ansible-04-role/README.md @@ -133,6 +133,21 @@ Starting galaxy role install process - lighthouse-role ``` --- +## Порядок выполнения плейбука +1 плей: Запускает роль по установке сlickhouse на всех хостах указанных в группе clickhouse в inventory файле. +2 плей: Запускает роль по установке vector на всех хостах указанных в группе vector в inventory файле. +3 плей: Запускает роль по установке nginx и lighthouse на всех хостах указанных в группе lighthouse в inventory файле. + +## inventory файл +Перед выполнением плейбука необходимо указать хосты в соответствующие группы в inventory файле. +Inventory файл содержит 3 группы хостов: +1. clickhouse +2. vector +3. lighthouse + +На хостах, указанных в группе будет выполнена роль соответствующая имени группы. + + ### Как оформить ДЗ? From 93d81c2c2a1127a681a74ee929a418cea3fe2185 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 13 Apr 2023 20:25:56 +0400 Subject: [PATCH 052/146] Create clickhouse.yml --- .../clickhouse/group_vars/clickhouse.yml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 08-ansible-05-testing/clickhouse/group_vars/clickhouse.yml diff --git a/08-ansible-05-testing/clickhouse/group_vars/clickhouse.yml b/08-ansible-05-testing/clickhouse/group_vars/clickhouse.yml new file mode 100644 index 000000000..4b5cb37cf --- /dev/null +++ b/08-ansible-05-testing/clickhouse/group_vars/clickhouse.yml @@ -0,0 +1,20 @@ +--- +clickhouse_version: "22.3.3.44" +clickhouse_listen_host: + - "0.0.0.0" +clickhouse_dbs_custom: + - { name: "logs" } +clickhouse_profiles_default: + default: + date_time_input_format: best_effort +clickhouse_users_custom: + - { name: "logger", + password: "logger", + profile: "default", + quota: "default", + networks: { '::/0' }, + dbs: ["logs"], + access_management: 0 } + +file_log_structure: "file String, host String, message String, timestamp DateTime64" +... From 577229e86b2dd78e42bcde9dec474c99c6c7522f Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 13 Apr 2023 20:27:39 +0400 Subject: [PATCH 053/146] Create main.yml --- 08-ansible-05-testing/clickhouse/inventory/main.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 08-ansible-05-testing/clickhouse/inventory/main.yml diff --git a/08-ansible-05-testing/clickhouse/inventory/main.yml b/08-ansible-05-testing/clickhouse/inventory/main.yml new file mode 100644 index 000000000..1259a10aa --- /dev/null +++ b/08-ansible-05-testing/clickhouse/inventory/main.yml @@ -0,0 +1,7 @@ +--- +clickhouse: + hosts: + clickhouse: + ansible_host: "clickhouse" + ansible_connection: docker +... From 5e9b271f27545e154a6344f81a3b3c9a2e673301 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 13 Apr 2023 20:30:11 +0400 Subject: [PATCH 054/146] Create docker-compose.yml --- 08-ansible-05-testing/clickhouse/docker-compose.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 08-ansible-05-testing/clickhouse/docker-compose.yml diff --git a/08-ansible-05-testing/clickhouse/docker-compose.yml b/08-ansible-05-testing/clickhouse/docker-compose.yml new file mode 100644 index 000000000..e1e6a8ffb --- /dev/null +++ b/08-ansible-05-testing/clickhouse/docker-compose.yml @@ -0,0 +1,13 @@ +--- +version: "2.4" + +services: + clickhouse_vm: + image: pycontribs/centos:7 + container_name: clickhouse + ports: + - "9000:9000" + - "8123:8123" + tty: true + network_mode: bridge +... From f5f43f8181bec5c2eb5daeb47581989652195303 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 13 Apr 2023 20:31:00 +0400 Subject: [PATCH 055/146] Create requirements.yml --- 08-ansible-05-testing/clickhouse/requirements.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 08-ansible-05-testing/clickhouse/requirements.yml diff --git a/08-ansible-05-testing/clickhouse/requirements.yml b/08-ansible-05-testing/clickhouse/requirements.yml new file mode 100644 index 000000000..1c6a0c563 --- /dev/null +++ b/08-ansible-05-testing/clickhouse/requirements.yml @@ -0,0 +1,6 @@ +--- + - src: git@github.com:AlexeySetevoi/ansible-clickhouse.git + scm: git + version: "1.13" + name: clickhouse +... From 4abf0e182445b1189b220c184daf2d02fd3ca4d1 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 13 Apr 2023 20:32:10 +0400 Subject: [PATCH 056/146] Create site.yml --- 08-ansible-05-testing/clickhouse/site.yml | 56 +++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 08-ansible-05-testing/clickhouse/site.yml diff --git a/08-ansible-05-testing/clickhouse/site.yml b/08-ansible-05-testing/clickhouse/site.yml new file mode 100644 index 000000000..dbcc215e9 --- /dev/null +++ b/08-ansible-05-testing/clickhouse/site.yml @@ -0,0 +1,56 @@ +--- +- name: Install Clickhouse + hosts: clickhouse + vars: + script_v3: false + pre_tasks: + - name: Detect python3 version + ansible.builtin.command: "python3 --version" + register: cmd_res + changed_when: false + failed_when: false + - name: Set python version of script to 3 + ansible.builtin.set_fact: + script_v3: true + when: cmd_res.rc == 0 + - name: Download SystemD replacer v3 + become: true + ansible.builtin.get_url: + url: https://raw.githubusercontent.com/gdraheim/docker-systemctl-replacement/master/files/docker/systemctl3.py + dest: /systemctl.py + mode: "a+x" + when: script_v3 == true + - name: Download SystemD replacer v2 + become: true + ansible.builtin.get_url: + url: https://raw.githubusercontent.com/gdraheim/docker-systemctl-replacement/master/files/docker/systemctl.py + dest: /systemctl.py + mode: "a+x" + when: script_v3 == false + - name: Create systemd directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + recurse: true + loop: + - /run/systemd/system + - /usr/lib/systemd/system + - name: Replace systemctl + become: true + ansible.builtin.copy: + src: /systemctl.py + remote_src: true + dest: /usr/bin/systemctl + mode: "+x" + force: true + - name: ReCollect system info + ansible.builtin.setup: + roles: + - clickhouse + post_tasks: + - name: Create tables + ansible.builtin.command: "clickhouse-client --host 127.0.0.1 -q 'CREATE TABLE logs.file_log ({{ file_log_structure }}) ENGINE = Log();'" + register: create_tbl + failed_when: create_tbl.rc != 0 and create_tbl.rc != 57 + changed_when: create_tbl.rc == 0 +... From 78abc9da1bfc1f45e22da51445cb21238e61e2ea Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 13 Apr 2023 20:36:57 +0400 Subject: [PATCH 057/146] Create verify_clickhouse.yml --- .../molecule/default/verify_clickhouse.yml | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 08-ansible-05-testing/fullstack/molecule/default/verify_clickhouse.yml diff --git a/08-ansible-05-testing/fullstack/molecule/default/verify_clickhouse.yml b/08-ansible-05-testing/fullstack/molecule/default/verify_clickhouse.yml new file mode 100644 index 000000000..936429887 --- /dev/null +++ b/08-ansible-05-testing/fullstack/molecule/default/verify_clickhouse.yml @@ -0,0 +1,45 @@ +--- +- name: Repeatable check + block: + - name: Decrease attempts count + set_fact: + retry_count: "{{ retry_count | int - 1 }}" + - name: Get clickhouse response + ansible.builtin.uri: + url: http://127.0.0.1:8123/?user=logger&password=logger&add_http_cors_header=1&output_format_json_quote_64bit_integers=1&database=logs&result_overflow_mode=throw&readonly=1 + method: "POST" + body_format: "raw" + body: "SELECT file, message FROM logs.file_log LIMIT 6 FORMAT Values" + return_content: true + register: res + - name: Compose acquired data to list + ansible.builtin.set_fact: + data_raw: '{{ res.content[1:-1] | split("),(") }}' + - name: Print acquired data + debug: + var: data_raw + - name: Verify acquired data + ansible.builtin.assert: + that: + - data_raw | length == 6 + - data_raw == + [ + "'/root/test/one.log','First line'", + "'/root/test/one.log','Second line'", + "'/root/test/one.log','Third line'", + "'/root/test/two.log','A little bit of data'", + "'/root/test/two.log','Some amount of data'", + "'/root/test/two.log','More data'" + ] + rescue: + - name: Fail if retry count is zero + ansible.builtin.fail: + msg: "No more attempts left" + when: retry_count | int == 0 + - name: Try another attempt after delay + ansible.builtin.wait_for: + timeout: "{{ retry_delay }}" # seconds + delegate_to: localhost + become: false + - include_tasks: verify_clickhouse.yml +... From c42de1049e611fc21a1a5359b79b0cf3ebe105c1 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 13 Apr 2023 20:38:58 +0400 Subject: [PATCH 058/146] Create verify.yml --- .../fullstack/molecule/default/verify.yml | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 08-ansible-05-testing/fullstack/molecule/default/verify.yml diff --git a/08-ansible-05-testing/fullstack/molecule/default/verify.yml b/08-ansible-05-testing/fullstack/molecule/default/verify.yml new file mode 100644 index 000000000..c0ff1754f --- /dev/null +++ b/08-ansible-05-testing/fullstack/molecule/default/verify.yml @@ -0,0 +1,89 @@ +--- +- name: Verify vector installation + hosts: vector + gather_facts: false + tasks: + - name: Get information about vector + ansible.builtin.command: systemctl show vector + register: srv_res + changed_when: false + - name: Assert vector service + ansible.builtin.assert: + that: + - srv_res.rc == 0 + - "'ActiveState=active' in srv_res.stdout_lines" + - "'LoadState=loaded' in srv_res.stdout_lines" + - "'SubState=running' in srv_res.stdout_lines" + - name: Validate vector configuration + ansible.builtin.command: vector validate + register: vld_res + changed_when: false + - name: Assert vector healthcheck + ansible.builtin.assert: + that: + - vld_res.rc == 0 + - "'Validated' == {{ vld_res.stdout_lines | map('trim') | list }}[-1]" + +- name: Verify lighthouse installation + hosts: lighthouse + gather_facts: false + tasks: + - name: Get information about nginx + ansible.builtin.command: systemctl show nginx + register: srv_res + changed_when: false + - name: Assert nginx service + ansible.builtin.assert: + that: + - srv_res.rc == 0 + - "'ActiveState=active' in srv_res.stdout_lines" + - "'LoadState=loaded' in srv_res.stdout_lines" + - "'SubState=running' in srv_res.stdout_lines" + - name: Save server home page + ansible.builtin.get_url: + url: "http://127.0.0.1:8080" + dest: "~/index.html" + mode: "0644" + - name: Get home page + ansible.builtin.command: cat ~/index.html + register: fil_res + changed_when: false + - name: Assert lighthouse homepage + ansible.builtin.assert: + that: + - fil_res.rc == 0 + - fil_res.stdout.find('LightHouse') != -1 + +- name: Store data to vector + hosts: vector + gather_facts: false + tasks: + - name: Create files + ansible.builtin.command: "touch {{ item }} && sync" + loop: + - "~/test/one.log" + - "~/test/two.log" + - name: Write some data to file + ansible.builtin.shell: echo {{ item }} >> ~/test/one.log && sync + become: true + loop: + - "First line" + - "Second line" + - "Third line" + - name: Write some data to another file + ansible.builtin.shell: echo {{ item }} >> ~/test/two.log && sync + become: true + loop: + - "A little bit of data" + - "Some amount of data" + - "More data" + +- name: Check Clickhouse data + hosts: clickhouse + gather_facts: false + vars: + retry_count: 5 + retry_delay: 1 + tasks: + - include_tasks: verify_clickhouse.yml +... From 27e2769f4805cbbc3a121281c7189acc7a902ee9 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 13 Apr 2023 21:05:09 +0400 Subject: [PATCH 059/146] Create requirements.yml --- .../fullstack/molecule/default/requirements.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 08-ansible-05-testing/fullstack/molecule/default/requirements.yml diff --git a/08-ansible-05-testing/fullstack/molecule/default/requirements.yml b/08-ansible-05-testing/fullstack/molecule/default/requirements.yml new file mode 100644 index 000000000..c941cb93a --- /dev/null +++ b/08-ansible-05-testing/fullstack/molecule/default/requirements.yml @@ -0,0 +1,13 @@ +--- +- name: clickhouse + src: git@github.com:NamorNinayzuk/ansible-clickhouse.git + scm: git + version: 0.0.3 +- name: vector + src: git@github.com:NamorNinayzuk/vector-role + scm: git + version: 0.0.4 +- name: lighthouse + src: git@github.com:NamorNinayzuk//lighthouse-role.git + scm: git + version: 0.0.3 From ad37d4345ae0b60113922d60450477ac7dd3b856 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 13 Apr 2023 21:10:20 +0400 Subject: [PATCH 060/146] Create molecule.yml --- .../fullstack/molecule/default/molecule.yml | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 08-ansible-05-testing/fullstack/molecule/default/molecule.yml diff --git a/08-ansible-05-testing/fullstack/molecule/default/molecule.yml b/08-ansible-05-testing/fullstack/molecule/default/molecule.yml new file mode 100644 index 000000000..05c00e360 --- /dev/null +++ b/08-ansible-05-testing/fullstack/molecule/default/molecule.yml @@ -0,0 +1,57 @@ +--- +dependency: + name: galaxy +driver: + name: docker +platforms: + - name: clickhouse + hostname: clickhouse + image: docker.io/pycontribs/centos:7 + pre_build_image: true + published_ports: + - "0.0.0.0:9000:9000/tcp" + - "[::]:9000:9000/tcp" + - "0.0.0.0:8123:8123/tcp" + - "[::]:8123:8123/tcp" + - name: vector + hostname: vector + image: docker.io/pycontribs/centos:7 + pre_build_image: true + - name: lighthouse + hostname: lighthouse + image: docker.io/pycontribs/centos:7 + pre_build_image: true + published_ports: + - "0.0.0.0:8080:8080/tcp" + - "[::]:8080:8080/tcp" +provisioner: + name: ansible +verifier: + name: ansible +scenario: + create_sequence: + - dependency + - create + check_sequence: + - dependency + - destroy + - create + - converge + - check + - destroy + converge_sequence: + - converge + destroy_sequence: + - destroy + test_sequence: + - dependency + - lint + - syntax + - destroy + - create + - converge + - idempotence + - cleanup + - verify + - destroy +... From 2f1b6b005c97e253a83d2d900883cd1fa434d9f6 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 13 Apr 2023 21:12:01 +0400 Subject: [PATCH 061/146] Create converge.yml --- .../fullstack/molecule/default/converge.yml | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 08-ansible-05-testing/fullstack/molecule/default/converge.yml diff --git a/08-ansible-05-testing/fullstack/molecule/default/converge.yml b/08-ansible-05-testing/fullstack/molecule/default/converge.yml new file mode 100644 index 000000000..9ca30c117 --- /dev/null +++ b/08-ansible-05-testing/fullstack/molecule/default/converge.yml @@ -0,0 +1,108 @@ +--- +- name: Prepare containers + hosts: all + vars: + script_v3: false + tasks: + - name: Detect python3 version + ansible.builtin.command: "python3 --version" + register: cmd_res + changed_when: false + failed_when: false + - name: Set python version of script to 3 + ansible.builtin.set_fact: + script_v3: true + when: cmd_res.rc == 0 + - name: Download SystemD replacer v3 + become: true + ansible.builtin.get_url: + url: https://raw.githubusercontent.com/gdraheim/docker-systemctl-replacement/master/files/docker/systemctl3.py + dest: /systemctl.py + mode: "a+x" + when: script_v3 == true + - name: Download SystemD replacer v2 + become: true + ansible.builtin.get_url: + url: https://raw.githubusercontent.com/gdraheim/docker-systemctl-replacement/master/files/docker/systemctl.py + dest: /systemctl.py + mode: "a+x" + when: script_v3 == false + - name: Create systemd directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + recurse: true + loop: + - /run/systemd/system + - /usr/lib/systemd/system + - name: Replace systemctl + become: true + ansible.builtin.copy: + src: /systemctl.py + remote_src: true + dest: /usr/bin/systemctl + mode: "+x" + force: true + #- name: ReCollect system info + # ansible.builtin.setup: + +- name: Install Clickhouse + hosts: clickhouse + roles: + - clickhouse-role + vars: + clickhouse_version: "22.3.3.44" + clickhouse_listen_host: + - "0.0.0.0" + clickhouse_dbs_custom: + - { name: "logs" } + clickhouse_profiles_default: + default: + date_time_input_format: best_effort + clickhouse_users_custom: + - { name: "logger", + password: "logger", + profile: "default", + quota: "default", + networks: { '::/0' }, + dbs: ["logs"], + access_management: 0 } + file_log_structure: "file String, host String, message String, timestamp DateTime64" + post_tasks: + - name: Create tables + ansible.builtin.command: "clickhouse-client --host 127.0.0.1 -q 'CREATE TABLE logs.file_log ({{ file_log_structure }}) ENGINE = Log();'" + register: create_tbl + failed_when: create_tbl.rc != 0 and create_tbl.rc != 57 + changed_when: create_tbl.rc == 0 + +- name: Detect Clickhouse IP + hosts: vector, lighthouse + tasks: + - name: Get Clickhouse IP from docker engine + ansible.builtin.command: "docker inspect -f {{'{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}'}} clickhouse" + register: cmd_res + changed_when: false + failed_when: cmd_res.rc != 0 + delegate_to: localhost + - name: Set Clickhouse IP to facts + ansible.builtin.set_fact: + clickhouse_host: "{{ cmd_res.stdout }}" + when: cmd_res.rc == 0 + +- name: Install Vector + hosts: vector + roles: + - vector-role + vars: + clickhouse_user: "logger" + clickhouse_password: "logger" + +- name: Install Lighthouse + hosts: lighthouse + roles: + - lighthouse-role + vars: + clickhouse_user: "logger" + clickhouse_password: "logger" + lighthouse_port: "8080" +... From 817d9020378b3681f92e5ba11d36cc909c189377 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 13 Apr 2023 21:16:14 +0400 Subject: [PATCH 062/146] Update converge.yml --- .../fullstack/molecule/default/converge.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/08-ansible-05-testing/fullstack/molecule/default/converge.yml b/08-ansible-05-testing/fullstack/molecule/default/converge.yml index 9ca30c117..67d480013 100644 --- a/08-ansible-05-testing/fullstack/molecule/default/converge.yml +++ b/08-ansible-05-testing/fullstack/molecule/default/converge.yml @@ -60,8 +60,8 @@ default: date_time_input_format: best_effort clickhouse_users_custom: - - { name: "logger", - password: "logger", + - { name: "user", + password: "userlog", profile: "default", quota: "default", networks: { '::/0' }, @@ -94,15 +94,15 @@ roles: - vector-role vars: - clickhouse_user: "logger" - clickhouse_password: "logger" + clickhouse_user: "user" + clickhouse_password: "userlog" - name: Install Lighthouse hosts: lighthouse roles: - lighthouse-role vars: - clickhouse_user: "logger" - clickhouse_password: "logger" + clickhouse_user: "user" + clickhouse_password: "userlog" lighthouse_port: "8080" ... From d166b8ae3bd60a4c38af3751b5f5d4a3ec168a77 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 13 Apr 2023 21:18:09 +0400 Subject: [PATCH 063/146] Create cleanup.yml --- .../fullstack/molecule/default/cleanup.yml | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 08-ansible-05-testing/fullstack/molecule/default/cleanup.yml diff --git a/08-ansible-05-testing/fullstack/molecule/default/cleanup.yml b/08-ansible-05-testing/fullstack/molecule/default/cleanup.yml new file mode 100644 index 000000000..037e4a3bb --- /dev/null +++ b/08-ansible-05-testing/fullstack/molecule/default/cleanup.yml @@ -0,0 +1,22 @@ +--- +- name: Clean up Clickhouse + hosts: clickhouse + gather_facts: false + tasks: + - name: Truncate tables + ansible.builtin.command: "clickhouse-client --host 127.0.0.1 -q 'TRUNCATE TABLE logs.file_log;'" + register: trunc_tbl + changed_when: false + failed_when: trunc_tbl.rc != 0 +- name: Clean up Vector + hosts: vector + gather_facts: false + tasks: + - name: Delete log files + ansible.builtin.file: + path: "{{ item }}" + state: absent + loop: + - "~/test/one.log" + - "~/test/two.log" +... From 2dbd44bfdefaa7a92f28c10daa108b9a4dfc0b28 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sun, 16 Apr 2023 17:50:46 +0400 Subject: [PATCH 064/146] Create README.md --- 08-ansible-05-testing/fullstack/README.md | 34 +++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 08-ansible-05-testing/fullstack/README.md diff --git a/08-ansible-05-testing/fullstack/README.md b/08-ansible-05-testing/fullstack/README.md new file mode 100644 index 000000000..295c7fa1e --- /dev/null +++ b/08-ansible-05-testing/fullstack/README.md @@ -0,0 +1,34 @@ +# Сценарий проверки всего стека **Clickhouse** + **Vector** + **Lighthuse** + +## Зависимости + +- Сторонняя роль установки и настройки [Clickhouse](https://github.com/NamorNinayzuk/ansible-clickhouse) +- Собственная роль установки и настройки [Vector](https://github.com/NamorNinayzuk/vector-role) +- Собственная роль установки и настройки [Lighthouse](https://github.com/NamorNinayzuk/lighthouse-role) + +> Также в файле зависимостей для информации указана коллекция, содержащая собственные роли - коллекции автоматически не устанавливаются +## Описания контейнеров + +Для тестирования используется драйвер **Docker**. + +Роли поддерживают **CentOS 7**, **CentOS 8**, **Ubuntu**, но согласно поставленной задаче используем только **CentOS 7** + +Создаются три контейнера: +- `clickhouse` с открытыми портами **9000** и **8123** для возможности ручной проверки через GUI +- `vector` +- `lighthouse` с открытым портом **8080** для возможности ручного контроля + +## Предназначение файлов + +- `cleanup.yml` - **playbook Molecule** для этапа **Cleanup** - предназначен для чистки сервисов от следов проверок, а именно обнуляется таблица в **Clickhouse** и удаляются контролируемые **Vector** файлы +- `converge` - **playbook Molecule** для этапа **Converge** - подготовка инфраструктуры сервисов: устанавливает скрипт эмулятор SystemD во все контейнеры и применяет все роли к соответствующим контейнерам +- `molecule` - конфигурационный файл **Molecule** +- `requirements` - файл зависимостей **Molecule** для **Ansible-galaxy** +- `verify` - основной **playbook Molecule** для этапа **verify** - верифицирует установку **Vector** и **Lighthouse**, создаёт контролируемые **Vector** файлы и наполняет их содержимым +- `verify_clickhouse` - **playbook** запрашивает данные из **Clickhouse** и сравнивает их с эталоном. Реализован отдельно с поддержкой нескольких итераций, так как из-за особенностей реализации **Vector** не все данные сразу отправляются в **Clickhouse**. + +## Примечания + +Для успешного функционирования всего стека ролям сервисов **Vector** и **Lighthouse** нужно передать IP адрес сервиса **Clickhouse** внутри сети контейнеров **Docker**. +По умолчанию **Molecule** создаёт контейнеры в сети в драйвером **bridge**. Определение IP адреса контейнера **Clickhouse** и передача его другим осуществляется в **play** с именем `Detect Clickhouse IP`. +Для ручного контроля используемые порты проброшены в основную систему и доступны по локальному IP адресу `127.0.0.1` From 2b1a8189bdb9bd0dd70fb0f39bf29ef9ea98b8a6 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sun, 16 Apr 2023 19:43:48 +0400 Subject: [PATCH 065/146] Update README.md --- 08-ansible-05-testing/README.md | 2305 ++++++++++++++++++++++++++++++- 1 file changed, 2298 insertions(+), 7 deletions(-) diff --git a/08-ansible-05-testing/README.md b/08-ansible-05-testing/README.md index 85b9c005e..19818d5bc 100644 --- a/08-ansible-05-testing/README.md +++ b/08-ansible-05-testing/README.md @@ -1,8 +1,8 @@ # Домашнее задание к занятию "5. Тестирование roles" ## Подготовка к выполнению -1. Установите molecule: `pip3 install "molecule==3.5.2"` -2. Выполните `docker pull aragast/netology:latest` - это образ с podman, tox и несколькими пайтонами (3.7 и 3.9) внутри +> 1. Установите molecule: `pip3 install "molecule==3.5.2"` +> 2. Выполните `docker pull aragast/netology:latest` - это образ с podman, tox и несколькими пайтонами (3.7 и 3.9) внутри ## Основная часть @@ -10,11 +10,2302 @@ ### Molecule -1. Запустите `molecule test -s centos7` внутри корневой директории clickhouse-role, посмотрите на вывод команды. -2. Перейдите в каталог с ролью vector-role и создайте сценарий тестирования по умолчанию при помощи `molecule init scenario --driver-name docker`. -3. Добавьте несколько разных дистрибутивов (centos:8, ubuntu:latest) для инстансов и протестируйте роль, исправьте найденные ошибки, если они есть. -4. Добавьте несколько assert'ов в verify.yml файл для проверки работоспособности vector-role (проверка, что конфиг валидный, проверка успешности запуска, etc). Запустите тестирование роли повторно и проверьте, что оно прошло успешно. -5. Добавьте новый тег на коммит с рабочим сценарием в соответствии с семантическим версионированием. +### 1. Запустите `molecule test -s centos_7` внутри корневой директории clickhouse-role, посмотрите на вывод команды. + +Используемое окружение: +![system schema](https://i.imgur.com/AdLOUeg.png) + + +Для работы потребуется наличие пакета **flake8** (установка, например для **apt**: `sudo apt install flake8`). +А также существует несовместимость контейнеризации если установлен **Podman** в качестве хоста **Docker**, которую нужно учесть. + +Разбор вывода теста molecule... Часть лога: + +```console +┌──(kali㉿kali)-[~/08-ansible-05/clickhouse] +└─$ molecule test -s cen +INFO centos_7 scenario test matrix: dependency, lint, cleanup, destroy, syntax, create, prepare, converge, idempotence, side_effect, verify, cleanup, destroy +INFO Performing prerun... +INFO Set ANSIBLE_LIBRARY=/home/.cache/ansible-compat/b9a93c/modules:/home/.ansible/plugins/modules:/usr/share/ansible/plugins/modules +INFO Set ANSIBLE_COLLECTIONS_PATH=/home/.cache/ansible-compat/b9a93c/../home/.ansible:/usr/share/ansible +INFO Set ANSIBLE_ROLES_PATH=/home/.cache/ansible-compat/b9a93c/roles:/home/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > dependency +WARNING Skipping, missing the requirements file. +WARNING Skipping, missing the requirements file. +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > lint +COMMAND: yamllint . +ansible-lint +flake8 + +WARNING Listing 56 violation(s) that are fatal +fqcn-builtins: Use FQCN for builtin actions. +handlers/main.yml:3 Task/Handler: Restart Clickhouse Service + +schema: {'name': 'EL', 'versions': [7, 8]} is not valid under any of the given schemas (schema[meta]) +meta/main.yml:1 Returned errors will not include exact line numbers, but they will mention +the schema name being used as a tag, like ``playbook-schema``, +``tasks-schema``. + +This rule is not skippable and stops further processing of the file. + +Schema bugs should be reported towards (https://github.com/ansible/schemas) project instead of ansible-lint. + +If incorrect schema was picked, you might want to either: + +* move the file to standard location, so its file is detected correctly. +* use ``kinds:`` option in linter config to help it pick correct file type. + + +fqcn-builtins: Use FQCN for builtin actions. +molecule/centos_7/converge.yml:5 Task/Handler: Include ansible-clickhouse + +fqcn-builtins: Use FQCN for builtin actions. +molecule/centos_7/verify.yml:8 Task/Handler: Example assertion + +fqcn-builtins: Use FQCN for builtin actions. +molecule/centos_8/converge.yml:5 Task/Handler: Include ansible-clickhouse + +fqcn-builtins: Use FQCN for builtin actions. +molecule/centos_8/verify.yml:8 Task/Handler: Example assertion + +schema: None is not of type 'object' (schema[inventory]) +molecule/resources/inventory/hosts.yml:1 Returned errors will not include exact line numbers, but they will mention +the schema name being used as a tag, like ``playbook-schema``, +``tasks-schema``. + +This rule is not skippable and stops further processing of the file. + +Schema bugs should be reported towards (https://github.com/ansible/schemas) project instead of ansible-lint. + +If incorrect schema was picked, you might want to either: + +* move the file to standard location, so its file is detected correctly. +* use ``kinds:`` option in linter config to help it pick correct file type. + + +fqcn-builtins: Use FQCN for builtin actions. +molecule/resources/playbooks/converge.yml:5 Task/Handler: Apply Clickhouse Role + +fqcn-builtins: Use FQCN for builtin actions. +molecule/ubuntu_focal/converge.yml:5 Task/Handler: Include ansible-clickhouse + +fqcn-builtins: Use FQCN for builtin actions. +molecule/ubuntu_focal/verify.yml:8 Task/Handler: Example assertion + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/db.yml:2 Task/Handler: Set ClickHose Connection String + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/db.yml:5 Task/Handler: Gather list of existing databases + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/db.yml:11 Task/Handler: Config | Delete database config + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/db.yml:20 Task/Handler: Config | Create database config + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/dict.yml:2 Task/Handler: Config | Generate dictionary config + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/sys.yml:2 Task/Handler: Check clickhouse config, data and logs + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/sys.yml:17 Task/Handler: Config | Create config.d folder + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/sys.yml:26 Task/Handler: Config | Create users.d folder + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/sys.yml:35 Task/Handler: Config | Generate system config + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/sys.yml:45 Task/Handler: Config | Generate users config + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/sys.yml:54 Task/Handler: Config | Generate remote_servers config + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/sys.yml:65 Task/Handler: Config | Generate macros config + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/sys.yml:76 Task/Handler: Config | Generate zookeeper servers config + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/sys.yml:87 Task/Handler: Config | Fix interserver_http_port and intersever_https_port collision + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/apt.yml:5 Task/Handler: Install by APT | Apt-key add repo key + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/apt.yml:12 Task/Handler: Install by APT | Remove old repo + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/apt.yml:20 Task/Handler: Install by APT | Repo installation + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/apt.yml:27 Task/Handler: Install by APT | Package installation + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/apt.yml:36 Task/Handler: Install by APT | Package installation + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/apt.yml:45 Task/Handler: Hold specified version during APT upgrade | Package installation + +risky-file-permissions: File permissions unset or incorrect. +tasks/install/apt.yml:45 Task/Handler: Hold specified version during APT upgrade | Package installation + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/dnf.yml:5 Task/Handler: Install by YUM | Ensure clickhouse repo GPG key imported + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/dnf.yml:12 Task/Handler: Install by YUM | Ensure clickhouse repo installed + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/dnf.yml:24 Task/Handler: Install by YUM | Ensure clickhouse package installed (latest) + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/dnf.yml:32 Task/Handler: Install by YUM | Ensure clickhouse package installed (version {{ clickhouse_version }}) + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/yum.yml:5 Task/Handler: Install by YUM | Ensure clickhouse repo installed + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/yum.yml:16 Task/Handler: Install by YUM | Ensure clickhouse package installed (latest) + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/yum.yml:24 Task/Handler: Install by YUM | Ensure clickhouse package installed (version {{ clickhouse_version }}) + +fqcn-builtins: Use FQCN for builtin actions. +tasks/main.yml:3 Task/Handler: Include OS Family Specific Variables + +fqcn-builtins: Use FQCN for builtin actions. +tasks/main.yml:39 Task/Handler: Notify Handlers Now + +fqcn-builtins: Use FQCN for builtin actions. +tasks/main.yml:45 Task/Handler: Wait for Clickhouse Server to Become Ready + +fqcn-builtins: Use FQCN for builtin actions. +tasks/params.yml:3 Task/Handler: Set clickhouse_service_enable + +fqcn-builtins: Use FQCN for builtin actions. +tasks/params.yml:7 Task/Handler: Set clickhouse_service_ensure + +fqcn-builtins: Use FQCN for builtin actions. +tasks/precheck.yml:1 Task/Handler: Requirements check | Checking sse4_2 support + +fqcn-builtins: Use FQCN for builtin actions. +tasks/precheck.yml:5 Task/Handler: Requirements check | Not supported distribution && release + +fqcn-builtins: Use FQCN for builtin actions. +tasks/remove.yml:3 Task/Handler: Remove clickhouse config,data and logs + +fqcn-builtins: Use FQCN for builtin actions. +tasks/remove/apt.yml:5 Task/Handler: Uninstall by APT | Package uninstallation + +fqcn-builtins: Use FQCN for builtin actions. +tasks/remove/apt.yml:12 Task/Handler: Uninstall by APT | Repo uninstallation + +fqcn-builtins: Use FQCN for builtin actions. +tasks/remove/apt.yml:18 Task/Handler: Uninstall by APT | Apt-key remove repo key + +fqcn-builtins: Use FQCN for builtin actions. +tasks/remove/dnf.yml:5 Task/Handler: Uninstall by YUM | Ensure clickhouse package uninstalled + +fqcn-builtins: Use FQCN for builtin actions. +tasks/remove/dnf.yml:12 Task/Handler: Uninstall by YUM | Ensure clickhouse repo uninstalled + +fqcn-builtins: Use FQCN for builtin actions. +tasks/remove/dnf.yml:19 Task/Handler: Uninstall by YUM | Ensure clickhouse key uninstalled + +fqcn-builtins: Use FQCN for builtin actions. +tasks/remove/yum.yml:5 Task/Handler: Uninstall by YUM | Ensure clickhouse package uninstalled + +fqcn-builtins: Use FQCN for builtin actions. +tasks/remove/yum.yml:12 Task/Handler: Uninstall by YUM | Ensure clickhouse repo uninstalled + +fqcn-builtins: Use FQCN for builtin actions. +tasks/service.yml:3 Task/Handler: Ensure {{ clickhouse_service }} is enabled: {{ clickhouse_service_enable }} and state: {{ clickhouse_service_ensure }} + +var-spacing: Jinja2 variables and filters should have spaces before and after. +vars/debian.yml:4 .clickhouse_repo_old + +You can skip specific rules or tags by adding them to your configuration file: +# .config/ansible-lint.yml +warn_list: # or 'skip_list' to silence them completely + - experimental # all rules tagged as experimental + - fqcn-builtins # Use FQCN for builtin actions. + - var-spacing # Jinja2 variables and filters should have spaces before and after. + +Finished with 53 failure(s), 3 warning(s) on 56 files. +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to + /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > cleanup +WARNING Skipping, cleanup playbook not configured. +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to + /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > destroy +INFO Sanity checks: 'docker' + +PLAY [Destroy] ***************************************************************** + +TASK [Destroy molecule instance(s)] ******************************************** +changed: [localhost] => (item=centos_7) + +TASK [Wait for instance(s) deletion to complete] ******************************* +ok: [localhost] => (item=centos_7) + +TASK [Delete docker networks(s)] *********************************************** + +PLAY RECAP ********************************************************************* +localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 + +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to + /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > syntax + +playbook: /home/08-ansible-05/ansible-clickhouse/molecule/resources/playbooks/converge.yml +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to + /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > create + +PLAY [Create] ****************************************************************** + +TASK [Log into a Docker registry] ********************************************** +skipping: [localhost] => (item=None) +skipping: [localhost] + +TASK [Check presence of custom Dockerfiles] ************************************ +ok: [localhost] => (item={'capabilities': ['SYS_ADMIN'], 'command': '/usr/sbin/init', 'dockerfile': '../resources/Dockerfile.j2', 'env': {'ANSIBLE_USER': 'ansible', 'DEPLOY_GROUP': 'deployer', 'SUDO_GROUP': 'wheel', 'container': 'docker'}, 'image': 'centos:7', 'name': 'centos_7', 'privileged': True, 'tmpfs': ['/run', '/tmp'], 'volumes': ['/sys/fs/cgroup:/sys/fs/cgroup']}) + +TASK [Create Dockerfiles from image names] ************************************* +changed: [localhost] => (item={'capabilities': ['SYS_ADMIN'], 'command': '/usr/sbin/init', 'dockerfile': '../resources/Dockerfile.j2', 'env': {'ANSIBLE_USER': 'ansible', 'DEPLOY_GROUP': 'deployer', 'SUDO_GROUP': 'wheel', 'container': 'docker'}, 'image': 'centos:7', 'name': 'centos_7', 'privileged': True, 'tmpfs': ['/run', '/tmp'], 'volumes': ['/sys/fs/cgroup:/sys/fs/cgroup']}) + +TASK [Discover local Docker images] ******************************************** +ok: [localhost] => (item={'diff': [], 'dest': '/home/.cache/molecule/ansible-clickhouse/centos_7/Dockerfile_centos_7', 'src': '/home/.ansible/tmp/ansible-tmp-1659784396.3046184-3873-95148761793267/source', 'md5sum': 'e90d08cd34f49a5f8a41a07de1348618', 'checksum': '4b70768619482424811f2977aa277a5acf2b13a1', 'changed': True, 'uid': 1000, 'gid': 1000, 'owner': 'sa', 'group': 'sa', 'mode': '0600', 'state': 'file', 'size': 2199, 'invocation': {'module_args': {'src': '/home/.ansible/tmp/ansible-tmp-1659784396.3046184-3873-95148761793267/source', 'dest': '/home/.cache/molecule/ansible-clickhouse/centos_7/Dockerfile_centos_7', 'mode': '0600', 'follow': False, '_original_basename': 'Dockerfile.j2', 'checksum': '4b70768619482424811f2977aa277a5acf2b13a1', 'backup': False, 'force': True, 'unsafe_writes': False, 'content': None, 'validate': None, 'directory_mode': None, 'remote_src': None, 'local_follow': None, 'owner': None, 'group': None, 'seuser': None, 'serole': None, 'selevel': None, 'setype': None, 'attributes': None}}, 'failed': False, 'item': {'capabilities': ['SYS_ADMIN'], 'command': '/usr/sbin/init', 'dockerfile': '../resources/Dockerfile.j2', 'env': {'ANSIBLE_USER': 'ansible', 'DEPLOY_GROUP': 'deployer', 'SUDO_GROUP': 'wheel', 'container': 'docker'}, 'image': 'centos:7', 'name': 'centos_7', 'privileged': True, 'tmpfs': ['/run', '/tmp'], 'volumes': ['/sys/fs/cgroup:/sys/fs/cgroup']}, 'ansible_loop_var': 'item', 'i': 0, 'ansible_index_var': 'i'}) + +TASK [Build an Ansible compatible image (new)] ********************************* +changed: [localhost] => (item=molecule_local/centos:7) + +TASK [Create docker network(s)] ************************************************ + +TASK [Determine the CMD directives] ******************************************** +ok: [localhost] => (item={'capabilities': ['SYS_ADMIN'], 'command': '/usr/sbin/init', 'dockerfile': '../resources/Dockerfile.j2', 'env': {'ANSIBLE_USER': 'ansible', 'DEPLOY_GROUP': 'deployer', 'SUDO_GROUP': 'wheel', 'container': 'docker'}, 'image': 'centos:7', 'name': 'centos_7', 'privileged': True, 'tmpfs': ['/run', '/tmp'], 'volumes': ['/sys/fs/cgroup:/sys/fs/cgroup']}) + +TASK [Create molecule instance(s)] ********************************************* +changed: [localhost] => (item=centos_7) + +TASK [Wait for instance(s) creation to complete] ******************************* +FAILED - RETRYING: [localhost]: Wait for instance(s) creation to complete (300 retries left). +changed: [localhost] => (item={'failed': 0, 'started': 1, 'finished': 0, 'ansible_job_id': '478592296224.4738', 'results_file': '/home/.ansible_async/478592296224.4738', 'changed': True, 'item': {'capabilities': ['SYS_ADMIN'], 'command': '/usr/sbin/init', 'dockerfile': '../resources/Dockerfile.j2', 'env': {'ANSIBLE_USER': 'ansible', 'DEPLOY_GROUP': 'deployer', 'SUDO_GROUP': 'wheel', 'container': 'docker'}, 'image': 'centos:7', 'name': 'centos_7', 'privileged': True, 'tmpfs': ['/run', '/tmp'], 'volumes': ['/sys/fs/cgroup:/sys/fs/cgroup']}, 'ansible_loop_var': 'item'}) + +PLAY RECAP ********************************************************************* +localhost : ok=7 changed=4 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 + +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to + /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > prepare +WARNING Skipping, prepare playbook not configured. +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to + /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > converge + +PLAY [Converge] **************************************************************** + +TASK [Gathering Facts] ********************************************************* +ok: [centos_7] + +TASK [Apply Clickhouse Role] *************************************************** + +TASK [ansible-clickhouse : Include OS Family Specific Variables] *************** +ok: [centos_7] + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/08-ansible-05/ansible-clickhouse/tasks/precheck.yml for centos_7 + +TASK [ansible-clickhouse : Requirements check | Checking sse4_2 support] ******* +ok: [centos_7] + +TASK [ansible-clickhouse : Requirements check | Not supported distribution && release] *** +skipping: [centos_7] + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/08-ansible-05/ansible-clickhouse/tasks/params.yml for centos_7 + +TASK [ansible-clickhouse : Set clickhouse_service_enable] ********************** +ok: [centos_7] + +TASK [ansible-clickhouse : Set clickhouse_service_ensure] ********************** +ok: [centos_7] + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/08-ansible-05/ansible-clickhouse/tasks/install/yum.yml for centos_7 + +TASK [ansible-clickhouse : Install by YUM | Ensure clickhouse repo installed] *** +--- before: /etc/yum.repos.d/clickhouse.repo ++++ after: /etc/yum.repos.d/clickhouse.repo +@@ -0,0 +1,7 @@ ++[clickhouse] ++async = 1 ++baseurl = https://packages.clickhouse.com/rpm/stable/ ++enabled = 1 ++gpgcheck = 0 ++name = Clickhouse repo ++ + +changed: [centos_7] + +TASK [ansible-clickhouse : Install by YUM | Ensure clickhouse package installed (latest)] *** +changed: [centos_7] + +TASK [ansible-clickhouse : Install by YUM | Ensure clickhouse package installed (version latest)] *** +skipping: [centos_7] + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/08-ansible-05/ansible-clickhouse/tasks/configure/sys.yml for centos_7 + +TASK [ansible-clickhouse : Check clickhouse config, data and logs] ************* +ok: [centos_7] => (item=/var/log/clickhouse-server) +--- before ++++ after +@@ -1,4 +1,4 @@ + { +- "mode": "0700", ++ "mode": "0770", + "path": "/etc/clickhouse-server" + } + +changed: [centos_7] => (item=/etc/clickhouse-server) +--- before ++++ after +@@ -1,7 +1,7 @@ + { +- "group": 0, +- "mode": "0755", +- "owner": 0, ++ "group": 996, ++ "mode": "0770", ++ "owner": 999, + "path": "/var/lib/clickhouse/tmp/", +- "state": "absent" ++ "state": "directory" + } + +changed: [centos_7] => (item=/var/lib/clickhouse/tmp/) +--- before ++++ after +@@ -1,4 +1,4 @@ + { +- "mode": "0700", ++ "mode": "0770", + "path": "/var/lib/clickhouse/" + } + +changed: [centos_7] => (item=/var/lib/clickhouse/) + +TASK [ansible-clickhouse : Config | Create config.d folder] ******************** +--- before ++++ after +@@ -1,4 +1,4 @@ + { +- "mode": "0500", ++ "mode": "0770", + "path": "/etc/clickhouse-server/config.d" + } + +changed: [centos_7] + +TASK [ansible-clickhouse : Config | Create users.d folder] ********************* +--- before ++++ after +@@ -1,4 +1,4 @@ + { +- "mode": "0500", ++ "mode": "0770", + "path": "/etc/clickhouse-server/users.d" + } + +changed: [centos_7] + +TASK [ansible-clickhouse : Config | Generate system config] ******************** +--- before ++++ after: /home/.ansible/tmp/ansible-local-4875ocmz5_ty/tmpdefjsh_1/config.j2 +@@ -0,0 +1,382 @@ ++ ++ ++ ++ ++ ++ trace ++ /var/log/clickhouse-server/clickhouse-server.log ++ /var/log/clickhouse-server/clickhouse-server.err.log ++ 1000M ++ 10 ++ ++ ++ 8123 ++ ++ 9000 ++ ++ ++ ++ ++ ++ /etc/clickhouse-server/server.crt ++ /etc/clickhouse-server/server.key ++ ++ /etc/clickhouse-server/dhparam.pem ++ none ++ true ++ true ++ sslv2,sslv3 ++ true ++ ++ ++ ++ true ++ true ++ sslv2,sslv3 ++ true ++ ++ ++ ++ RejectCertificateHandler ++ ++ ++ ++ ++ ++ ++ ++ ++ 9009 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 127.0.0.1 ++ ++ 2048 ++ 3 ++ ++ ++ 100 ++ ++ ++ ++ ++ ++ 8589934592 ++ ++ ++ 5368709120 ++ ++ ++ ++ /var/lib/clickhouse/ ++ ++ ++ /var/lib/clickhouse/tmp/ ++ ++ ++ /var/lib/clickhouse/user_files/ ++ ++ ++ users.xml ++ ++ ++ default ++ ++ ++ ++ ++ ++ default ++ ++ ++ ++ ++ ++ ++ ++ ++ False ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 3600 ++ ++ ++ ++ True ++ ++ ++ 3600 ++ ++ ++ 60 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ system ++ query_log
++ ++ toYYYYMM(event_date) ++ ++ 7500 ++
++ ++ ++ ++ system ++ query_thread_log
++ toYYYYMM(event_date) ++ ++ 7500 ++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ *_dictionary.xml ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ /clickhouse/task_queue/ddl ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ click_cost ++ any ++ ++ 0 ++ 3600 ++ ++ ++ 86400 ++ 60 ++ ++ ++ ++ max ++ ++ 0 ++ 60 ++ ++ ++ 3600 ++ 300 ++ ++ ++ 86400 ++ 3600 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ /var/lib/clickhouse//format_schemas/ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
+ +changed: [centos_7] + +TASK [ansible-clickhouse : Config | Generate users config] ********************* +--- before ++++ after: /home/.ansible/tmp/ansible-local-4875ocmz5_ty/tmp0w4na9zy/users.j2 +@@ -0,0 +1,106 @@ ++ ++ ++ ++ ++ ++ ++ ++ 10000000000 ++ 0 ++ random ++ 100 ++ ++ ++ 1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ::1 ++ 127.0.0.1 ++ ++ default ++ default ++ ++ ++ ++ ++ ++ ::1 ++ 127.0.0.1 ++ ++ readonly ++ default ++ ++ ++ ++ ++ f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2 ++ ++ ::1 ++ 127.0.0.1 ++ ++ default ++ default ++ ++ testu1 ++ ++ ++ ++ ++ testplpassword ++ ++ ::1 ++ 127.0.0.1 ++ ++ default ++ default ++ ++ testu2 ++ ++ ++ ++ ++ testplpassword ++ ++ 192.168.0.0/24 ++ 10.0.0.0/8 ++ ++ default ++ default ++ ++ testu1 ++ testu2 ++ testu3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 3600 ++ 0 ++ 0 ++ 0 ++ 0 ++ 0 ++ ++ ++ ++ + +changed: [centos_7] + +TASK [ansible-clickhouse : Config | Generate remote_servers config] ************ +skipping: [centos_7] + +TASK [ansible-clickhouse : Config | Generate macros config] ******************** +skipping: [centos_7] + +TASK [ansible-clickhouse : Config | Generate zookeeper servers config] ********* +skipping: [centos_7] + +TASK [ansible-clickhouse : Config | Fix interserver_http_port and intersever_https_port collision] *** +skipping: [centos_7] + +TASK [ansible-clickhouse : Notify Handlers Now] ******************************** + +RUNNING HANDLER [ansible-clickhouse : Restart Clickhouse Service] ************** +ok: [centos_7] + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/08-ansible-05/ansible-clickhouse/tasks/service.yml for centos_7 + +TASK [ansible-clickhouse : Ensure clickhouse-server.service is enabled: True and state: restarted] *** +fatal: [centos_7]: FAILED! => {"changed": false, "msg": "Service is in unknown state", "status": {}} + +PLAY RECAP ********************************************************************* +centos_7 : ok=18 changed=7 unreachable=0 failed=1 skipped=6 rescued=0 ignored=0 + +CRITICAL Ansible return code was 2, command was: ['ansible-playbook', '-D', '--inventory', '/home/.cache/molecule/ansible-clickhouse/centos_7/inventory', '--skip-tags', 'molecule-notest,notest', '/home/08-ansible-05/ansible-clickhouse/molecule/resources/playbooks/converge.yml'] +WARNING An error occurred during the test sequence action: 'converge'. Cleaning up. +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to + /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > cleanup +WARNING Skipping, cleanup playbook not configured. +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to + /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/08-ansible-05/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > destroy + +PLAY [Destroy] ***************************************************************** + +TASK [Destroy molecule instance(s)] ******************************************** +changed: [localhost] => (item=centos_7) + +TASK [Wait for instance(s) deletion to complete] ******************************* +FAILED - RETRYING: [localhost]: Wait for instance(s) deletion to complete (300 retries left). +changed: [localhost] => (item=centos_7) + +TASK [Delete docker networks(s)] *********************************************** + +PLAY RECAP ********************************************************************* +localhost : ok=2 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 + +INFO Pruning extra files from scenario ephemeral directory +┌──(kali㉿kali)-[~/08-ansible-05/clickhouse] +└─$ +``` +
+ +Тест выявил множество ошибок как правил YAML так и Ansible. +Большинство нарушений Ansible в данном примере - это так называемые **FQCN** (Fully Qualified Collection Name) - использование короткого имени модуля (например, `yum:` вместо `ansible.builtin.yum:`). +И вишенкой на торте является "провал", **playbook** " на шаге проверки старта `clickhouse-server.service` - из-за некорректной работы в **Docker** контейнере, где наблюдаются проблемы с функционированием **SystemD**. + +--- + +Отчёт по модифицированному **playbook**, с использованием [docker systemctl replacement](https://github.com/gdraheim/docker-systemctl-replacement) от **Guido Draheim** + +Используемое окружение на **Ubuntu 22**: + +```console +┌──(kali㉿kali)-[~/08-ansible-05/clickhouse] +└─$ molecule --version +molecule 4.0.1 using python 3.10 + ansible:2.13.3 + delegated:4.0.1 from molecule + docker:2.0.0 from molecule_docker requiring collections: community.docker>=3.0.0-a2 +┌──(kali㉿kali)-[~/08-ansible-05/clickhouse] +└─$ +``` + +Модифицированный `molecule/resources/playbooks/converge.yml` + +```yaml +--- +- name: Converge + hosts: all + pre_tasks: + - name: Download SystemD replacer + become: true + ansible.builtin.get_url: + url: https://raw.githubusercontent.com/gdraheim/docker-systemctl-replacement/master/files/docker/systemctl.py + dest: /systemctl.py + mode: "a+x" + - name: Replace systemctl + become: true + ansible.builtin.copy: + src: /systemctl.py + remote_src: true + dest: /usr/bin/systemctl + force: true + tasks: + - name: 'Apply Clickhouse Role' + include_role: + name: ansible-clickhouse +``` + +
+:exclamation: Прогон теста molecule... Лог очень длинный :bangbang: + +```console +┌──(kali㉿kali)-[~/08-ansible-05/clickhouse] molecule test -s centos_7 +INFO centos_7 scenario test matrix: dependency, lint, cleanup, destroy, syntax, create, prepare, converge, idempotence, side_effect, verify, cleanup, destroy +INFO Performing prerun with role_name_check=0... +INFO Set ANSIBLE_LIBRARY=/home/.cache/ansible-compat/b9a93c/modules:/home/.ansible/plugins/modules:/usr/share/ansible/plugins/modules +INFO Set ANSIBLE_COLLECTIONS_PATH=/home/.cache/ansible-compat/b9a93c/../home/.ansible:/usr/share/ansible +INFO Set ANSIBLE_ROLES_PATH=/home/.cache/ansible-compat/b9a93c/roles:/home/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles +INFO Using /home/.cache/ansible-compat/b9a93c/roles/alexeysetevoi.clickhouse symlink to current repository in order to enable Ansible to find the role using its expected full name. +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > dependency +WARNING Skipping, missing the requirements file. +WARNING Skipping, missing the requirements file. +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > lint +WARNING Listing 61 violation(s) that are fatal +fqcn-builtins: Use FQCN for builtin actions. +handlers/main.yml:3 Task/Handler: Restart Clickhouse Service + +schema: {'name': 'EL', 'versions': [7, 8]} is not valid under any of the given schemas (schema[meta]) +meta/main.yml:1 Returned errors will not include exact line numbers, but they will mention +the schema name being used as a tag, like ``playbook-schema``, +``tasks-schema``. + +This rule is not skippable and stops further processing of the file. + +Schema bugs should be reported towards (https://github.com/ansible/schemas) project instead of ansible-lint. + +If incorrect schema was picked, you might want to either: + +* move the file to standard location, so its file is detected correctly. +* use ``kinds:`` option in linter config to help it pick correct file type. + + +fqcn-builtins: Use FQCN for builtin actions. +molecule/centos_7/converge.yml:5 Task/Handler: Include ansible-clickhouse + +fqcn-builtins: Use FQCN for builtin actions. +molecule/centos_7/verify.yml:8 Task/Handler: Example assertion + +fqcn-builtins: Use FQCN for builtin actions. +molecule/centos_8/converge.yml:5 Task/Handler: Include ansible-clickhouse + +fqcn-builtins: Use FQCN for builtin actions. +molecule/centos_8/verify.yml:8 Task/Handler: Example assertion + +schema: None is not of type 'object' (schema[inventory]) +molecule/resources/inventory/hosts.yml:1 Returned errors will not include exact line numbers, but they will mention +the schema name being used as a tag, like ``playbook-schema``, +``tasks-schema``. + +This rule is not skippable and stops further processing of the file. + +Schema bugs should be reported towards (https://github.com/ansible/schemas) project instead of ansible-lint. + +If incorrect schema was picked, you might want to either: + +* move the file to standard location, so its file is detected correctly. +* use ``kinds:`` option in linter config to help it pick correct file type. + + +risky-file-permissions: File permissions unset or incorrect. +molecule/resources/playbooks/converge.yml:11 Task/Handler: Replace systemctl + +fqcn-builtins: Use FQCN for builtin actions. +molecule/resources/playbooks/converge.yml:19 Task/Handler: Apply Clickhouse Role + +fqcn-builtins: Use FQCN for builtin actions. +molecule/ubuntu_focal/converge.yml:5 Task/Handler: Include ansible-clickhouse + +fqcn-builtins: Use FQCN for builtin actions. +molecule/ubuntu_focal/verify.yml:8 Task/Handler: Example assertion + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/db.yml:2 Task/Handler: Set ClickHose Connection String + +jinja: Jinja2 spacing could be improved: clickhouse-client -h 127.0.0.1 --port {{ clickhouse_tcp_secure_port | default(clickhouse_tcp_port) }}{{' --secure' if clickhouse_tcp_secure_port is defined else '' }} -> clickhouse-client -h 127.0.0.1 --port {{ clickhouse_tcp_secure_port | default(clickhouse_tcp_port) }}{{ ' --secure' if clickhouse_tcp_secure_port is defined else '' }} (jinja[spacing]) +tasks/configure/db.yml:2 Jinja2 template rewrite recommendation: `clickhouse-client -h 127.0.0.1 --port {{ clickhouse_tcp_secure_port | default(clickhouse_tcp_port) }}{{ ' --secure' if clickhouse_tcp_secure_port is defined else '' }}`. + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/db.yml:5 Task/Handler: Gather list of existing databases + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/db.yml:11 Task/Handler: Config | Delete database config + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/db.yml:20 Task/Handler: Config | Create database config + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/dict.yml:2 Task/Handler: Config | Generate dictionary config + +jinja: Jinja2 spacing could be improved: clickhouse_dicts|length>0 -> clickhouse_dicts | length > 0 (jinja[spacing]) +tasks/configure/dict.yml:2 Jinja2 template rewrite recommendation: `clickhouse_dicts | length > 0`. + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/sys.yml:2 Task/Handler: Check clickhouse config, data and logs + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/sys.yml:17 Task/Handler: Config | Create config.d folder + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/sys.yml:26 Task/Handler: Config | Create users.d folder + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/sys.yml:35 Task/Handler: Config | Generate system config + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/sys.yml:45 Task/Handler: Config | Generate users config + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/sys.yml:54 Task/Handler: Config | Generate remote_servers config + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/sys.yml:65 Task/Handler: Config | Generate macros config + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/sys.yml:76 Task/Handler: Config | Generate zookeeper servers config + +fqcn-builtins: Use FQCN for builtin actions. +tasks/configure/sys.yml:87 Task/Handler: Config | Fix interserver_http_port and intersever_https_port collision + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/apt.yml:5 Task/Handler: Install by APT | Apt-key add repo key + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/apt.yml:12 Task/Handler: Install by APT | Remove old repo + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/apt.yml:20 Task/Handler: Install by APT | Repo installation + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/apt.yml:27 Task/Handler: Install by APT | Package installation + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/apt.yml:36 Task/Handler: Install by APT | Package installation + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/apt.yml:45 Task/Handler: Hold specified version during APT upgrade | Package installation + +risky-file-permissions: File permissions unset or incorrect. +tasks/install/apt.yml:45 Task/Handler: Hold specified version during APT upgrade | Package installation + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/dnf.yml:5 Task/Handler: Install by YUM | Ensure clickhouse repo GPG key imported + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/dnf.yml:12 Task/Handler: Install by YUM | Ensure clickhouse repo installed + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/dnf.yml:24 Task/Handler: Install by YUM | Ensure clickhouse package installed (latest) + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/dnf.yml:32 Task/Handler: Install by YUM | Ensure clickhouse package installed (version {{ clickhouse_version }}) + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/yum.yml:5 Task/Handler: Install by YUM | Ensure clickhouse repo installed + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/yum.yml:16 Task/Handler: Install by YUM | Ensure clickhouse package installed (latest) + +fqcn-builtins: Use FQCN for builtin actions. +tasks/install/yum.yml:24 Task/Handler: Install by YUM | Ensure clickhouse package installed (version {{ clickhouse_version }}) + +fqcn-builtins: Use FQCN for builtin actions. +tasks/main.yml:3 Task/Handler: Include OS Family Specific Variables + +fqcn-builtins: Use FQCN for builtin actions. +tasks/main.yml:39 Task/Handler: Notify Handlers Now + +fqcn-builtins: Use FQCN for builtin actions. +tasks/main.yml:45 Task/Handler: Wait for Clickhouse Server to Become Ready + +jinja: Jinja2 spacing could be improved: not clickhouse_remove|bool -> not clickhouse_remove | bool (jinja[spacing]) +tasks/main.yml:45 Jinja2 template rewrite recommendation: `not clickhouse_remove | bool`. + +fqcn-builtins: Use FQCN for builtin actions. +tasks/params.yml:3 Task/Handler: Set clickhouse_service_enable + +fqcn-builtins: Use FQCN for builtin actions. +tasks/params.yml:7 Task/Handler: Set clickhouse_service_ensure + +fqcn-builtins: Use FQCN for builtin actions. +tasks/precheck.yml:1 Task/Handler: Requirements check | Checking sse4_2 support + +fqcn-builtins: Use FQCN for builtin actions. +tasks/precheck.yml:5 Task/Handler: Requirements check | Not supported distribution && release + +jinja: Jinja2 spacing could be improved: not clickhouse_supported|bool -> not clickhouse_supported | bool (jinja[spacing]) +tasks/precheck.yml:5 Jinja2 template rewrite recommendation: `not clickhouse_supported | bool`. + +fqcn-builtins: Use FQCN for builtin actions. +tasks/remove.yml:3 Task/Handler: Remove clickhouse config,data and logs + +fqcn-builtins: Use FQCN for builtin actions. +tasks/remove/apt.yml:5 Task/Handler: Uninstall by APT | Package uninstallation + +fqcn-builtins: Use FQCN for builtin actions. +tasks/remove/apt.yml:12 Task/Handler: Uninstall by APT | Repo uninstallation + +fqcn-builtins: Use FQCN for builtin actions. +tasks/remove/apt.yml:18 Task/Handler: Uninstall by APT | Apt-key remove repo key + +fqcn-builtins: Use FQCN for builtin actions. +tasks/remove/dnf.yml:5 Task/Handler: Uninstall by YUM | Ensure clickhouse package uninstalled + +fqcn-builtins: Use FQCN for builtin actions. +tasks/remove/dnf.yml:12 Task/Handler: Uninstall by YUM | Ensure clickhouse repo uninstalled + +fqcn-builtins: Use FQCN for builtin actions. +tasks/remove/dnf.yml:19 Task/Handler: Uninstall by YUM | Ensure clickhouse key uninstalled + +fqcn-builtins: Use FQCN for builtin actions. +tasks/remove/yum.yml:5 Task/Handler: Uninstall by YUM | Ensure clickhouse package uninstalled + +fqcn-builtins: Use FQCN for builtin actions. +tasks/remove/yum.yml:12 Task/Handler: Uninstall by YUM | Ensure clickhouse repo uninstalled + +fqcn-builtins: Use FQCN for builtin actions. +tasks/service.yml:3 Task/Handler: Ensure {{ clickhouse_service }} is enabled: {{ clickhouse_service_enable }} and state: {{ clickhouse_service_ensure }} + +jinja: Jinja2 spacing could be improved: deb http://repo.yandex.ru/clickhouse/{{ansible_distribution_release}} stable main -> deb http://repo.yandex.ru/clickhouse/{{ ansible_distribution_release }} stable main (jinja[spacing]) +vars/debian.yml:4 Jinja2 template rewrite recommendation: `deb http://repo.yandex.ru/clickhouse/{{ ansible_distribution_release }} stable main`. + +You can skip specific rules or tags by adding them to your configuration file: +# .config/ansible-lint.yml +warn_list: # or 'skip_list' to silence them completely + - experimental # all rules tagged as experimental + - fqcn-builtins # Use FQCN for builtin actions. + +Finished with 52 failure(s), 9 warning(s) on 56 files. +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > cleanup +WARNING Skipping, cleanup playbook not configured. +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > destroy +INFO Sanity checks: 'docker' + +PLAY [Destroy] ***************************************************************** + +TASK [Destroy molecule instance(s)] ******************************************** +changed: [localhost] => (item=centos_7) + +TASK [Wait for instance(s) deletion to complete] ******************************* +ok: [localhost] => (item=centos_7) + +TASK [Delete docker networks(s)] *********************************************** + +PLAY RECAP ********************************************************************* +localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 + +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > syntax + +playbook: /home/ansible-clickhouse/molecule/resources/playbooks/converge.yml +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > create + +PLAY [Create] ****************************************************************** + +TASK [Log into a Docker registry] ********************************************** +skipping: [localhost] => (item=None) +skipping: [localhost] + +TASK [Check presence of custom Dockerfiles] ************************************ +ok: [localhost] => (item={'capabilities': ['SYS_ADMIN'], 'command': '/usr/sbin/init', 'dockerfile': '../resources/Dockerfile.j2', 'env': {'ANSIBLE_USER': 'ansible', 'DEPLOY_GROUP': 'deployer', 'SUDO_GROUP': 'wheel', 'container': 'docker'}, 'image': 'centos:7', 'name': 'centos_7', 'privileged': True, 'tmpfs': ['/run', '/tmp'], 'volumes': ['/sys/fs/cgroup:/sys/fs/cgroup']}) + +TASK [Create Dockerfiles from image names] ************************************* +changed: [localhost] => (item={'capabilities': ['SYS_ADMIN'], 'command': '/usr/sbin/init', 'dockerfile': '../resources/Dockerfile.j2', 'env': {'ANSIBLE_USER': 'ansible', 'DEPLOY_GROUP': 'deployer', 'SUDO_GROUP': 'wheel', 'container': 'docker'}, 'image': 'centos:7', 'name': 'centos_7', 'privileged': True, 'tmpfs': ['/run', '/tmp'], 'volumes': ['/sys/fs/cgroup:/sys/fs/cgroup']}) + +TASK [Discover local Docker images] ******************************************** +ok: [localhost] => (item={'diff': [], 'dest': '/home/.cache/molecule/ansible-clickhouse/centos_7/Dockerfile_centos_7', 'src': '/home/.ansible/tmp/ansible-tmp-1661954081.235305-32485-267253787192059/source', 'md5sum': 'e90d08cd34f49a5f8a41a07de1348618', 'checksum': '4b70768619482424811f2977aa277a5acf2b13a1', 'changed': True, 'uid': 1000, 'gid': 1000, 'owner': 'sa', 'group': 'sa', 'mode': '0600', 'state': 'file', 'size': 2199, 'invocation': {'module_args': {'src': '/home/.ansible/tmp/ansible-tmp-1661954081.235305-32485-267253787192059/source', 'dest': '/home/.cache/molecule/ansible-clickhouse/centos_7/Dockerfile_centos_7', 'mode': '0600', 'follow': False, '_original_basename': 'Dockerfile.j2', 'checksum': '4b70768619482424811f2977aa277a5acf2b13a1', 'backup': False, 'force': True, 'unsafe_writes': False, 'content': None, 'validate': None, 'directory_mode': None, 'remote_src': None, 'local_follow': None, 'owner': None, 'group': None, 'seuser': None, 'serole': None, 'selevel': None, 'setype': None, 'attributes': None}}, 'failed': False, 'item': {'capabilities': ['SYS_ADMIN'], 'command': '/usr/sbin/init', 'dockerfile': '../resources/Dockerfile.j2', 'env': {'ANSIBLE_USER': 'ansible', 'DEPLOY_GROUP': 'deployer', 'SUDO_GROUP': 'wheel', 'container': 'docker'}, 'image': 'centos:7', 'name': 'centos_7', 'privileged': True, 'tmpfs': ['/run', '/tmp'], 'volumes': ['/sys/fs/cgroup:/sys/fs/cgroup']}, 'ansible_loop_var': 'item', 'i': 0, 'ansible_index_var': 'i'}) + +TASK [Build an Ansible compatible image (new)] ********************************* +ok: [localhost] => (item=molecule_local/centos:7) + +TASK [Create docker network(s)] ************************************************ + +TASK [Determine the CMD directives] ******************************************** +ok: [localhost] => (item={'capabilities': ['SYS_ADMIN'], 'command': '/usr/sbin/init', 'dockerfile': '../resources/Dockerfile.j2', 'env': {'ANSIBLE_USER': 'ansible', 'DEPLOY_GROUP': 'deployer', 'SUDO_GROUP': 'wheel', 'container': 'docker'}, 'image': 'centos:7', 'name': 'centos_7', 'privileged': True, 'tmpfs': ['/run', '/tmp'], 'volumes': ['/sys/fs/cgroup:/sys/fs/cgroup']}) + +TASK [Create molecule instance(s)] ********************************************* +changed: [localhost] => (item=centos_7) + +TASK [Wait for instance(s) creation to complete] ******************************* +FAILED - RETRYING: [localhost]: Wait for instance(s) creation to complete (300 retries left). +changed: [localhost] => (item={'failed': 0, 'started': 1, 'finished': 0, 'ansible_job_id': '128133508658.32615', 'results_file': '/home/.ansible_async/128133508658.32615', 'changed': True, 'item': {'capabilities': ['SYS_ADMIN'], 'command': '/usr/sbin/init', 'dockerfile': '../resources/Dockerfile.j2', 'env': {'ANSIBLE_USER': 'ansible', 'DEPLOY_GROUP': 'deployer', 'SUDO_GROUP': 'wheel', 'container': 'docker'}, 'image': 'centos:7', 'name': 'centos_7', 'privileged': True, 'tmpfs': ['/run', '/tmp'], 'volumes': ['/sys/fs/cgroup:/sys/fs/cgroup']}, 'ansible_loop_var': 'item'}) + +PLAY RECAP ********************************************************************* +localhost : ok=7 changed=3 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 + +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > prepare +WARNING Skipping, prepare playbook not configured. +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > converge + +PLAY [Converge] **************************************************************** + +TASK [Gathering Facts] ********************************************************* +ok: [centos_7] + +TASK [Download SystemD replacer] *********************************************** +changed: [centos_7] + +TASK [Replace systemctl] ******************************************************* +changed: [centos_7] + +TASK [Apply Clickhouse Role] *************************************************** + +TASK [ansible-clickhouse : Include OS Family Specific Variables] *************** +ok: [centos_7] + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/ansible-clickhouse/tasks/precheck.yml for centos_7 + +TASK [ansible-clickhouse : Requirements check | Checking sse4_2 support] ******* +ok: [centos_7] + +TASK [ansible-clickhouse : Requirements check | Not supported distribution && release] *** +skipping: [centos_7] + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/ansible-clickhouse/tasks/params.yml for centos_7 + +TASK [ansible-clickhouse : Set clickhouse_service_enable] ********************** +ok: [centos_7] + +TASK [ansible-clickhouse : Set clickhouse_service_ensure] ********************** +ok: [centos_7] + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/ansible-clickhouse/tasks/install/yum.yml for centos_7 + +TASK [ansible-clickhouse : Install by YUM | Ensure clickhouse repo installed] *** +--- before: /etc/yum.repos.d/clickhouse.repo ++++ after: /etc/yum.repos.d/clickhouse.repo +@@ -0,0 +1,7 @@ ++[clickhouse] ++async = 1 ++baseurl = https://packages.clickhouse.com/rpm/stable/ ++enabled = 1 ++gpgcheck = 0 ++name = Clickhouse repo ++ + +changed: [centos_7] + +TASK [ansible-clickhouse : Install by YUM | Ensure clickhouse package installed (latest)] *** +changed: [centos_7] + +TASK [ansible-clickhouse : Install by YUM | Ensure clickhouse package installed (version latest)] *** +skipping: [centos_7] + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/ansible-clickhouse/tasks/configure/sys.yml for centos_7 + +TASK [ansible-clickhouse : Check clickhouse config, data and logs] ************* +ok: [centos_7] => (item=/var/log/clickhouse-server) +--- before ++++ after +@@ -1,4 +1,4 @@ + { +- "mode": "0700", ++ "mode": "0770", + "path": "/etc/clickhouse-server" + } + +changed: [centos_7] => (item=/etc/clickhouse-server) +--- before ++++ after +@@ -1,7 +1,7 @@ + { +- "group": 0, +- "mode": "0755", +- "owner": 0, ++ "group": 996, ++ "mode": "0770", ++ "owner": 999, + "path": "/var/lib/clickhouse/tmp/", +- "state": "absent" ++ "state": "directory" + } + +changed: [centos_7] => (item=/var/lib/clickhouse/tmp/) +--- before ++++ after +@@ -1,4 +1,4 @@ + { +- "mode": "0700", ++ "mode": "0770", + "path": "/var/lib/clickhouse/" + } + +changed: [centos_7] => (item=/var/lib/clickhouse/) + +TASK [ansible-clickhouse : Config | Create config.d folder] ******************** +--- before ++++ after +@@ -1,4 +1,4 @@ + { +- "mode": "0500", ++ "mode": "0770", + "path": "/etc/clickhouse-server/config.d" + } + +changed: [centos_7] + +TASK [ansible-clickhouse : Config | Create users.d folder] ********************* +--- before ++++ after +@@ -1,4 +1,4 @@ + { +- "mode": "0500", ++ "mode": "0770", + "path": "/etc/clickhouse-server/users.d" + } + +changed: [centos_7] + +TASK [ansible-clickhouse : Config | Generate system config] ******************** +--- before ++++ after: /home/.ansible/tmp/ansible-local-327410lkn5fza/tmp355vng43/config.j2 +@@ -0,0 +1,382 @@ ++ ++ ++ ++ ++ ++ trace ++ /var/log/clickhouse-server/clickhouse-server.log ++ /var/log/clickhouse-server/clickhouse-server.err.log ++ 1000M ++ 10 ++ ++ ++ 8123 ++ ++ 9000 ++ ++ ++ ++ ++ ++ /etc/clickhouse-server/server.crt ++ /etc/clickhouse-server/server.key ++ ++ /etc/clickhouse-server/dhparam.pem ++ none ++ true ++ true ++ sslv2,sslv3 ++ true ++ ++ ++ ++ true ++ true ++ sslv2,sslv3 ++ true ++ ++ ++ ++ RejectCertificateHandler ++ ++ ++ ++ ++ ++ ++ ++ ++ 9009 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 127.0.0.1 ++ ++ 2048 ++ 3 ++ ++ ++ 100 ++ ++ ++ ++ ++ ++ 8589934592 ++ ++ ++ 5368709120 ++ ++ ++ ++ /var/lib/clickhouse/ ++ ++ ++ /var/lib/clickhouse/tmp/ ++ ++ ++ /var/lib/clickhouse/user_files/ ++ ++ ++ users.xml ++ ++ ++ default ++ ++ ++ ++ ++ ++ default ++ ++ ++ ++ ++ ++ ++ ++ ++ False ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 3600 ++ ++ ++ ++ True ++ ++ ++ 3600 ++ ++ ++ 60 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ system ++ query_log
++ ++ toYYYYMM(event_date) ++ ++ 7500 ++
++ ++ ++ ++ system ++ query_thread_log
++ toYYYYMM(event_date) ++ ++ 7500 ++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ *_dictionary.xml ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ /clickhouse/task_queue/ddl ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ click_cost ++ any ++ ++ 0 ++ 3600 ++ ++ ++ 86400 ++ 60 ++ ++ ++ ++ max ++ ++ 0 ++ 60 ++ ++ ++ 3600 ++ 300 ++ ++ ++ 86400 ++ 3600 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ /var/lib/clickhouse//format_schemas/ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
+ +changed: [centos_7] + +TASK [ansible-clickhouse : Config | Generate users config] ********************* +--- before ++++ after: /home/.ansible/tmp/ansible-local-327410lkn5fza/tmprm7rasbr/users.j2 +@@ -0,0 +1,106 @@ ++ ++ ++ ++ ++ ++ ++ ++ 10000000000 ++ 0 ++ random ++ 100 ++ ++ ++ 1 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ::1 ++ 127.0.0.1 ++ ++ default ++ default ++ ++ ++ ++ ++ ++ ::1 ++ 127.0.0.1 ++ ++ readonly ++ default ++ ++ ++ ++ ++ f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2 ++ ++ ::1 ++ 127.0.0.1 ++ ++ default ++ default ++ ++ testu1 ++ ++ ++ ++ ++ testplpassword ++ ++ ::1 ++ 127.0.0.1 ++ ++ default ++ default ++ ++ testu2 ++ ++ ++ ++ ++ testplpassword ++ ++ 192.168.0.0/24 ++ 10.0.0.0/8 ++ ++ default ++ default ++ ++ testu1 ++ testu2 ++ testu3 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ 3600 ++ 0 ++ 0 ++ 0 ++ 0 ++ 0 ++ ++ ++ ++ + +changed: [centos_7] + +TASK [ansible-clickhouse : Config | Generate remote_servers config] ************ +skipping: [centos_7] + +TASK [ansible-clickhouse : Config | Generate macros config] ******************** +skipping: [centos_7] + +TASK [ansible-clickhouse : Config | Generate zookeeper servers config] ********* +skipping: [centos_7] + +TASK [ansible-clickhouse : Config | Fix interserver_http_port and intersever_https_port collision] *** +skipping: [centos_7] + +TASK [ansible-clickhouse : Notify Handlers Now] ******************************** + +RUNNING HANDLER [ansible-clickhouse : Restart Clickhouse Service] ************** +ok: [centos_7] + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/ansible-clickhouse/tasks/service.yml for centos_7 + +TASK [ansible-clickhouse : Ensure clickhouse-server.service is enabled: True and state: restarted] *** +changed: [centos_7] + +TASK [ansible-clickhouse : Wait for Clickhouse Server to Become Ready] ********* +ok: [centos_7] + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/ansible-clickhouse/tasks/configure/db.yml for centos_7 + +TASK [ansible-clickhouse : Set ClickHose Connection String] ******************** +ok: [centos_7] + +TASK [ansible-clickhouse : Gather list of existing databases] ****************** +ok: [centos_7] + +TASK [ansible-clickhouse : Config | Delete database config] ******************** +skipping: [centos_7] => (item={'name': 'testu1'}) +skipping: [centos_7] => (item={'name': 'testu2'}) +skipping: [centos_7] => (item={'name': 'testu3'}) +skipping: [centos_7] => (item={'name': 'testu4', 'state': 'absent'}) + +TASK [ansible-clickhouse : Config | Create database config] ******************** +changed: [centos_7] => (item={'name': 'testu1'}) +changed: [centos_7] => (item={'name': 'testu2'}) +changed: [centos_7] => (item={'name': 'testu3'}) +skipping: [centos_7] => (item={'name': 'testu4', 'state': 'absent'}) + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/ansible-clickhouse/tasks/configure/dict.yml for centos_7 + +TASK [ansible-clickhouse : Config | Generate dictionary config] **************** +--- before ++++ after: /home/.ansible/tmp/ansible-local-327410lkn5fza/tmp08paiyou/dicts.j2 +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ test_dict ++ ++ ++ DSN=testdb ++ dict_source
++
++ ++ ++ 300 ++ 360 ++ ++ ++ ++ ++ ++ ++ testIntKey ++ ++ ++ testAttrName ++ UInt32 ++ 0 ++ ++ ++
++ ++ test_dict ++ ++ ++ DSN=testdb ++ dict_source
++
++ ++ ++ 300 ++ 360 ++ ++ ++ ++ ++ ++ ++ ++ testAttrComplexName ++ String ++ ++ ++ ++ testAttrName ++ String ++ ++ ++ ++
++
+ +changed: [centos_7] + +TASK [ansible-clickhouse : include_tasks] ************************************** +skipping: [centos_7] + +PLAY RECAP ********************************************************************* +centos_7 : ok=28 changed=12 unreachable=0 failed=0 skipped=8 rescued=0 ignored=0 + +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > idempotence + +PLAY [Converge] **************************************************************** + +TASK [Gathering Facts] ********************************************************* +ok: [centos_7] + +TASK [Download SystemD replacer] *********************************************** +ok: [centos_7] + +TASK [Replace systemctl] ******************************************************* +ok: [centos_7] + +TASK [Apply Clickhouse Role] *************************************************** + +TASK [ansible-clickhouse : Include OS Family Specific Variables] *************** +ok: [centos_7] + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/ansible-clickhouse/tasks/precheck.yml for centos_7 + +TASK [ansible-clickhouse : Requirements check | Checking sse4_2 support] ******* +ok: [centos_7] + +TASK [ansible-clickhouse : Requirements check | Not supported distribution && release] *** +skipping: [centos_7] + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/ansible-clickhouse/tasks/params.yml for centos_7 + +TASK [ansible-clickhouse : Set clickhouse_service_enable] ********************** +ok: [centos_7] + +TASK [ansible-clickhouse : Set clickhouse_service_ensure] ********************** +ok: [centos_7] + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/ansible-clickhouse/tasks/install/yum.yml for centos_7 + +TASK [ansible-clickhouse : Install by YUM | Ensure clickhouse repo installed] *** +ok: [centos_7] + +TASK [ansible-clickhouse : Install by YUM | Ensure clickhouse package installed (latest)] *** +ok: [centos_7] + +TASK [ansible-clickhouse : Install by YUM | Ensure clickhouse package installed (version latest)] *** +skipping: [centos_7] + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/ansible-clickhouse/tasks/configure/sys.yml for centos_7 + +TASK [ansible-clickhouse : Check clickhouse config, data and logs] ************* +ok: [centos_7] => (item=/var/log/clickhouse-server) +ok: [centos_7] => (item=/etc/clickhouse-server) +ok: [centos_7] => (item=/var/lib/clickhouse/tmp/) +ok: [centos_7] => (item=/var/lib/clickhouse/) + +TASK [ansible-clickhouse : Config | Create config.d folder] ******************** +ok: [centos_7] + +TASK [ansible-clickhouse : Config | Create users.d folder] ********************* +ok: [centos_7] + +TASK [ansible-clickhouse : Config | Generate system config] ******************** +ok: [centos_7] + +TASK [ansible-clickhouse : Config | Generate users config] ********************* +ok: [centos_7] + +TASK [ansible-clickhouse : Config | Generate remote_servers config] ************ +skipping: [centos_7] + +TASK [ansible-clickhouse : Config | Generate macros config] ******************** +skipping: [centos_7] + +TASK [ansible-clickhouse : Config | Generate zookeeper servers config] ********* +skipping: [centos_7] + +TASK [ansible-clickhouse : Config | Fix interserver_http_port and intersever_https_port collision] *** +skipping: [centos_7] + +TASK [ansible-clickhouse : Notify Handlers Now] ******************************** + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/ansible-clickhouse/tasks/service.yml for centos_7 + +TASK [ansible-clickhouse : Ensure clickhouse-server.service is enabled: True and state: started] *** +ok: [centos_7] + +TASK [ansible-clickhouse : Wait for Clickhouse Server to Become Ready] ********* +ok: [centos_7] + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/ansible-clickhouse/tasks/configure/db.yml for centos_7 + +TASK [ansible-clickhouse : Set ClickHose Connection String] ******************** +ok: [centos_7] + +TASK [ansible-clickhouse : Gather list of existing databases] ****************** +ok: [centos_7] + +TASK [ansible-clickhouse : Config | Delete database config] ******************** +skipping: [centos_7] => (item={'name': 'testu1'}) +skipping: [centos_7] => (item={'name': 'testu2'}) +skipping: [centos_7] => (item={'name': 'testu3'}) +skipping: [centos_7] => (item={'name': 'testu4', 'state': 'absent'}) + +TASK [ansible-clickhouse : Config | Create database config] ******************** +skipping: [centos_7] => (item={'name': 'testu1'}) +skipping: [centos_7] => (item={'name': 'testu2'}) +skipping: [centos_7] => (item={'name': 'testu3'}) +skipping: [centos_7] => (item={'name': 'testu4', 'state': 'absent'}) + +TASK [ansible-clickhouse : include_tasks] ************************************** +included: /home/ansible-clickhouse/tasks/configure/dict.yml for centos_7 + +TASK [ansible-clickhouse : Config | Generate dictionary config] **************** +ok: [centos_7] + +TASK [ansible-clickhouse : include_tasks] ************************************** +skipping: [centos_7] + +PLAY RECAP ********************************************************************* +centos_7 : ok=26 changed=0 unreachable=0 failed=0 skipped=9 rescued=0 ignored=0 + +INFO Idempotence completed successfully. +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > side_effect +WARNING Skipping, side effect playbook not configured. +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > verify +INFO Running Ansible Verifier + +PLAY [Verify] ****************************************************************** + +TASK [Example assertion] ******************************************************* +ok: [centos_7] => { + "changed": false, + "msg": "All assertions passed" +} + +PLAY RECAP ********************************************************************* +centos_7 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +INFO Verifier completed successfully. +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > cleanup +WARNING Skipping, cleanup playbook not configured. +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/hosts.yml linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/hosts +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/group_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/group_vars +INFO Inventory /home/ansible-clickhouse/molecule/centos_7/../resources/inventory/host_vars/ linked to /home/.cache/molecule/ansible-clickhouse/centos_7/inventory/host_vars +INFO Running centos_7 > destroy + +PLAY [Destroy] ***************************************************************** + +TASK [Destroy molecule instance(s)] ******************************************** +changed: [localhost] => (item=centos_7) + +TASK [Wait for instance(s) deletion to complete] ******************************* +FAILED - RETRYING: [localhost]: Wait for instance(s) deletion to complete (300 retries left). +changed: [localhost] => (item=centos_7) + +TASK [Delete docker networks(s)] *********************************************** + +PLAY RECAP ********************************************************************* +localhost : ok=2 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 + +INFO Pruning extra files from scenario ephemeral directory +┌──(kali㉿kali)-[~/08-ansible-05/clickhouse] +└─$ + +''' + +--- + + + + ### Tox From 1623174b4a777a91d1980048354bd91c916dc092 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sun, 16 Apr 2023 19:45:03 +0400 Subject: [PATCH 066/146] Update README.md --- 08-ansible-05-testing/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/08-ansible-05-testing/README.md b/08-ansible-05-testing/README.md index 19818d5bc..349321a8c 100644 --- a/08-ansible-05-testing/README.md +++ b/08-ansible-05-testing/README.md @@ -23,7 +23,7 @@ ```console ┌──(kali㉿kali)-[~/08-ansible-05/clickhouse] -└─$ molecule test -s cen +└─$ molecule test -s centos_7 INFO centos_7 scenario test matrix: dependency, lint, cleanup, destroy, syntax, create, prepare, converge, idempotence, side_effect, verify, cleanup, destroy INFO Performing prerun... INFO Set ANSIBLE_LIBRARY=/home/.cache/ansible-compat/b9a93c/modules:/home/.ansible/plugins/modules:/usr/share/ansible/plugins/modules From 7e9712129d1a8449972c42f21d7a8571afc9f261 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sun, 16 Apr 2023 19:56:02 +0400 Subject: [PATCH 067/146] Update README.md --- 08-ansible-05-testing/README.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/08-ansible-05-testing/README.md b/08-ansible-05-testing/README.md index 349321a8c..8b051281b 100644 --- a/08-ansible-05-testing/README.md +++ b/08-ansible-05-testing/README.md @@ -1018,14 +1018,12 @@ INFO Pruning extra files from scenario ephemeral directory Используемое окружение на **Ubuntu 22**: ```console -┌──(kali㉿kali)-[~/08-ansible-05/clickhouse] -└─$ molecule --version +root@ubuntu:~$ molecule --version molecule 4.0.1 using python 3.10 ansible:2.13.3 delegated:4.0.1 from molecule docker:2.0.0 from molecule_docker requiring collections: community.docker>=3.0.0-a2 -┌──(kali㉿kali)-[~/08-ansible-05/clickhouse] -└─$ +root@ubuntu:~$ ``` Модифицированный `molecule/resources/playbooks/converge.yml` @@ -1058,7 +1056,7 @@ molecule 4.0.1 using python 3.10 :exclamation: Прогон теста molecule... Лог очень длинный :bangbang: ```console -┌──(kali㉿kali)-[~/08-ansible-05/clickhouse] molecule test -s centos_7 +root@ubuntu:~/ansible-clickhouse$ molecule test -s centos_7 INFO centos_7 scenario test matrix: dependency, lint, cleanup, destroy, syntax, create, prepare, converge, idempotence, side_effect, verify, cleanup, destroy INFO Performing prerun with role_name_check=0... INFO Set ANSIBLE_LIBRARY=/home/.cache/ansible-compat/b9a93c/modules:/home/.ansible/plugins/modules:/usr/share/ansible/plugins/modules @@ -2296,9 +2294,7 @@ PLAY RECAP ********************************************************************* localhost : ok=2 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 INFO Pruning extra files from scenario ephemeral directory -┌──(kali㉿kali)-[~/08-ansible-05/clickhouse] -└─$ - +root@ubuntu:~/ansible-clickhouse$ ''' --- From 7ac4bc24ce33b125690ecbe0087262f7dc5126e9 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sun, 16 Apr 2023 20:16:43 +0400 Subject: [PATCH 068/146] Update README.md --- 08-ansible-05-testing/README.md | 1418 ++++++++++++++++++++++++++++++- 1 file changed, 1409 insertions(+), 9 deletions(-) diff --git a/08-ansible-05-testing/README.md b/08-ansible-05-testing/README.md index 8b051281b..26673def7 100644 --- a/08-ansible-05-testing/README.md +++ b/08-ansible-05-testing/README.md @@ -2300,20 +2300,1419 @@ root@ubuntu:~/ansible-clickhouse$ --- +### 2. Перейдите в каталог с ролью **vector-role** и создайте сценарий тестирования по умолчанию при помощи `molecule init scenario --driver-name docker`. +> Сценарий по умолчанию - **default** +```console +root@ubuntu:~/vector-role$ molecule init scenario --driver-name docker +INFO Initializing new scenario default... +INFO Initialized scenario in /home/vector-role/molecule/default successfully. +root@ubuntu:~/vector-role$ +``` + +--- + +### 3. Добавьте несколько разных дистрибутивов (centos:8, ubuntu:latest) для инстансов и протестируйте роль, исправьте найденные ошибки, если они есть. + +Для работы в **Docker** были использованы готовые образы за авторством [pycontribs](https://hub.docker.com/u/pycontribs): + - [CentOS](https://hub.docker.com/r/pycontribs/centos/tags) (доступные теги: `7`, `8`) - `docker.io/pycontribs/centos` + - [Ubuntu](https://hub.docker.com/r/pycontribs/ubuntu/tags) (доступен только тег `latest`) - `docker.io/pycontribs/ubuntu` + +Итоговый файл настройки **molecule** + +```yaml +--- +dependency: + name: galaxy +driver: + name: docker + options: + D: true + vv: true +platforms: + - name: centos7 + image: docker.io/pycontribs/centos:7 + pre_build_image: true + - name: centos8 + image: docker.io/pycontribs/centos:8 + pre_build_image: true + - name: ubuntu + image: docker.io/pycontribs/ubuntu:latest + pre_build_image: true +provisioner: + name: ansible + options: + D: true + vv: true + playbooks: + converge: ../resources/converge.yml + verify: ../resources/verify.yml +verifier: + name: ansible +... +``` + +--- + +### 4. Добавьте несколько assert'ов в verify.yml файл для проверки работоспособности vector-role (проверка, что конфиг валидный, проверка успешности запуска, etc). Запустите тестирование роли повторно и проверьте, что оно прошло успешно. + +Готовый **playbook** проверок: + +```yaml +--- +- name: Verify vector installation + hosts: all + gather_facts: false + tasks: + - name: Get information about vector + ansible.builtin.command: systemctl show vector + register: srv_res + changed_when: false + - name: Assert vector service + ansible.builtin.assert: + that: + - srv_res.rc == 0 + - "'ActiveState=active' in srv_res.stdout_lines" + - "'LoadState=loaded' in srv_res.stdout_lines" + - "'SubState=running' in srv_res.stdout_lines" + - name: Validate vector configuration + ansible.builtin.command: vector validate + register: vld_res + changed_when: false + - name: Assert vector healthcheck + ansible.builtin.assert: + that: + - vld_res.rc == 0 + - "'Validated' == {{ vld_res.stdout_lines | map('trim') | list }}[-1]" +... +``` + +В проверках определяется текущий статус сервиса **vector** - загружен, активен (автозапуск) и запущен. +Далее выполняется верификация конфигурационного файла и самоконтроль **Vector**. + +По хорошему статус служб лучше проверять специальным модулем `ansible.builtin.service_facts` например так: +```yaml + - name: 'Gather Local Services' + ansible.builtin.service_facts: + become: true + - name: 'Assert Vector Service' + ansible.builtin.assert: + that: + - "'{{ service_name }}' in ansible_facts.services" + - "'running' == ansible_facts.services[service_name].state" + - "'enabled' == ansible_facts.services[service_name].status" +``` +> Переменная `service_name` должна содержать имя проверяемого сервиса +Но, к сожалению, а данной работе это не применить, так как модуль **service_facts** не может определить установленный через скрипт сервис **vector** + +
+:exclamation: Полный лог тестирования роли с использованием Molecule... Лог длинный :bangbang: + +```console +root@ubuntu:~/vector-role$ molecule test +INFO default scenario test matrix: dependency, lint, cleanup, destroy, syntax, create, prepare, converge, idempotence, side_effect, verify, cleanup, destroy +INFO Performing prerun with role_name_check=0... +INFO Set ANSIBLE_LIBRARY=/home/.cache/ansible-compat/f5bcd7/modules:/home/.ansible/plugins/modules:/usr/share/ansible/plugins/modules +INFO Set ANSIBLE_COLLECTIONS_PATH=/home/.cache/ansible-compat/f5bcd7/collections:/home/.ansible/collections:/usr/share/ansible/collections +INFO Set ANSIBLE_ROLES_PATH=/home/.cache/ansible-compat/f5bcd7/roles:/home/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles +INFO Using /home/.cache/ansible-compat/f5bcd7/roles/artem_shtepa.vector_role symlink to current repository in order to enable Ansible to find the role using its expected full name. +INFO Running default > dependency +WARNING Skipping, missing the requirements file. +WARNING Skipping, missing the requirements file. +INFO Running default > lint +INFO Lint is disabled. +INFO Running default > cleanup +WARNING Skipping, cleanup playbook not configured. +INFO Running default > destroy +INFO Sanity checks: 'docker' + +PLAY [Destroy] ***************************************************************** + +TASK [Destroy molecule instance(s)] ******************************************** +changed: [localhost] => (item=centos7) +changed: [localhost] => (item=centos8) +changed: [localhost] => (item=ubuntu) + +TASK [Wait for instance(s) deletion to complete] ******************************* +ok: [localhost] => (item=centos7) +ok: [localhost] => (item=centos8) +ok: [localhost] => (item=ubuntu) + +TASK [Delete docker networks(s)] *********************************************** + +PLAY RECAP ********************************************************************* +localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 + +INFO Running default > syntax + +playbook: /home/vector-role/molecule/resources/converge.yml +INFO Running default > create + +PLAY [Create] ****************************************************************** + +TASK [Log into a Docker registry] ********************************************** +skipping: [localhost] => (item=None) +skipping: [localhost] => (item=None) +skipping: [localhost] => (item=None) +skipping: [localhost] + +TASK [Check presence of custom Dockerfiles] ************************************ +ok: [localhost] => (item={'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}) +ok: [localhost] => (item={'image': 'docker.io/pycontribs/centos:8', 'name': 'centos8', 'pre_build_image': True}) +ok: [localhost] => (item={'image': 'docker.io/pycontribs/ubuntu:latest', 'name': 'ubuntu', 'pre_build_image': True}) + +TASK [Create Dockerfiles from image names] ************************************* +skipping: [localhost] => (item={'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}) +skipping: [localhost] => (item={'image': 'docker.io/pycontribs/centos:8', 'name': 'centos8', 'pre_build_image': True}) +skipping: [localhost] => (item={'image': 'docker.io/pycontribs/ubuntu:latest', 'name': 'ubuntu', 'pre_build_image': True}) + +TASK [Discover local Docker images] ******************************************** +ok: [localhost] => (item={'changed': False, 'skipped': True, 'skip_reason': 'Conditional result was False', 'item': {'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}, 'ansible_loop_var': 'item', 'i': 0, 'ansible_index_var': 'i'}) +ok: [localhost] => (item={'changed': False, 'skipped': True, 'skip_reason': 'Conditional result was False', 'item': {'image': 'docker.io/pycontribs/centos:8', 'name': 'centos8', 'pre_build_image': True}, 'ansible_loop_var': 'item', 'i': 1, 'ansible_index_var': 'i'}) +ok: [localhost] => (item={'changed': False, 'skipped': True, 'skip_reason': 'Conditional result was False', 'item': {'image': 'docker.io/pycontribs/ubuntu:latest', 'name': 'ubuntu', 'pre_build_image': True}, 'ansible_loop_var': 'item', 'i': 2, 'ansible_index_var': 'i'}) + +TASK [Build an Ansible compatible image (new)] ********************************* +skipping: [localhost] => (item=molecule_local/docker.io/pycontribs/centos:7) +skipping: [localhost] => (item=molecule_local/docker.io/pycontribs/centos:8) +skipping: [localhost] => (item=molecule_local/docker.io/pycontribs/ubuntu:latest) + +TASK [Create docker network(s)] ************************************************ + +TASK [Determine the CMD directives] ******************************************** +ok: [localhost] => (item={'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}) +ok: [localhost] => (item={'image': 'docker.io/pycontribs/centos:8', 'name': 'centos8', 'pre_build_image': True}) +ok: [localhost] => (item={'image': 'docker.io/pycontribs/ubuntu:latest', 'name': 'ubuntu', 'pre_build_image': True}) + +TASK [Create molecule instance(s)] ********************************************* +changed: [localhost] => (item=centos7) +changed: [localhost] => (item=centos8) +changed: [localhost] => (item=ubuntu) + +TASK [Wait for instance(s) creation to complete] ******************************* +changed: [localhost] => (item={'failed': 0, 'started': 1, 'finished': 0, 'ansible_job_id': '694370910668.38264', 'results_file': '/home/.ansible_async/694370910668.38264', 'changed': True, 'item': {'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}, 'ansible_loop_var': 'item'}) +FAILED - RETRYING: [localhost]: Wait for instance(s) creation to complete (300 retries left). +changed: [localhost] => (item={'failed': 0, 'started': 1, 'finished': 0, 'ansible_job_id': '505681089154.38290', 'results_file': '/home/.ansible_async/505681089154.38290', 'changed': True, 'item': {'image': 'docker.io/pycontribs/centos:8', 'name': 'centos8', 'pre_build_image': True}, 'ansible_loop_var': 'item'}) +changed: [localhost] => (item={'failed': 0, 'started': 1, 'finished': 0, 'ansible_job_id': '681996805273.38323', 'results_file': '/home/.ansible_async/681996805273.38323', 'changed': True, 'item': {'image': 'docker.io/pycontribs/ubuntu:latest', 'name': 'ubuntu', 'pre_build_image': True}, 'ansible_loop_var': 'item'}) + +PLAY RECAP ********************************************************************* +localhost : ok=5 changed=2 unreachable=0 failed=0 skipped=4 rescued=0 ignored=0 + +INFO Running default > prepare +WARNING Skipping, prepare playbook not configured. +INFO Running default > converge + +PLAY [Converge] **************************************************************** + +TASK [Gathering Facts] ********************************************************* +ok: [ubuntu] +ok: [centos8] +ok: [centos7] + +TASK [Detect python3 version] ************************************************** +ok: [centos8] +ok: [ubuntu] +ok: [centos7] + +TASK [Set python version of script to 3] *************************************** +skipping: [centos7] +ok: [centos8] +ok: [ubuntu] + +TASK [Download SystemD replacer v3] ******************************************** +skipping: [centos7] +changed: [ubuntu] +changed: [centos8] + +TASK [Download SystemD replacer v2] ******************************************** +skipping: [centos8] +skipping: [ubuntu] +changed: [centos7] + +TASK [Create systemd directories] ********************************************** +--- before ++++ after +@@ -1,4 +1,4 @@ + { + "path": "/run/systemd/system", +- "state": "absent" ++ "state": "directory" + } + +changed: [centos7] => (item=/run/systemd/system) +--- before ++++ after +@@ -1,4 +1,4 @@ + { + "path": "/run/systemd/system", +- "state": "absent" ++ "state": "directory" + } + +changed: [centos8] => (item=/run/systemd/system) +--- before ++++ after +@@ -1,4 +1,4 @@ + { + "path": "/run/systemd/system", +- "state": "absent" ++ "state": "directory" + } + +changed: [ubuntu] => (item=/run/systemd/system) +ok: [centos7] => (item=/usr/lib/systemd/system) +ok: [centos8] => (item=/usr/lib/systemd/system) +--- before ++++ after +@@ -1,4 +1,4 @@ + { + "path": "/usr/lib/systemd/system", +- "state": "absent" ++ "state": "directory" + } + +changed: [ubuntu] => (item=/usr/lib/systemd/system) + +TASK [Replace systemctl] ******************************************************* +changed: [centos7] +changed: [ubuntu] +changed: [centos8] + +TASK [ReCollect system info] *************************************************** +ok: [centos8] +ok: [ubuntu] +ok: [centos7] + +TASK [Get Clickhouse IP from docker engine] ************************************ +ok: [centos7 -> localhost] +ok: [centos8 -> localhost] +ok: [ubuntu -> localhost] + +TASK [Set Clickhouse IP to facts] ********************************************** +ok: [centos7] +ok: [centos8] +ok: [ubuntu] + +TASK [Include vector-role] ***************************************************** + +TASK [vector-role : Download distrib] ****************************************** +changed: [ubuntu] +changed: [centos8] +changed: [centos7] + +TASK [vector-role : Create distrib directory] ********************************** +--- before ++++ after +@@ -1,4 +1,4 @@ + { + "path": "/root/vector", +- "state": "absent" ++ "state": "directory" + } + +changed: [ubuntu] +--- before ++++ after +@@ -1,4 +1,4 @@ + { + "path": "/root/vector", +- "state": "absent" ++ "state": "directory" + } + +changed: [centos7] +--- before ++++ after +@@ -1,4 +1,4 @@ + { + "path": "/root/vector", +- "state": "absent" ++ "state": "directory" + } + +changed: [centos8] + +TASK [vector-role : Unpack vector distrib by unarchive] ************************ +changed: [centos8] +changed: [ubuntu] +changed: [centos7] + +TASK [vector-role : Install vector executable] ********************************* +changed: [centos8] +changed: [centos7] +changed: [ubuntu] + +TASK [vector-role : Create vector directories] ********************************* +--- before ++++ after +@@ -1,4 +1,4 @@ + { + "path": "/var/lib/vector", +- "state": "absent" ++ "state": "directory" + } + +changed: [centos7] => (item=/var/lib/vector) +--- before ++++ after +@@ -1,4 +1,4 @@ + { + "path": "/var/lib/vector", +- "state": "absent" ++ "state": "directory" + } + +changed: [centos8] => (item=/var/lib/vector) +--- before ++++ after +@@ -1,4 +1,4 @@ + { + "path": "/var/lib/vector", +- "state": "absent" ++ "state": "directory" + } + +changed: [ubuntu] => (item=/var/lib/vector) +--- before ++++ after +@@ -1,4 +1,4 @@ + { + "path": "/etc/vector", +- "state": "absent" ++ "state": "directory" + } + +changed: [centos7] => (item=/etc/vector) +--- before ++++ after +@@ -1,4 +1,4 @@ + { + "path": "/etc/vector", +- "state": "absent" ++ "state": "directory" + } + +changed: [centos8] => (item=/etc/vector) +--- before ++++ after +@@ -1,4 +1,4 @@ + { + "path": "/etc/vector", +- "state": "absent" ++ "state": "directory" + } + +changed: [ubuntu] => (item=/etc/vector) + +TASK [vector-role : Create test directory] ************************************* +--- before ++++ after +@@ -1,4 +1,4 @@ + { + "path": "/root/test", +- "state": "absent" ++ "state": "directory" + } + +changed: [centos7] +--- before ++++ after +@@ -1,4 +1,4 @@ + { + "path": "/root/test", +- "state": "absent" ++ "state": "directory" + } + +changed: [centos8] +--- before ++++ after +@@ -1,4 +1,4 @@ + { + "path": "/root/test", +- "state": "absent" ++ "state": "directory" + } + +changed: [ubuntu] + +TASK [vector-role : Install vector configuration] ****************************** +--- before ++++ after: /home/.ansible/tmp/ansible-local-38634vd4fbr1r/tmp2m12gnzi/vector.toml.j2 +@@ -0,0 +1,24 @@ ++# Set global options ++data_dir = "/var/lib/vector" ++ ++# Vector's API (disabled by default) ++# Enable and try it out with the `vector top` command ++[api] ++enabled = true ++address = "0.0.0.0:8686" ++ ++[sources.test_log] ++type = "file" ++ignore_older_secs = 600 ++include = [ "/root/test/*.log" ] ++read_from = "beginning" ++ ++[sinks.clickhouse] ++type = "clickhouse" ++inputs = [ "test_log" ] ++database = "logs" ++endpoint = "http://172.17.0.2:8123" ++table = "file_log" ++compression = "gzip" ++auth = { user = "user", password = "userlog", strategy = "basic" } ++skip_unknown_fields = true + +changed: [centos7] +--- before ++++ after: /home/.ansible/tmp/ansible-local-38634vd4fbr1r/tmpvgzhew_n/vector.toml.j2 +@@ -0,0 +1,24 @@ ++# Set global options ++data_dir = "/var/lib/vector" ++ ++# Vector's API (disabled by default) ++# Enable and try it out with the `vector top` command ++[api] ++enabled = true ++address = "0.0.0.0:8686" ++ ++[sources.test_log] ++type = "file" ++ignore_older_secs = 600 ++include = [ "/root/test/*.log" ] ++read_from = "beginning" ++ ++[sinks.clickhouse] ++type = "clickhouse" ++inputs = [ "test_log" ] ++database = "logs" ++endpoint = "http://172.17.0.2:8123" ++table = "file_log" ++compression = "gzip" ++auth = { user = "user", password = "userlog", strategy = "basic" } ++skip_unknown_fields = true + +changed: [ubuntu] +--- before ++++ after: /home/.ansible/tmp/ansible-local-38634vd4fbr1r/tmpdsjgvgmu/vector.toml.j2 +@@ -0,0 +1,24 @@ ++# Set global options ++data_dir = "/var/lib/vector" ++ ++# Vector's API (disabled by default) ++# Enable and try it out with the `vector top` command ++[api] ++enabled = true ++address = "0.0.0.0:8686" ++ ++[sources.test_log] ++type = "file" ++ignore_older_secs = 600 ++include = [ "/root/test/*.log" ] ++read_from = "beginning" ++ ++[sinks.clickhouse] ++type = "clickhouse" ++inputs = [ "test_log" ] ++database = "logs" ++endpoint = "http://172.17.0.2:8123" ++table = "file_log" ++compression = "gzip" ++auth = { user = "user", password = "userlog", strategy = "basic" } ++skip_unknown_fields = true + +changed: [centos8] + +TASK [vector-role : Install vector service file] ******************************* +--- before ++++ after: /home/.ansible/tmp/ansible-local-38634vd4fbr1r/tmp9t21ccx1/vector.service.j2 +@@ -0,0 +1,16 @@ ++[Unit] ++Description=Vector ++Documentation=https://vector.dev ++After=network-online.target ++Requires=network-online.target ++ ++[Service] ++ExecStart=/usr/bin/vector -c /etc/vector/vector.toml ++ExecReload=/usr/bin/vector -c /etc/vector/vector.toml validate ++ExecReload=/bin/kill -HUP $MAINPID ++Restart=no ++AmbientCapabilities=CAP_NET_BIND_SERVICE ++EnvironmentFile=-/etc/default/vector ++ ++[Install] ++WantedBy=multi-user.target + +changed: [centos7] +--- before ++++ after: /home/.ansible/tmp/ansible-local-38634vd4fbr1r/tmpx5rqhlvm/vector.service.j2 +@@ -0,0 +1,16 @@ ++[Unit] ++Description=Vector ++Documentation=https://vector.dev ++After=network-online.target ++Requires=network-online.target ++ ++[Service] ++ExecStart=/usr/bin/vector -c /etc/vector/vector.toml ++ExecReload=/usr/bin/vector -c /etc/vector/vector.toml validate ++ExecReload=/bin/kill -HUP $MAINPID ++Restart=no ++AmbientCapabilities=CAP_NET_BIND_SERVICE ++EnvironmentFile=-/etc/default/vector ++ ++[Install] ++WantedBy=multi-user.target + +changed: [centos8] +--- before ++++ after: /home/.ansible/tmp/ansible-local-38634vd4fbr1r/tmpyx13qio2/vector.service.j2 +@@ -0,0 +1,16 @@ ++[Unit] ++Description=Vector ++Documentation=https://vector.dev ++After=network-online.target ++Requires=network-online.target ++ ++[Service] ++ExecStart=/usr/bin/vector -c /etc/vector/vector.toml ++ExecReload=/usr/bin/vector -c /etc/vector/vector.toml validate ++ExecReload=/bin/kill -HUP $MAINPID ++Restart=no ++AmbientCapabilities=CAP_NET_BIND_SERVICE ++EnvironmentFile=-/etc/default/vector ++ ++[Install] ++WantedBy=multi-user.target + +changed: [ubuntu] + +TASK [vector-role : Enable vector service] ************************************* +changed: [ubuntu] +changed: [centos8] +changed: [centos7] + +RUNNING HANDLER [vector-role : Start vector service] *************************** +changed: [centos8] +changed: [ubuntu] +changed: [centos7] + +PLAY RECAP ********************************************************************* +centos7 : ok=18 changed=13 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 +centos8 : ok=19 changed=13 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 +ubuntu : ok=19 changed=13 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 + +INFO Running default > idempotence + +PLAY [Converge] **************************************************************** + +TASK [Gathering Facts] ********************************************************* +ok: [centos8] +ok: [ubuntu] +ok: [centos7] + +TASK [Detect python3 version] ************************************************** +ok: [ubuntu] +ok: [centos8] +ok: [centos7] + +TASK [Set python version of script to 3] *************************************** +skipping: [centos7] +ok: [centos8] +ok: [ubuntu] + +TASK [Download SystemD replacer v3] ******************************************** +skipping: [centos7] +ok: [ubuntu] +ok: [centos8] + +TASK [Download SystemD replacer v2] ******************************************** +skipping: [centos8] +skipping: [ubuntu] +ok: [centos7] + +TASK [Create systemd directories] ********************************************** +ok: [centos7] => (item=/run/systemd/system) +ok: [centos8] => (item=/run/systemd/system) +ok: [ubuntu] => (item=/run/systemd/system) +ok: [centos7] => (item=/usr/lib/systemd/system) +ok: [ubuntu] => (item=/usr/lib/systemd/system) +ok: [centos8] => (item=/usr/lib/systemd/system) + +TASK [Replace systemctl] ******************************************************* +ok: [centos7] +ok: [ubuntu] +ok: [centos8] + +TASK [ReCollect system info] *************************************************** +ok: [centos8] +ok: [ubuntu] +ok: [centos7] + +TASK [Get Clickhouse IP from docker engine] ************************************ +ok: [centos7 -> localhost] +ok: [centos8 -> localhost] +ok: [ubuntu -> localhost] + +TASK [Set Clickhouse IP to facts] ********************************************** +ok: [centos7] +ok: [centos8] +ok: [ubuntu] + +TASK [Include vector-role] ***************************************************** + +TASK [vector-role : Download distrib] ****************************************** +ok: [centos7] +ok: [ubuntu] +ok: [centos8] + +TASK [vector-role : Create distrib directory] ********************************** +ok: [centos7] +ok: [centos8] +ok: [ubuntu] + +TASK [vector-role : Unpack vector distrib by unarchive] ************************ +ok: [ubuntu] +ok: [centos8] +ok: [centos7] + +TASK [vector-role : Install vector executable] ********************************* +ok: [centos7] +ok: [ubuntu] +ok: [centos8] + +TASK [vector-role : Create vector directories] ********************************* +ok: [centos7] => (item=/var/lib/vector) +ok: [ubuntu] => (item=/var/lib/vector) +ok: [centos8] => (item=/var/lib/vector) +ok: [centos7] => (item=/etc/vector) +ok: [centos8] => (item=/etc/vector) +ok: [ubuntu] => (item=/etc/vector) + +TASK [vector-role : Create test directory] ************************************* +ok: [centos7] +ok: [centos8] +ok: [ubuntu] + +TASK [vector-role : Install vector configuration] ****************************** +ok: [centos7] +ok: [centos8] +ok: [ubuntu] + +TASK [vector-role : Install vector service file] ******************************* +ok: [centos7] +ok: [centos8] +ok: [ubuntu] + +TASK [vector-role : Enable vector service] ************************************* +ok: [ubuntu] +ok: [centos8] +ok: [centos7] + +PLAY RECAP ********************************************************************* +centos7 : ok=17 changed=0 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 +centos8 : ok=18 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 +ubuntu : ok=18 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 + +INFO Idempotence completed successfully. +INFO Running default > side_effect +WARNING Skipping, side effect playbook not configured. +INFO Running default > verify +INFO Running Ansible Verifier + +PLAY [Verify vector installation] ********************************************** + +TASK [Get information about vector] ******************************************** +ok: [centos8] +ok: [ubuntu] +ok: [centos7] + +TASK [Assert vector service] *************************************************** +ok: [centos7] => { + "changed": false, + "msg": "All assertions passed" +} +ok: [centos8] => { + "changed": false, + "msg": "All assertions passed" +} +ok: [ubuntu] => { + "changed": false, + "msg": "All assertions passed" +} + +TASK [Validate vector configuration] ******************************************* +ok: [centos8] +ok: [ubuntu] +ok: [centos7] + +TASK [Assert vector healthcheck] *********************************************** +ok: [centos7] => { + "changed": false, + "msg": "All assertions passed" +} +ok: [centos8] => { + "changed": false, + "msg": "All assertions passed" +} +ok: [ubuntu] => { + "changed": false, + "msg": "All assertions passed" +} + +PLAY RECAP ********************************************************************* +centos7 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +centos8 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 +ubuntu : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +INFO Verifier completed successfully. +INFO Running default > cleanup +WARNING Skipping, cleanup playbook not configured. +INFO Running default > destroy + +PLAY [Destroy] ***************************************************************** + +TASK [Destroy molecule instance(s)] ******************************************** +changed: [localhost] => (item=centos7) +changed: [localhost] => (item=centos8) +changed: [localhost] => (item=ubuntu) + +TASK [Wait for instance(s) deletion to complete] ******************************* +FAILED - RETRYING: [localhost]: Wait for instance(s) deletion to complete (300 retries left). +changed: [localhost] => (item=centos7) +changed: [localhost] => (item=centos8) +changed: [localhost] => (item=ubuntu) + +TASK [Delete docker networks(s)] *********************************************** + +PLAY RECAP ********************************************************************* +localhost : ok=2 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 + +INFO Pruning extra files from scenario ephemeral directory +root@ubuntu:~/vector-role$ +``` +
+ +--- + +### 5. Добавьте новый тег на коммит с рабочим сценарием в соответствии с семантическим версионированием. + +Для успешного тестирования роли был необходим функционирующий экземпляр **Clickhouse**, для чего выполнялось его расзворачивание в отдельном контейнере **docker** + +Файл [манифеста](clickhouse/docker-compose.yml) **Docker compose** + +```yaml +--- +version: "2.4" +services: + clickhouse_vm: + image: pycontribs/centos:7 + container_name: clickhouse-01 + ports: + - "9000:9000" + - "8123:8123" + tty: true + network_mode: bridge +... +``` + +После создания контейнера, на нём применена роль [Ansible-clickhouse](https://github.com/NamorNinayzuk/ansible-clickhouse). + +Все необходимые файлы инфраструктуры [тут](clickhouse/) + +--- + +## Tox + +> 1. Добавьте в директорию с vector-role файлы из [директории](./example) +> 1. Запустите `docker run --privileged=True -v :/opt/vector-role -w /opt/vector-role -it aragast/netology:latest /bin/bash`, где path_to_repo - путь до корня репозитория с vector-role на вашей файловой системе. +> 1. Внутри контейнера выполните команду `tox`, посмотрите на вывод. +> 1. Создайте облегчённый сценарий для `molecule` с драйвером `molecule_podman`. Проверьте его на исполнимость. +> 1. Пропишите правильную команду в `tox.ini` для того чтобы запускался облегчённый сценарий. +> 1. Запустите команду `tox`. Убедитесь, что всё отработало успешно. +> 1. Добавьте новый тег на коммит с рабочим сценарием в соответствии с семантическим версионированием. +> +> После выполнения у вас должно получится два сценария molecule и один tox.ini файл в репозитории. +> Ссылка на репозиторий являются ответами на домашнее задание. +> Не забудьте указать в ответе теги решений Tox и Molecule заданий. +Используемое окружение: + +```console +root@ubuntu:~/vector-role$ molecule --version +molecule 4.0.1 using python 3.10 + ansible:2.13.3 + delegated:4.0.1 from molecule + docker:2.0.0 from molecule_docker requiring collections: community.docker>=3.0.0-a2 + podman:2.0.2 from molecule_podman requiring collections: containers.podman>=1.7.0 ansible.posix>=1.3.0 +root@ubuntu:~/vector-role$ +``` + +Чтобы не множить остановленные после завершения работы **Docker** контейнеры в строку запуска добавлен параметр `--rm` + +Первый запуск **Tox** внутри контейнера: + +```console +root@ubuntu:~/vector-role$ docker run --privileged=True --rm -v ~/vector-role:/opt/vector-role -w /opt/vector-role -it aragast/netology:latest /bin/bash +[root@f8b40ec440dc vector-role]# tox +py37-ansible210 create: /opt/vector-role/.tox/py37-ansible210 +py37-ansible210 installdeps: -rtox-requirements.txt, ansible<3.0 +py37-ansible210 installed: ansible==2.10.7,ansible-base==2.10.17,ansible-compat==1.0.0,ansible-lint==5.1.3,arrow==1.2.3,bcrypt==4.0.0,binaryornot==0.4.4,bracex==2.3.post1,cached-property==1.5.2,Cerberus==1.3.2,certifi==2022.6.15.1,cffi==1.15.1,chardet==5.0.0,charset-normalizer==2.1.1,click==8.1.3,click-help-colors==0.9.1,commonmark==0.9.1,cookiecutter==2.1.1,cryptography==38.0.1,distro==1.7.0,enrich==1.2.7,idna==3.3,importlib-metadata==4.12.0,Jinja2==3.1.2,jinja2-time==0.2.0,jmespath==1.0.1,lxml==4.9.1,MarkupSafe==2.1.1,molecule==3.4.0,molecule-podman==1.0.1,packaging==21.3,paramiko==2.11.0,pathspec==0.10.1,pluggy==0.13.1,pycparser==2.21,Pygments==2.13.0,PyNaCl==1.5.0,pyparsing==3.0.9,python-dateutil==2.8.2,python-slugify==6.1.2,PyYAML==5.4.1,requests==2.28.1,rich==12.5.1,ruamel.yaml==0.17.21,ruamel.yaml.clib==0.2.6,selinux==0.2.1,six==1.16.0,subprocess-tee==0.3.5,tenacity==8.0.1,text-unidecode==1.3,typing_extensions==4.3.0,urllib3==1.26.12,wcmatch==8.4,yamllint==1.26.3,zipp==3.8.1 +py37-ansible210 run-test-pre: PYTHONHASHSEED='1189971644' +py37-ansible210 run-test: commands[0] | molecule test -s compatibility --destroy always +CRITICAL 'molecule/compatibility/molecule.yml' glob failed. Exiting. +ERROR: InvocationError for command /opt/vector-role/.tox/py37-ansible210/bin/molecule test -s compatibility --destroy always (exited with code 1) +py37-ansible30 create: /opt/vector-role/.tox/py37-ansible30 +py37-ansible30 installdeps: -rtox-requirements.txt, ansible<3.1 +py37-ansible30 installed: ansible==3.0.0,ansible-base==2.10.17,ansible-compat==1.0.0,ansible-lint==5.1.3,arrow==1.2.3,bcrypt==4.0.0,binaryornot==0.4.4,bracex==2.3.post1,cached-property==1.5.2,Cerberus==1.3.2,certifi==2022.6.15.1,cffi==1.15.1,chardet==5.0.0,charset-normalizer==2.1.1,click==8.1.3,click-help-colors==0.9.1,commonmark==0.9.1,cookiecutter==2.1.1,cryptography==38.0.1,distro==1.7.0,enrich==1.2.7,idna==3.3,importlib-metadata==4.12.0,Jinja2==3.1.2,jinja2-time==0.2.0,jmespath==1.0.1,lxml==4.9.1,MarkupSafe==2.1.1,molecule==3.4.0,molecule-podman==1.0.1,packaging==21.3,paramiko==2.11.0,pathspec==0.10.1,pluggy==0.13.1,pycparser==2.21,Pygments==2.13.0,PyNaCl==1.5.0,pyparsing==3.0.9,python-dateutil==2.8.2,python-slugify==6.1.2,PyYAML==5.4.1,requests==2.28.1,rich==12.5.1,ruamel.yaml==0.17.21,ruamel.yaml.clib==0.2.6,selinux==0.2.1,six==1.16.0,subprocess-tee==0.3.5,tenacity==8.0.1,text-unidecode==1.3,typing_extensions==4.3.0,urllib3==1.26.12,wcmatch==8.4,yamllint==1.26.3,zipp==3.8.1 +py37-ansible30 run-test-pre: PYTHONHASHSEED='1189971644' +py37-ansible30 run-test: commands[0] | molecule test -s compatibility --destroy always +CRITICAL 'molecule/compatibility/molecule.yml' glob failed. Exiting. +ERROR: InvocationError for command /opt/vector-role/.tox/py37-ansible30/bin/molecule test -s compatibility --destroy always (exited with code 1) +py39-ansible210 create: /opt/vector-role/.tox/py39-ansible210 +py39-ansible210 installdeps: -rtox-requirements.txt, ansible<3.0 +py39-ansible210 installed: ansible==2.10.7,ansible-base==2.10.17,ansible-compat==2.2.0,ansible-lint==5.1.3,arrow==1.2.3,attrs==22.1.0,bcrypt==4.0.0,binaryornot==0.4.4,bracex==2.3.post1,Cerberus==1.3.2,certifi==2022.6.15.1,cffi==1.15.1,chardet==5.0.0,charset-normalizer==2.1.1,click==8.1.3,click-help-colors==0.9.1,commonmark==0.9.1,cookiecutter==2.1.1,cryptography==38.0.1,distro==1.7.0,enrich==1.2.7,idna==3.3,Jinja2==3.1.2,jinja2-time==0.2.0,jmespath==1.0.1,jsonschema==4.16.0,lxml==4.9.1,MarkupSafe==2.1.1,molecule==3.4.0,molecule-podman==1.0.1,packaging==21.3,paramiko==2.11.0,pathspec==0.10.1,pluggy==0.13.1,pycparser==2.21,Pygments==2.13.0,PyNaCl==1.5.0,pyparsing==3.0.9,pyrsistent==0.18.1,python-dateutil==2.8.2,python-slugify==6.1.2,PyYAML==5.4.1,requests==2.28.1,rich==12.5.1,ruamel.yaml==0.17.21,ruamel.yaml.clib==0.2.6,selinux==0.2.1,six==1.16.0,subprocess-tee==0.3.5,tenacity==8.0.1,text-unidecode==1.3,urllib3==1.26.12,wcmatch==8.4,yamllint==1.26.3 +py39-ansible210 run-test-pre: PYTHONHASHSEED='1189971644' +py39-ansible210 run-test: commands[0] | molecule test -s compatibility --destroy always +CRITICAL 'molecule/compatibility/molecule.yml' glob failed. Exiting. +ERROR: InvocationError for command /opt/vector-role/.tox/py39-ansible210/bin/molecule test -s compatibility --destroy always (exited with code 1) +py39-ansible30 create: /opt/vector-role/.tox/py39-ansible30 +py39-ansible30 installdeps: -rtox-requirements.txt, ansible<3.1 +py39-ansible30 installed: ansible==3.0.0,ansible-base==2.10.17,ansible-compat==2.2.0,ansible-lint==5.1.3,arrow==1.2.3,attrs==22.1.0,bcrypt==4.0.0,binaryornot==0.4.4,bracex==2.3.post1,Cerberus==1.3.2,certifi==2022.6.15.1,cffi==1.15.1,chardet==5.0.0,charset-normalizer==2.1.1,click==8.1.3,click-help-colors==0.9.1,commonmark==0.9.1,cookiecutter==2.1.1,cryptography==38.0.1,distro==1.7.0,enrich==1.2.7,idna==3.3,Jinja2==3.1.2,jinja2-time==0.2.0,jmespath==1.0.1,jsonschema==4.16.0,lxml==4.9.1,MarkupSafe==2.1.1,molecule==3.4.0,molecule-podman==1.0.1,packaging==21.3,paramiko==2.11.0,pathspec==0.10.1,pluggy==0.13.1,pycparser==2.21,Pygments==2.13.0,PyNaCl==1.5.0,pyparsing==3.0.9,pyrsistent==0.18.1,python-dateutil==2.8.2,python-slugify==6.1.2,PyYAML==5.4.1,requests==2.28.1,rich==12.5.1,ruamel.yaml==0.17.21,ruamel.yaml.clib==0.2.6,selinux==0.2.1,six==1.16.0,subprocess-tee==0.3.5,tenacity==8.0.1,text-unidecode==1.3,urllib3==1.26.12,wcmatch==8.4,yamllint==1.26.3 +py39-ansible30 run-test-pre: PYTHONHASHSEED='1189971644' +py39-ansible30 run-test: commands[0] | molecule test -s compatibility --destroy always +CRITICAL 'molecule/compatibility/molecule.yml' glob failed. Exiting. +ERROR: InvocationError for command /opt/vector-role/.tox/py39-ansible30/bin/molecule test -s compatibility --destroy always (exited with code 1) +_______________________________________________________ summary ________________________________________________________ +ERROR: py37-ansible210: commands failed +ERROR: py37-ansible30: commands failed +ERROR: py39-ansible210: commands failed +ERROR: py39-ansible30: commands failed +[root@f8b40ec440dc vector-role]# +``` + +> Так как **Docker** контейнер запускался с проброшеным внутрь каталогом роли (`-v ~/vector-role:/opt/vector-role`), +> то выполнение **Tox** создало кэш используемых окружений вне контейнера (каталог `~/vector-role/.tox`), +> что позволяет повторно их использовать даже после удаления и пересоздания контейнера (поэтому использование параметра `--rm` вполне оправдано) +Из сообщений видно, что все проверки **Tox** завершились одинаковой ошибкой, связанной с исполняемой командой, +а именно: `molecule test -s compatibility --destroy always`, что логично, потому что сценария `compatibility` в роли нет. + +Инициализация нового сценария с драйвером **podman** + +```console +root@ubuntu:~/vector-role$ molecule init scenario podman --driver-name podman +INFO Initializing new scenario podman... +INFO Initialized scenario in /home/vector-role/molecule/podman successfully. +root@ubuntu:~/vector-role$ +``` + +
+:exclamation: Вывод работы Tox на сокращённом сценарии... Лог длинный :bangbang: + +```console +[root@a906a0f6163d vector-role]# tox +py37-ansible210 installed: ansible==2.10.7,ansible-base==2.10.17,ansible-compat==1.0.0,ansible-lint==5.1.3,arrow==1.2.3,bcrypt==4.0.0,binaryornot==0.4.4,bracex==2.3.post1,cached-property==1.5.2,Cerberus==1.3.2,certifi==2022.6.15.1,cffi==1.15.1,chardet==5.0.0,charset-normalizer==2.1.1,click==8.1.3,click-help-colors==0.9.1,commonmark==0.9.1,cookiecutter==2.1.1,cryptography==38.0.1,distro==1.7.0,enrich==1.2.7,idna==3.3,importlib-metadata==4.12.0,Jinja2==3.1.2,jinja2-time==0.2.0,jmespath==1.0.1,lxml==4.9.1,MarkupSafe==2.1.1,molecule==3.4.0,molecule-podman==1.0.1,packaging==21.3,paramiko==2.11.0,pathspec==0.10.1,pluggy==0.13.1,pycparser==2.21,Pygments==2.13.0,PyNaCl==1.5.0,pyparsing==3.0.9,python-dateutil==2.8.2,python-slugify==6.1.2,PyYAML==5.4.1,requests==2.28.1,rich==12.5.1,ruamel.yaml==0.17.21,ruamel.yaml.clib==0.2.6,selinux==0.2.1,six==1.16.0,subprocess-tee==0.3.5,tenacity==8.0.1,text-unidecode==1.3,typing_extensions==4.3.0,urllib3==1.26.12,wcmatch==8.4,yamllint==1.26.3,zipp==3.8.1 +py37-ansible210 run-test-pre: PYTHONHASHSEED='2945318393' +py37-ansible210 run-test: commands[0] | molecule test -s podman --destroy always +INFO podman scenario test matrix: dependency, lint, cleanup, destroy, syntax, create, prepare, converge, idempotence, side_effect, verify, cleanup, destroy +INFO Performing prerun... +WARNING Failed to locate command: [Errno 2] No such file or directory: 'git': 'git' +INFO Guessed /opt/vector-role as project root directory +INFO Using /root/.cache/ansible-lint/b984a4/roles/artem_shtepa.vector_role symlink to current repository in order to enable Ansible to find the role using its expected full name. +INFO Added ANSIBLE_ROLES_PATH=~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles:/root/.cache/ansible-lint/b984a4/roles +INFO Running podman > dependency +WARNING Skipping, missing the requirements file. +WARNING Skipping, missing the requirements file. +INFO Running podman > lint +INFO Lint is disabled. +INFO Running podman > cleanup +WARNING Skipping, cleanup playbook not configured. +INFO Running podman > destroy +INFO Sanity checks: 'podman' + +PLAY [Destroy] ***************************************************************** + +TASK [Destroy molecule instance(s)] ******************************************** +changed: [localhost] => (item={'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}) + +TASK [Wait for instance(s) deletion to complete] ******************************* +changed: [localhost] => (item={'started': 1, 'finished': 0, 'ansible_job_id': '269176633897.3284', 'results_file': '/root/.ansible_async/269176633897.3284', 'changed': True, 'failed': False, 'item': {'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}, 'ansible_loop_var': 'item'}) + +PLAY RECAP ********************************************************************* +localhost : ok=2 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +INFO Running podman > syntax + +playbook: /opt/vector-role/molecule/resources/converge.yml +INFO Running podman > create + +PLAY [Create] ****************************************************************** + +TASK [get podman executable path] ********************************************** +ok: [localhost] + +TASK [save path to executable as fact] ***************************************** +ok: [localhost] + +TASK [Log into a container registry] ******************************************* +skipping: [localhost] => (item="centos7 registry username: None specified") + +TASK [Check presence of custom Dockerfiles] ************************************ +ok: [localhost] => (item=Dockerfile: None specified) + +TASK [Create Dockerfiles from image names] ************************************* +skipping: [localhost] => (item="Dockerfile: None specified; Image: docker.io/pycontribs/centos:7") + +TASK [Discover local Podman images] ******************************************** +ok: [localhost] => (item=centos7) + +TASK [Build an Ansible compatible image] *************************************** +skipping: [localhost] => (item=docker.io/pycontribs/centos:7) + +TASK [Determine the CMD directives] ******************************************** +ok: [localhost] => (item="centos7 command: None specified") + +TASK [Remove possible pre-existing containers] ********************************* +changed: [localhost] + +TASK [Discover local podman networks] ****************************************** +skipping: [localhost] => (item=centos7: None specified) + +TASK [Create podman network dedicated to this scenario] ************************ +skipping: [localhost] + +TASK [Create molecule instance(s)] ********************************************* +changed: [localhost] => (item=centos7) + +TASK [Wait for instance(s) creation to complete] ******************************* +failed: [localhost] (item=centos7) => {"ansible_job_id": "864829238242.3454", "ansible_loop_var": "item", "attempts": 1, "changed": true, "cmd": ["/usr/bin/podman", "run", "-d", "--name", "centos7", "--hostname=centos7", "docker.io/pycontribs/centos:7", "bash", "-c", "while true; do sleep 10000; done"], "delta": "0:00:00.047901", "end": "2022-09-11 11:34:41.767148", "finished": 1, "item": {"ansible_job_id": "864829238242.3454", "ansible_loop_var": "item", "changed": true, "failed": false, "finished": 0, "item": {"image": "docker.io/pycontribs/centos:7", "name": "centos7", "pre_build_image": true}, "results_file": "/root/.ansible_async/864829238242.3454", "started": 1}, "msg": "non-zero return code", "rc": 125, "start": "2022-09-11 11:34:41.719247", "stderr": "Error: invalid config provided: cannot set hostname when running in the host UTS namespace: invalid configuration", "stderr_lines": ["Error: invalid config provided: cannot set hostname when running in the host UTS namespace: invalid configuration"], "stdout": "", "stdout_lines": []} + +PLAY RECAP ********************************************************************* +localhost : ok=7 changed=2 unreachable=0 failed=1 skipped=5 rescued=0 ignored=0 + +CRITICAL Ansible return code was 2, command was: ['ansible-playbook', '--inventory', '/root/.cache/molecule/vector-role/podman/inventory', '--skip-tags', 'molecule-notest,notest', '/opt/vector-role/.tox/py37-ansible210/lib/python3.7/site-packages/molecule_podman/playbooks/create.yml'] +WARNING An error occurred during the test sequence action: 'create'. Cleaning up. +INFO Running podman > cleanup +WARNING Skipping, cleanup playbook not configured. +INFO Running podman > destroy + +PLAY [Destroy] ***************************************************************** + +TASK [Destroy molecule instance(s)] ******************************************** +changed: [localhost] => (item={'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}) + +TASK [Wait for instance(s) deletion to complete] ******************************* +changed: [localhost] => (item={'started': 1, 'finished': 0, 'ansible_job_id': '824208785878.3511', 'results_file': '/root/.ansible_async/824208785878.3511', 'changed': True, 'failed': False, 'item': {'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}, 'ansible_loop_var': 'item'}) + +PLAY RECAP ********************************************************************* +localhost : ok=2 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +INFO Pruning extra files from scenario ephemeral directory +ERROR: InvocationError for command /opt/vector-role/.tox/py37-ansible210/bin/molecule test -s podman --destroy always (exited with code 1) +py37-ansible30 installed: ansible==3.0.0,ansible-base==2.10.17,ansible-compat==1.0.0,ansible-lint==5.1.3,arrow==1.2.3,bcrypt==4.0.0,binaryornot==0.4.4,bracex==2.3.post1,cached-property==1.5.2,Cerberus==1.3.2,certifi==2022.6.15.1,cffi==1.15.1,chardet==5.0.0,charset-normalizer==2.1.1,click==8.1.3,click-help-colors==0.9.1,commonmark==0.9.1,cookiecutter==2.1.1,cryptography==38.0.1,distro==1.7.0,enrich==1.2.7,idna==3.3,importlib-metadata==4.12.0,Jinja2==3.1.2,jinja2-time==0.2.0,jmespath==1.0.1,lxml==4.9.1,MarkupSafe==2.1.1,molecule==3.4.0,molecule-podman==1.0.1,packaging==21.3,paramiko==2.11.0,pathspec==0.10.1,pluggy==0.13.1,pycparser==2.21,Pygments==2.13.0,PyNaCl==1.5.0,pyparsing==3.0.9,python-dateutil==2.8.2,python-slugify==6.1.2,PyYAML==5.4.1,requests==2.28.1,rich==12.5.1,ruamel.yaml==0.17.21,ruamel.yaml.clib==0.2.6,selinux==0.2.1,six==1.16.0,subprocess-tee==0.3.5,tenacity==8.0.1,text-unidecode==1.3,typing_extensions==4.3.0,urllib3==1.26.12,wcmatch==8.4,yamllint==1.26.3,zipp==3.8.1 +py37-ansible30 run-test-pre: PYTHONHASHSEED='2945318393' +py37-ansible30 run-test: commands[0] | molecule test -s podman --destroy always +INFO podman scenario test matrix: dependency, lint, cleanup, destroy, syntax, create, prepare, converge, idempotence, side_effect, verify, cleanup, destroy +INFO Performing prerun... +WARNING Failed to locate command: [Errno 2] No such file or directory: 'git': 'git' +INFO Guessed /opt/vector-role as project root directory +INFO Using /root/.cache/ansible-lint/b984a4/roles/artem_shtepa.vector_role symlink to current repository in order to enable Ansible to find the role using its expected full name. +INFO Added ANSIBLE_ROLES_PATH=~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles:/root/.cache/ansible-lint/b984a4/roles +INFO Running podman > dependency +WARNING Skipping, missing the requirements file. +WARNING Skipping, missing the requirements file. +INFO Running podman > lint +INFO Lint is disabled. +INFO Running podman > cleanup +WARNING Skipping, cleanup playbook not configured. +INFO Running podman > destroy +INFO Sanity checks: 'podman' + +PLAY [Destroy] ***************************************************************** + +TASK [Destroy molecule instance(s)] ******************************************** +changed: [localhost] => (item={'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}) + +TASK [Wait for instance(s) deletion to complete] ******************************* +changed: [localhost] => (item={'started': 1, 'finished': 0, 'ansible_job_id': '266779808633.3605', 'results_file': '/root/.ansible_async/266779808633.3605', 'changed': True, 'failed': False, 'item': {'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}, 'ansible_loop_var': 'item'}) + +PLAY RECAP ********************************************************************* +localhost : ok=2 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +INFO Running podman > syntax + +playbook: /opt/vector-role/molecule/resources/converge.yml +INFO Running podman > create + +PLAY [Create] ****************************************************************** + +TASK [get podman executable path] ********************************************** +ok: [localhost] + +TASK [save path to executable as fact] ***************************************** +ok: [localhost] + +TASK [Log into a container registry] ******************************************* +skipping: [localhost] => (item="centos7 registry username: None specified") + +TASK [Check presence of custom Dockerfiles] ************************************ +ok: [localhost] => (item=Dockerfile: None specified) + +TASK [Create Dockerfiles from image names] ************************************* +skipping: [localhost] => (item="Dockerfile: None specified; Image: docker.io/pycontribs/centos:7") + +TASK [Discover local Podman images] ******************************************** +ok: [localhost] => (item=centos7) + +TASK [Build an Ansible compatible image] *************************************** +skipping: [localhost] => (item=docker.io/pycontribs/centos:7) + +TASK [Determine the CMD directives] ******************************************** +ok: [localhost] => (item="centos7 command: None specified") + +TASK [Remove possible pre-existing containers] ********************************* +changed: [localhost] +TASK [Discover local podman networks] ****************************************** +skipping: [localhost] => (item=centos7: None specified) -### Tox +TASK [Create podman network dedicated to this scenario] ************************ +skipping: [localhost] + +TASK [Create molecule instance(s)] ********************************************* +changed: [localhost] => (item=centos7) + +TASK [Wait for instance(s) creation to complete] ******************************* +failed: [localhost] (item=centos7) => {"ansible_job_id": "386413707022.3774", "ansible_loop_var": "item", "attempts": 1, "changed": true, "cmd": ["/usr/bin/podman", "run", "-d", "--name", "centos7", "--hostname=centos7", "docker.io/pycontribs/centos:7", "bash", "-c", "while true; do sleep 10000; done"], "delta": "0:00:00.043561", "end": "2022-09-11 11:34:55.340619", "finished": 1, "item": {"ansible_job_id": "386413707022.3774", "ansible_loop_var": "item", "changed": true, "failed": false, "finished": 0, "item": {"image": "docker.io/pycontribs/centos:7", "name": "centos7", "pre_build_image": true}, "results_file": "/root/.ansible_async/386413707022.3774", "started": 1}, "msg": "non-zero return code", "rc": 125, "start": "2022-09-11 11:34:55.297058", "stderr": "Error: invalid config provided: cannot set hostname when running in the host UTS namespace: invalid configuration", "stderr_lines": ["Error: invalid config provided: cannot set hostname when running in the host UTS namespace: invalid configuration"], "stdout": "", "stdout_lines": []} + +PLAY RECAP ********************************************************************* +localhost : ok=7 changed=2 unreachable=0 failed=1 skipped=5 rescued=0 ignored=0 + +CRITICAL Ansible return code was 2, command was: ['ansible-playbook', '--inventory', '/root/.cache/molecule/vector-role/podman/inventory', '--skip-tags', 'molecule-notest,notest', '/opt/vector-role/.tox/py37-ansible30/lib/python3.7/site-packages/molecule_podman/playbooks/create.yml'] +WARNING An error occurred during the test sequence action: 'create'. Cleaning up. +INFO Running podman > cleanup +WARNING Skipping, cleanup playbook not configured. +INFO Running podman > destroy + +PLAY [Destroy] ***************************************************************** + +TASK [Destroy molecule instance(s)] ******************************************** +changed: [localhost] => (item={'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}) + +TASK [Wait for instance(s) deletion to complete] ******************************* +changed: [localhost] => (item={'started': 1, 'finished': 0, 'ansible_job_id': '931728167635.3832', 'results_file': '/root/.ansible_async/931728167635.3832', 'changed': True, 'failed': False, 'item': {'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}, 'ansible_loop_var': 'item'}) + +PLAY RECAP ********************************************************************* +localhost : ok=2 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +INFO Pruning extra files from scenario ephemeral directory +ERROR: InvocationError for command /opt/vector-role/.tox/py37-ansible30/bin/molecule test -s podman --destroy always (exited with code 1) +py39-ansible210 installed: ansible==2.10.7,ansible-base==2.10.17,ansible-compat==2.2.0,ansible-lint==5.1.3,arrow==1.2.3,attrs==22.1.0,bcrypt==4.0.0,binaryornot==0.4.4,bracex==2.3.post1,Cerberus==1.3.2,certifi==2022.6.15.1,cffi==1.15.1,chardet==5.0.0,charset-normalizer==2.1.1,click==8.1.3,click-help-colors==0.9.1,commonmark==0.9.1,cookiecutter==2.1.1,cryptography==38.0.1,distro==1.7.0,enrich==1.2.7,idna==3.3,Jinja2==3.1.2,jinja2-time==0.2.0,jmespath==1.0.1,jsonschema==4.16.0,lxml==4.9.1,MarkupSafe==2.1.1,molecule==3.4.0,molecule-podman==1.0.1,packaging==21.3,paramiko==2.11.0,pathspec==0.10.1,pluggy==0.13.1,pycparser==2.21,Pygments==2.13.0,PyNaCl==1.5.0,pyparsing==3.0.9,pyrsistent==0.18.1,python-dateutil==2.8.2,python-slugify==6.1.2,PyYAML==5.4.1,requests==2.28.1,rich==12.5.1,ruamel.yaml==0.17.21,ruamel.yaml.clib==0.2.6,selinux==0.2.1,six==1.16.0,subprocess-tee==0.3.5,tenacity==8.0.1,text-unidecode==1.3,urllib3==1.26.12,wcmatch==8.4,yamllint==1.26.3 +py39-ansible210 run-test-pre: PYTHONHASHSEED='2945318393' +py39-ansible210 run-test: commands[0] | molecule test -s podman --destroy always +INFO podman scenario test matrix: dependency, lint, cleanup, destroy, syntax, create, prepare, converge, idempotence, side_effect, verify, cleanup, destroy +INFO Performing prerun... +WARNING Failed to locate command: [Errno 2] No such file or directory: 'git' +INFO Guessed /opt/vector-role as project root directory +INFO Using /root/.cache/ansible-lint/b984a4/roles/artem_shtepa.vector_role symlink to current repository in order to enable Ansible to find the role using its expected full name. +INFO Added ANSIBLE_ROLES_PATH=~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles:/root/.cache/ansible-lint/b984a4/roles +INFO Running podman > dependency +WARNING Skipping, missing the requirements file. +WARNING Skipping, missing the requirements file. +INFO Running podman > lint +INFO Lint is disabled. +INFO Running podman > cleanup +WARNING Skipping, cleanup playbook not configured. +INFO Running podman > destroy +INFO Sanity checks: 'podman' + +PLAY [Destroy] ***************************************************************** + +TASK [Destroy molecule instance(s)] ******************************************** +changed: [localhost] => (item={'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}) + +TASK [Wait for instance(s) deletion to complete] ******************************* +changed: [localhost] => (item={'started': 1, 'finished': 0, 'ansible_job_id': '99216622436.3900', 'results_file': '/root/.ansible_async/99216622436.3900', 'changed': True, 'failed': False, 'item': {'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}, 'ansible_loop_var': 'item'}) + +PLAY RECAP ********************************************************************* +localhost : ok=2 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +INFO Running podman > syntax + +playbook: /opt/vector-role/molecule/resources/converge.yml +INFO Running podman > create + +PLAY [Create] ****************************************************************** + +TASK [get podman executable path] ********************************************** +ok: [localhost] + +TASK [save path to executable as fact] ***************************************** +ok: [localhost] + +TASK [Log into a container registry] ******************************************* +skipping: [localhost] => (item="centos7 registry username: None specified") + +TASK [Check presence of custom Dockerfiles] ************************************ +ok: [localhost] => (item=Dockerfile: None specified) + +TASK [Create Dockerfiles from image names] ************************************* +skipping: [localhost] => (item="Dockerfile: None specified; Image: docker.io/pycontribs/centos:7") + +TASK [Discover local Podman images] ******************************************** +ok: [localhost] => (item=centos7) + +TASK [Build an Ansible compatible image] *************************************** +skipping: [localhost] => (item=docker.io/pycontribs/centos:7) + +TASK [Determine the CMD directives] ******************************************** +ok: [localhost] => (item="centos7 command: None specified") + +TASK [Remove possible pre-existing containers] ********************************* +changed: [localhost] + +TASK [Discover local podman networks] ****************************************** +skipping: [localhost] => (item=centos7: None specified) + +TASK [Create podman network dedicated to this scenario] ************************ +skipping: [localhost] + +TASK [Create molecule instance(s)] ********************************************* +changed: [localhost] => (item=centos7) + +TASK [Wait for instance(s) creation to complete] ******************************* +failed: [localhost] (item=centos7) => {"ansible_job_id": "453345608163.4051", "ansible_loop_var": "item", "attempts": 1, "changed": true, "cmd": ["/usr/bin/podman", "run", "-d", "--name", "centos7", "--hostname=centos7", "docker.io/pycontribs/centos:7", "bash", "-c", "while true; do sleep 10000; done"], "delta": "0:00:00.044988", "end": "2022-09-11 11:35:08.693879", "finished": 1, "item": {"ansible_job_id": "453345608163.4051", "ansible_loop_var": "item", "changed": true, "failed": false, "finished": 0, "item": {"image": "docker.io/pycontribs/centos:7", "name": "centos7", "pre_build_image": true}, "results_file": "/root/.ansible_async/453345608163.4051", "started": 1}, "msg": "non-zero return code", "rc": 125, "start": "2022-09-11 11:35:08.648891", "stderr": "Error: invalid config provided: cannot set hostname when running in the host UTS namespace: invalid configuration", "stderr_lines": ["Error: invalid config provided: cannot set hostname when running in the host UTS namespace: invalid configuration"], "stdout": "", "stdout_lines": []} + +PLAY RECAP ********************************************************************* +localhost : ok=7 changed=2 unreachable=0 failed=1 skipped=5 rescued=0 ignored=0 + +CRITICAL Ansible return code was 2, command was: ['ansible-playbook', '--inventory', '/root/.cache/molecule/vector-role/podman/inventory', '--skip-tags', 'molecule-notest,notest', '/opt/vector-role/.tox/py39-ansible210/lib/python3.9/site-packages/molecule_podman/playbooks/create.yml'] +WARNING An error occurred during the test sequence action: 'create'. Cleaning up. +INFO Running podman > cleanup +WARNING Skipping, cleanup playbook not configured. +INFO Running podman > destroy + +PLAY [Destroy] ***************************************************************** + +TASK [Destroy molecule instance(s)] ******************************************** +changed: [localhost] => (item={'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}) + +TASK [Wait for instance(s) deletion to complete] ******************************* +changed: [localhost] => (item={'started': 1, 'finished': 0, 'ansible_job_id': '173151728599.4100', 'results_file': '/root/.ansible_async/173151728599.4100', 'changed': True, 'failed': False, 'item': {'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}, 'ansible_loop_var': 'item'}) -1. Добавьте в директорию с vector-role файлы из [директории](./example) -2. Запустите `docker run --privileged=True -v :/opt/vector-role -w /opt/vector-role -it aragast/netology:latest /bin/bash`, где path_to_repo - путь до корня репозитория с vector-role на вашей файловой системе. -3. Внутри контейнера выполните команду `tox`, посмотрите на вывод. -5. Создайте облегчённый сценарий для `molecule` с драйвером `molecule_podman`. Проверьте его на исполнимость. -6. Пропишите правильную команду в `tox.ini` для того чтобы запускался облегчённый сценарий. -8. Запустите команду `tox`. Убедитесь, что всё отработало успешно. -9. Добавьте новый тег на коммит с рабочим сценарием в соответствии с семантическим версионированием. +PLAY RECAP ********************************************************************* +localhost : ok=2 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +INFO Pruning extra files from scenario ephemeral directory +ERROR: InvocationError for command /opt/vector-role/.tox/py39-ansible210/bin/molecule test -s podman --destroy always (exited with code 1) +py39-ansible30 installed: ansible==3.0.0,ansible-base==2.10.17,ansible-compat==2.2.0,ansible-lint==5.1.3,arrow==1.2.3,attrs==22.1.0,bcrypt==4.0.0,binaryornot==0.4.4,bracex==2.3.post1,Cerberus==1.3.2,certifi==2022.6.15.1,cffi==1.15.1,chardet==5.0.0,charset-normalizer==2.1.1,click==8.1.3,click-help-colors==0.9.1,commonmark==0.9.1,cookiecutter==2.1.1,cryptography==38.0.1,distro==1.7.0,enrich==1.2.7,idna==3.3,Jinja2==3.1.2,jinja2-time==0.2.0,jmespath==1.0.1,jsonschema==4.16.0,lxml==4.9.1,MarkupSafe==2.1.1,molecule==3.4.0,molecule-podman==1.0.1,packaging==21.3,paramiko==2.11.0,pathspec==0.10.1,pluggy==0.13.1,pycparser==2.21,Pygments==2.13.0,PyNaCl==1.5.0,pyparsing==3.0.9,pyrsistent==0.18.1,python-dateutil==2.8.2,python-slugify==6.1.2,PyYAML==5.4.1,requests==2.28.1,rich==12.5.1,ruamel.yaml==0.17.21,ruamel.yaml.clib==0.2.6,selinux==0.2.1,six==1.16.0,subprocess-tee==0.3.5,tenacity==8.0.1,text-unidecode==1.3,urllib3==1.26.12,wcmatch==8.4,yamllint==1.26.3 +py39-ansible30 run-test-pre: PYTHONHASHSEED='2945318393' +py39-ansible30 run-test: commands[0] | molecule test -s podman --destroy always +INFO podman scenario test matrix: dependency, lint, cleanup, destroy, syntax, create, prepare, converge, idempotence, side_effect, verify, cleanup, destroy +INFO Performing prerun... +WARNING Failed to locate command: [Errno 2] No such file or directory: 'git' +INFO Guessed /opt/vector-role as project root directory +INFO Using /root/.cache/ansible-lint/b984a4/roles/artem_shtepa.vector_role symlink to current repository in order to enable Ansible to find the role using its expected full name. +INFO Added ANSIBLE_ROLES_PATH=~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles:/root/.cache/ansible-lint/b984a4/roles +INFO Running podman > dependency +WARNING Skipping, missing the requirements file. +WARNING Skipping, missing the requirements file. +INFO Running podman > lint +INFO Lint is disabled. +INFO Running podman > cleanup +WARNING Skipping, cleanup playbook not configured. +INFO Running podman > destroy +INFO Sanity checks: 'podman' + +PLAY [Destroy] ***************************************************************** + +TASK [Destroy molecule instance(s)] ******************************************** +changed: [localhost] => (item={'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}) + +TASK [Wait for instance(s) deletion to complete] ******************************* +changed: [localhost] => (item={'started': 1, 'finished': 0, 'ansible_job_id': '331091900457.4161', 'results_file': '/root/.ansible_async/331091900457.4161', 'changed': True, 'failed': False, 'item': {'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}, 'ansible_loop_var': 'item'}) + +PLAY RECAP ********************************************************************* +localhost : ok=2 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +INFO Running podman > syntax + +playbook: /opt/vector-role/molecule/resources/converge.yml +INFO Running podman > create + +PLAY [Create] ****************************************************************** + +TASK [get podman executable path] ********************************************** +ok: [localhost] + +TASK [save path to executable as fact] ***************************************** +ok: [localhost] + +TASK [Log into a container registry] ******************************************* +skipping: [localhost] => (item="centos7 registry username: None specified") + +TASK [Check presence of custom Dockerfiles] ************************************ +ok: [localhost] => (item=Dockerfile: None specified) + +TASK [Create Dockerfiles from image names] ************************************* +skipping: [localhost] => (item="Dockerfile: None specified; Image: docker.io/pycontribs/centos:7") + +TASK [Discover local Podman images] ******************************************** +ok: [localhost] => (item=centos7) + +TASK [Build an Ansible compatible image] *************************************** +skipping: [localhost] => (item=docker.io/pycontribs/centos:7) + +TASK [Determine the CMD directives] ******************************************** +ok: [localhost] => (item="centos7 command: None specified") + +TASK [Remove possible pre-existing containers] ********************************* +changed: [localhost] + +TASK [Discover local podman networks] ****************************************** +skipping: [localhost] => (item=centos7: None specified) + +TASK [Create podman network dedicated to this scenario] ************************ +skipping: [localhost] + +TASK [Create molecule instance(s)] ********************************************* +changed: [localhost] => (item=centos7) + +TASK [Wait for instance(s) creation to complete] ******************************* +failed: [localhost] (item=centos7) => {"ansible_job_id": "655377812848.4313", "ansible_loop_var": "item", "attempts": 1, "changed": true, "cmd": ["/usr/bin/podman", "run", "-d", "--name", "centos7", "--hostname=centos7", "docker.io/pycontribs/centos:7", "bash", "-c", "while true; do sleep 10000; done"], "delta": "0:00:00.062807", "end": "2022-09-11 11:35:22.013978", "finished": 1, "item": {"ansible_job_id": "655377812848.4313", "ansible_loop_var": "item", "changed": true, "failed": false, "finished": 0, "item": {"image": "docker.io/pycontribs/centos:7", "name": "centos7", "pre_build_image": true}, "results_file": "/root/.ansible_async/655377812848.4313", "started": 1}, "msg": "non-zero return code", "rc": 125, "start": "2022-09-11 11:35:21.951171", "stderr": "Error: invalid config provided: cannot set hostname when running in the host UTS namespace: invalid configuration", "stderr_lines": ["Error: invalid config provided: cannot set hostname when running in the host UTS namespace: invalid configuration"], "stdout": "", "stdout_lines": []} + +PLAY RECAP ********************************************************************* +localhost : ok=7 changed=2 unreachable=0 failed=1 skipped=5 rescued=0 ignored=0 + +CRITICAL Ansible return code was 2, command was: ['ansible-playbook', '--inventory', '/root/.cache/molecule/vector-role/podman/inventory', '--skip-tags', 'molecule-notest,notest', '/opt/vector-role/.tox/py39-ansible30/lib/python3.9/site-packages/molecule_podman/playbooks/create.yml'] +WARNING An error occurred during the test sequence action: 'create'. Cleaning up. +INFO Running podman > cleanup +WARNING Skipping, cleanup playbook not configured. +INFO Running podman > destroy + +PLAY [Destroy] ***************************************************************** + +TASK [Destroy molecule instance(s)] ******************************************** +changed: [localhost] => (item={'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}) + +TASK [Wait for instance(s) deletion to complete] ******************************* +changed: [localhost] => (item={'started': 1, 'finished': 0, 'ansible_job_id': '954966452117.4363', 'results_file': '/root/.ansible_async/954966452117.4363', 'changed': True, 'failed': False, 'item': {'image': 'docker.io/pycontribs/centos:7', 'name': 'centos7', 'pre_build_image': True}, 'ansible_loop_var': 'item'}) + +PLAY RECAP ********************************************************************* +localhost : ok=2 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +INFO Pruning extra files from scenario ephemeral directory +ERROR: InvocationError for command /opt/vector-role/.tox/py39-ansible30/bin/molecule test -s podman --destroy always (exited with code 1) +_______________________________________________________ summary ________________________________________________________ +ERROR: py37-ansible210: commands failed +ERROR: py37-ansible30: commands failed +ERROR: py39-ansible210: commands failed +ERROR: py39-ansible30: commands failed +[root@a906a0f6163d vector-role]# +``` +
+ +Провалв прогоне роли **Tox** по причине - при выполнении драйвером **molecule_podman** команды `/usr/bin/podman run -d --name centos7 --hostname=centos7 docker.io/pycontribs/centos:7 bash -c "while true; do sleep 10000; done"` +**podman** не удалось создать контейнер ( `Error: invalid config provided: cannot set hostname when running in the host UTS namespace: invalid configuration`), так как неверно задана конфигурация контейнера (нельзя указывать `--hostname`). + +> :exclamation: Решение данной проблемы я не вижу, ибо при модификации кода модуля **molecule_podman** с целью удаления этого параметра в данном случе не достаточно - возникают другие ошибки. НО! Если модифицировать `tox.ini` следующим образом: + +```ini +[tox] +minversion = 1.8 +basepython = python3.6 +envlist = py{37,39}-ansible{210,30} +skipsdist = true +[testenv] +passenv = * +deps = + -r tox-requirements.txt + ansible210: ansible<3.0 + ansible30: ansible<3.1 +commands = + {posargs:ansible --version} + {posargs:python3 --version} + {posargs:python3 test.py} +``` + +а файл `test.py` наполнить следующим содержимым: + +```python +#!/usr/bin/env python3 +print("OK\n") +``` + +то успешное выполнение **Tox** будет выглядеть следующим образом: + +```console +[root@cd1242c242a5 vector-role]# tox +py37-ansible210 installed: ansible==2.10.7,ansible-base==2.10.17,ansible-compat==1.0.0,ansible-lint==5.1.3,arrow==1.2.3,bcrypt==4.0.0,binaryornot==0.4.4,bracex==2.3.post1,cached-property==1.5.2,Cerberus==1.3.2,certifi==2022.6.15.1,cffi==1.15.1,chardet==5.0.0,charset-normalizer==2.1.1,click==8.1.3,click-help-colors==0.9.1,commonmark==0.9.1,cookiecutter==2.1.1,cryptography==38.0.1,distro==1.7.0,enrich==1.2.7,idna==3.3,importlib-metadata==4.12.0,Jinja2==3.1.2,jinja2-time==0.2.0,jmespath==1.0.1,lxml==4.9.1,MarkupSafe==2.1.1,molecule==3.4.0,molecule-podman==1.0.1,packaging==21.3,paramiko==2.11.0,pathspec==0.10.1,pluggy==0.13.1,pycparser==2.21,Pygments==2.13.0,PyNaCl==1.5.0,pyparsing==3.0.9,python-dateutil==2.8.2,python-slugify==6.1.2,PyYAML==5.4.1,requests==2.28.1,rich==12.5.1,ruamel.yaml==0.17.21,ruamel.yaml.clib==0.2.6,selinux==0.2.1,six==1.16.0,subprocess-tee==0.3.5,tenacity==8.0.1,text-unidecode==1.3,typing_extensions==4.3.0,urllib3==1.26.12,wcmatch==8.4,yamllint==1.26.3,zipp==3.8.1 +py37-ansible210 run-test-pre: PYTHONHASHSEED='1020171791' +py37-ansible210 run-test: commands[0] | ansible --version +ansible 2.10.17 + config file = None + configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] + ansible python module location = /opt/vector-role/.tox/py37-ansible210/lib/python3.7/site-packages/ansible + executable location = /opt/vector-role/.tox/py37-ansible210/bin/ansible + python version = 3.7.10 (default, Jun 13 2022, 19:37:24) [GCC 8.5.0 20210514 (Red Hat 8.5.0-10)] +py37-ansible210 run-test: commands[1] | python3 --version +Python 3.7.10 +py37-ansible210 run-test: commands[2] | python3 test.py +OK + +py37-ansible30 installed: ansible==3.0.0,ansible-base==2.10.17,ansible-compat==1.0.0,ansible-lint==5.1.3,arrow==1.2.3,bcrypt==4.0.0,binaryornot==0.4.4,bracex==2.3.post1,cached-property==1.5.2,Cerberus==1.3.2,certifi==2022.6.15.1,cffi==1.15.1,chardet==5.0.0,charset-normalizer==2.1.1,click==8.1.3,click-help-colors==0.9.1,commonmark==0.9.1,cookiecutter==2.1.1,cryptography==38.0.1,distro==1.7.0,enrich==1.2.7,idna==3.3,importlib-metadata==4.12.0,Jinja2==3.1.2,jinja2-time==0.2.0,jmespath==1.0.1,lxml==4.9.1,MarkupSafe==2.1.1,molecule==3.4.0,molecule-podman==1.0.1,packaging==21.3,paramiko==2.11.0,pathspec==0.10.1,pluggy==0.13.1,pycparser==2.21,Pygments==2.13.0,PyNaCl==1.5.0,pyparsing==3.0.9,python-dateutil==2.8.2,python-slugify==6.1.2,PyYAML==5.4.1,requests==2.28.1,rich==12.5.1,ruamel.yaml==0.17.21,ruamel.yaml.clib==0.2.6,selinux==0.2.1,six==1.16.0,subprocess-tee==0.3.5,tenacity==8.0.1,text-unidecode==1.3,typing_extensions==4.3.0,urllib3==1.26.12,wcmatch==8.4,yamllint==1.26.3,zipp==3.8.1 +py37-ansible30 run-test-pre: PYTHONHASHSEED='1020171791' +py37-ansible30 run-test: commands[0] | ansible --version +ansible 2.10.17 + config file = None + configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] + ansible python module location = /opt/vector-role/.tox/py37-ansible30/lib/python3.7/site-packages/ansible + executable location = /opt/vector-role/.tox/py37-ansible30/bin/ansible + python version = 3.7.10 (default, Jun 13 2022, 19:37:24) [GCC 8.5.0 20210514 (Red Hat 8.5.0-10)] +py37-ansible30 run-test: commands[1] | python3 --version +Python 3.7.10 +py37-ansible30 run-test: commands[2] | python3 test.py +OK + +py39-ansible210 installed: ansible==2.10.7,ansible-base==2.10.17,ansible-compat==2.2.0,ansible-lint==5.1.3,arrow==1.2.3,attrs==22.1.0,bcrypt==4.0.0,binaryornot==0.4.4,bracex==2.3.post1,Cerberus==1.3.2,certifi==2022.6.15.1,cffi==1.15.1,chardet==5.0.0,charset-normalizer==2.1.1,click==8.1.3,click-help-colors==0.9.1,commonmark==0.9.1,cookiecutter==2.1.1,cryptography==38.0.1,distro==1.7.0,enrich==1.2.7,idna==3.3,Jinja2==3.1.2,jinja2-time==0.2.0,jmespath==1.0.1,jsonschema==4.16.0,lxml==4.9.1,MarkupSafe==2.1.1,molecule==3.4.0,molecule-podman==1.0.1,packaging==21.3,paramiko==2.11.0,pathspec==0.10.1,pluggy==0.13.1,pycparser==2.21,Pygments==2.13.0,PyNaCl==1.5.0,pyparsing==3.0.9,pyrsistent==0.18.1,python-dateutil==2.8.2,python-slugify==6.1.2,PyYAML==5.4.1,requests==2.28.1,rich==12.5.1,ruamel.yaml==0.17.21,ruamel.yaml.clib==0.2.6,selinux==0.2.1,six==1.16.0,subprocess-tee==0.3.5,tenacity==8.0.1,text-unidecode==1.3,urllib3==1.26.12,wcmatch==8.4,yamllint==1.26.3 +py39-ansible210 run-test-pre: PYTHONHASHSEED='1020171791' +py39-ansible210 run-test: commands[0] | ansible --version +ansible 2.10.17 + config file = None + configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] + ansible python module location = /opt/vector-role/.tox/py39-ansible210/lib/python3.9/site-packages/ansible + executable location = /opt/vector-role/.tox/py39-ansible210/bin/ansible + python version = 3.9.2 (default, Jun 13 2022, 19:42:33) [GCC 8.5.0 20210514 (Red Hat 8.5.0-10)] +py39-ansible210 run-test: commands[1] | python3 --version +Python 3.9.2 +py39-ansible210 run-test: commands[2] | python3 test.py +OK + +py39-ansible30 installed: ansible==3.0.0,ansible-base==2.10.17,ansible-compat==2.2.0,ansible-lint==5.1.3,arrow==1.2.3,attrs==22.1.0,bcrypt==4.0.0,binaryornot==0.4.4,bracex==2.3.post1,Cerberus==1.3.2,certifi==2022.6.15.1,cffi==1.15.1,chardet==5.0.0,charset-normalizer==2.1.1,click==8.1.3,click-help-colors==0.9.1,commonmark==0.9.1,cookiecutter==2.1.1,cryptography==38.0.1,distro==1.7.0,enrich==1.2.7,idna==3.3,Jinja2==3.1.2,jinja2-time==0.2.0,jmespath==1.0.1,jsonschema==4.16.0,lxml==4.9.1,MarkupSafe==2.1.1,molecule==3.4.0,molecule-podman==1.0.1,packaging==21.3,paramiko==2.11.0,pathspec==0.10.1,pluggy==0.13.1,pycparser==2.21,Pygments==2.13.0,PyNaCl==1.5.0,pyparsing==3.0.9,pyrsistent==0.18.1,python-dateutil==2.8.2,python-slugify==6.1.2,PyYAML==5.4.1,requests==2.28.1,rich==12.5.1,ruamel.yaml==0.17.21,ruamel.yaml.clib==0.2.6,selinux==0.2.1,six==1.16.0,subprocess-tee==0.3.5,tenacity==8.0.1,text-unidecode==1.3,urllib3==1.26.12,wcmatch==8.4,yamllint==1.26.3 +py39-ansible30 run-test-pre: PYTHONHASHSEED='1020171791' +py39-ansible30 run-test: commands[0] | ansible --version +ansible 2.10.17 + config file = None + configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] + ansible python module location = /opt/vector-role/.tox/py39-ansible30/lib/python3.9/site-packages/ansible + executable location = /opt/vector-role/.tox/py39-ansible30/bin/ansible + python version = 3.9.2 (default, Jun 13 2022, 19:42:33) [GCC 8.5.0 20210514 (Red Hat 8.5.0-10)] +py39-ansible30 run-test: commands[1] | python3 --version +Python 3.9.2 +py39-ansible30 run-test: commands[2] | python3 test.py +OK + +_______________________________________________________ summary ________________________________________________________ + py37-ansible210: commands succeeded + py37-ansible30: commands succeeded + py39-ansible210: commands succeeded + py39-ansible30: commands succeeded + congratulations :) +[root@cd1242c242a5 vector-role]# +``` +--- -После выполнения у вас должно получится два сценария molecule и один tox.ini файл в репозитории. Не забудьте указать в ответе теги решений Tox и Molecule заданий. В качестве решения пришлите ссылку на ваш репозиторий и скриншоты этапов выполнения задания. ## Необязательная часть @@ -2324,6 +3723,7 @@ root@ubuntu:~/ansible-clickhouse$ В качестве решения пришлите ссылки и скриншоты этапов выполнения задания. +Позже,может,быть --- ### Как оформить ДЗ? From 107174c4b95ba5f66b0ed7ed285d07ab2a37add3 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sun, 16 Apr 2023 20:22:26 +0400 Subject: [PATCH 069/146] Update README.md --- 08-ansible-05-testing/README.md | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/08-ansible-05-testing/README.md b/08-ansible-05-testing/README.md index 26673def7..5b3684128 100644 --- a/08-ansible-05-testing/README.md +++ b/08-ansible-05-testing/README.md @@ -2403,11 +2403,9 @@ verifier: - "'enabled' == ansible_facts.services[service_name].status" ``` > Переменная `service_name` должна содержать имя проверяемого сервиса -Но, к сожалению, а данной работе это не применить, так как модуль **service_facts** не может определить установленный через скрипт сервис **vector** - -
-:exclamation: Полный лог тестирования роли с использованием Molecule... Лог длинный :bangbang: +К сожалению модуль **service_facts** не может определить установленный через скрипт сервис **vector** +Лог тестирования роли с использованием Molecule: ```console root@ubuntu:~/vector-role$ molecule test INFO default scenario test matrix: dependency, lint, cleanup, destroy, syntax, create, prepare, converge, idempotence, side_effect, verify, cleanup, destroy @@ -3120,8 +3118,6 @@ services: После создания контейнера, на нём применена роль [Ansible-clickhouse](https://github.com/NamorNinayzuk/ansible-clickhouse). -Все необходимые файлы инфраструктуры [тут](clickhouse/) - --- ## Tox @@ -3611,7 +3607,6 @@ ERROR: py39-ansible210: commands failed ERROR: py39-ansible30: commands failed [root@a906a0f6163d vector-role]# ``` -
Провалв прогоне роли **Tox** по причине - при выполнении драйвером **molecule_podman** команды `/usr/bin/podman run -d --name centos7 --hostname=centos7 docker.io/pycontribs/centos:7 bash -c "while true; do sleep 10000; done"` **podman** не удалось создать контейнер ( `Error: invalid config provided: cannot set hostname when running in the host UTS namespace: invalid configuration`), так как неверно задана конфигурация контейнера (нельзя указывать `--hostname`). From b361284231f23be95bb15d7187c800c3de9f36d0 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sun, 16 Apr 2023 20:28:32 +0400 Subject: [PATCH 070/146] Update README.md --- 08-ansible-05-testing/README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/08-ansible-05-testing/README.md b/08-ansible-05-testing/README.md index 5b3684128..784cac162 100644 --- a/08-ansible-05-testing/README.md +++ b/08-ansible-05-testing/README.md @@ -1052,8 +1052,7 @@ root@ubuntu:~$ name: ansible-clickhouse ``` -
-:exclamation: Прогон теста molecule... Лог очень длинный :bangbang: +Тест molecule: ```console root@ubuntu:~/ansible-clickhouse$ molecule test -s centos_7 @@ -3203,8 +3202,7 @@ INFO Initialized scenario in /home/vector-role/molecule/podman successfully. root@ubuntu:~/vector-role$ ``` -
-:exclamation: Вывод работы Tox на сокращённом сценарии... Лог длинный :bangbang: +Вывод работы Tox: ```console [root@a906a0f6163d vector-role]# tox From 4e0635ccbbbb95e97cf3f0b1022770b31e10c774 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Tue, 25 Apr 2023 00:40:39 +0400 Subject: [PATCH 071/146] Update README.md --- 08-ansible-06-module/README.md | 575 +++++++++++++++++++++++---------- 1 file changed, 408 insertions(+), 167 deletions(-) diff --git a/08-ansible-06-module/README.md b/08-ansible-06-module/README.md index 8ea618277..cd7d509b3 100644 --- a/08-ansible-06-module/README.md +++ b/08-ansible-06-module/README.md @@ -1,175 +1,416 @@ -# Домашнее задание к занятию "6.Создание собственных модулей" +# Домашнее задание по лекции "8.6 Создание собственных Modules" ## Подготовка к выполнению -1. Создайте пустой публичных репозиторий в любом своём проекте: `my_own_collection` -2. Скачайте репозиторий ansible: `git clone https://github.com/ansible/ansible.git` по любому удобному вам пути -3. Зайдите в директорию ansible: `cd ansible` -4. Создайте виртуальное окружение: `python3 -m venv venv` -5. Активируйте виртуальное окружение: `. venv/bin/activate`. Дальнейшие действия производятся только в виртуальном окружении -6. Установите зависимости `pip install -r requirements.txt` -7. Запустить настройку окружения `. hacking/env-setup` -8. Если все шаги прошли успешно - выйти из виртуального окружения `deactivate` -9. Ваше окружение настроено, для того чтобы запустить его, нужно находиться в директории `ansible` и выполнить конструкцию `. venv/bin/activate && . hacking/env-setup` + +> 1. Создайте пустой публичных репозиторий в любом своём проекте: `my_own_collection` +> 2. Скачайте репозиторий ansible: `git clone https://github.com/ansible/ansible.git` по любому удобному вам пути +> 3. Зайдите в директорию ansible: `cd ansible` +> 4. Создайте виртуальное окружение: `python3 -m venv venv` +> 5. Активируйте виртуальное окружение: `. venv/bin/activate`. Дальнейшие действия производятся только в виртуальном окружении +> 6. Установите зависимости `pip install -r requirements.txt` +> 7. Запустить настройку окружения `. hacking/env-setup` +> 8. Если все шаги прошли успешно - выйти из виртуального окружения `deactivate` +> 9. Ваше окружение настроено, для того чтобы запустить его, нужно находиться в директории `ansible` и выполнить конструкцию `. venv/bin/activate && . hacking/env-setup` +```console +root@debian:~/my-ansible-6/ansible$ python3 -m venv venv +root@debian:~/my-ansible-6/ansible$ . venv/bin/activate +(venv) root@debian:~/my-ansible-6/ansible$ pip install -r requirements.txt +Collecting jinja2>=3.0.0 + Using cached Jinja2-3.1.2-py3-none-any.whl (133 kB) +Collecting PyYAML>=5.1 + Downloading PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (682 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 682.2/682.2 kB 3.5 MB/s eta 0:00:00 +Collecting cryptography + Using cached cryptography-37.0.4-cp36-abi3-manylinux_2_24_x86_64.whl (4.1 MB) +Collecting packaging + Using cached packaging-21.3-py3-none-any.whl (40 kB) +Collecting resolvelib<0.9.0,>=0.5.3 + Using cached resolvelib-0.8.1-py2.py3-none-any.whl (16 kB) +Collecting MarkupSafe>=2.0 + Using cached MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (25 kB) +Collecting cffi>=1.12 + Using cached cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (441 kB) +Collecting pyparsing!=3.0.5,>=2.0.2 + Using cached pyparsing-3.0.9-py3-none-any.whl (98 kB) +Collecting pycparser + Using cached pycparser-2.21-py2.py3-none-any.whl (118 kB) +Installing collected packages: resolvelib, PyYAML, pyparsing, pycparser, MarkupSafe, packaging, jinja2, cffi, cryptography +Successfully installed MarkupSafe-2.1.1 PyYAML-6.0 cffi-1.15.1 cryptography-37.0.4 jinja2-3.1.2 packaging-21.3 pycparser-2.21 pyparsing-3.0.9 resolvelib-0.8.1 +(venv) root@debian:~/my-ansible-6/ansible$ . hacking/env-setup +running egg_info +creating lib/ansible_core.egg-info +writing lib/ansible_core.egg-info/PKG-INFO +writing dependency_links to lib/ansible_core.egg-info/dependency_links.txt +writing entry points to lib/ansible_core.egg-info/entry_points.txt +writing requirements to lib/ansible_core.egg-info/requires.txt +writing top-level names to lib/ansible_core.egg-info/top_level.txt +writing manifest file 'lib/ansible_core.egg-info/SOURCES.txt' +reading manifest file 'lib/ansible_core.egg-info/SOURCES.txt' +reading manifest template 'MANIFEST.in' +warning: no files found matching 'SYMLINK_CACHE.json' +warning: no previously-included files found matching 'docs/docsite/rst_warnings' +warning: no previously-included files found matching 'docs/docsite/rst/conf.py' +warning: no previously-included files found matching 'docs/docsite/rst/index.rst' +warning: no previously-included files found matching 'docs/docsite/rst/dev_guide/index.rst' +warning: no previously-included files matching '*' found under directory 'docs/docsite/_build' +warning: no previously-included files matching '*.pyc' found under directory 'docs/docsite/_extensions' +warning: no previously-included files matching '*.pyo' found under directory 'docs/docsite/_extensions' +warning: no files found matching '*.ps1' under directory 'lib/ansible/modules/windows' +warning: no files found matching '*.yml' under directory 'lib/ansible/modules' +warning: no files found matching 'validate-modules' under directory 'test/lib/ansible_test/_util/controller/sanity/validate-modules' +adding license file 'COPYING' +writing manifest file 'lib/ansible_core.egg-info/SOURCES.txt' + +Setting up Ansible to run out of checkout... + +PATH=/home/my-ansible-6/ansible/bin:/home/my-ansible-6/ansible/venv/bin:/home/.local/bin:/usr/bin:/home/.local/bin:/home/yandex-cloud/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games +PYTHONPATH=/home/my-ansible-6/ansible/test/lib:/home/my-ansible-6/ansible/lib +MANPATH=/home/my-ansible-6/ansible/docs/man:/usr/share/man:/usr/local/man:/usr/local/share/man + +Remember, you may wish to specify your host file with -i + +Done! + +(venv) root@debian:~/my-ansible-6/ansible$ deactivate +root@debian:~/my-ansible-6/ansible$ +``` ## Основная часть -Наша цель - написать собственный module, который мы можем использовать в своей role, через playbook. Всё это должно быть собрано в виде collection и отправлено в наш репозиторий. - -1. В виртуальном окружении создать новый `my_own_module.py` файл -2. Наполнить его содержимым: -```python -#!/usr/bin/python - -# Copyright: (c) 2018, Terry Jones -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) -from __future__ import (absolute_import, division, print_function) -__metaclass__ = type - -DOCUMENTATION = r''' ---- -module: my_test - -short_description: This is my test module - -# If this is part of a collection, you need to use semantic versioning, -# i.e. the version is of the form "2.5.0" and not "2.4". -version_added: "1.0.0" - -description: This is my longer description explaining my test module. - -options: - name: - description: This is the message to send to the test module. - required: true - type: str - new: - description: - - Control to demo if the result of this module is changed or not. - - Parameter description can be a list as well. - required: false - type: bool -# Specify this value according to your collection -# in format of namespace.collection.doc_fragment_name -extends_documentation_fragment: - - my_namespace.my_collection.my_doc_fragment_name - -author: - - Your Name (@yourGitHubHandle) -''' - -EXAMPLES = r''' -# Pass in a message -- name: Test with a message - my_namespace.my_collection.my_test: - name: hello world - -# pass in a message and have changed true -- name: Test with a message and changed output - my_namespace.my_collection.my_test: - name: hello world - new: true - -# fail the module -- name: Test failure of the module - my_namespace.my_collection.my_test: - name: fail me -''' - -RETURN = r''' -# These are examples of possible return values, and in general should use other names for return values. -original_message: - description: The original name param that was passed in. - type: str - returned: always - sample: 'hello world' -message: - description: The output message that the test module generates. - type: str - returned: always - sample: 'goodbye' -''' - -from ansible.module_utils.basic import AnsibleModule - - -def run_module(): - # define available arguments/parameters a user can pass to the module - module_args = dict( - name=dict(type='str', required=True), - new=dict(type='bool', required=False, default=False) - ) - - # seed the result dict in the object - # we primarily care about changed and state - # changed is if this module effectively modified the target - # state will include any data that you want your module to pass back - # for consumption, for example, in a subsequent task - result = dict( - changed=False, - original_message='', - message='' - ) - - # the AnsibleModule object will be our abstraction working with Ansible - # this includes instantiation, a couple of common attr would be the - # args/params passed to the execution, as well as if the module - # supports check mode - module = AnsibleModule( - argument_spec=module_args, - supports_check_mode=True - ) - - # if the user is working with this module in only check mode we do not - # want to make any changes to the environment, just return the current - # state with no modifications - if module.check_mode: - module.exit_json(**result) - - # manipulate or modify the state as needed (this is going to be the - # part where your module will do what it needs to do) - result['original_message'] = module.params['name'] - result['message'] = 'goodbye' - - # use whatever logic you need to determine whether or not this module - # made any modifications to your target - if module.params['new']: - result['changed'] = True - - # during the execution of the module, if there is an exception or a - # conditional state that effectively causes a failure, run - # AnsibleModule.fail_json() to pass in the message and the result - if module.params['name'] == 'fail me': - module.fail_json(msg='You requested this to fail', **result) - - # in the event of a successful module execution, you will want to - # simple AnsibleModule.exit_json(), passing the key/value results - module.exit_json(**result) - - -def main(): - run_module() - - -if __name__ == '__main__': - main() -``` -Или возьмите данное наполнение из [статьи](https://docs.ansible.com/ansible/latest/dev_guide/developing_modules_general.html#creating-a-module). - -3. Заполните файл в соответствии с требованиями ansible так, чтобы он выполнял основную задачу: module должен создавать текстовый файл на удалённом хосте по пути, определённом в параметре `path`, с содержимым, определённым в параметре `content`. -4. Проверьте module на исполняемость локально. -5. Напишите single task playbook и используйте module в нём. -6. Проверьте через playbook на идемпотентность. -7. Выйдите из виртуального окружения. -8. Инициализируйте новую collection: `ansible-galaxy collection init my_own_namespace.yandex_cloud_elk` -9. В данную collection перенесите свой module в соответствующую директорию. -10. Single task playbook преобразуйте в single task role и перенесите в collection. У role должны быть default всех параметров module -11. Создайте playbook для использования этой role. -12. Заполните всю документацию по collection, выложите в свой репозиторий, поставьте тег `1.0.0` на этот коммит. -13. Создайте .tar.gz этой collection: `ansible-galaxy collection build` в корневой директории collection. -14. Создайте ещё одну директорию любого наименования, перенесите туда single task playbook и архив c collection. -15. Установите collection из локального архива: `ansible-galaxy collection install .tar.gz` -16. Запустите playbook, убедитесь, что он работает. -17. В ответ необходимо прислать ссылки на collection и tar.gz архив, а также скриншоты выполнения пунктов 4, 6, 15 и 16. +Наша цель - написать собственный module, который мы можем использовать в своей role, через playbook. +Всё это должно быть собрано в виде collection и отправлено в наш репозиторий. + +### 1. В виртуальном окружении создать новый `my_own_module.py` файл + +Встроенные модули **Ansible** находятся по пути `lib/ansible/modules`, там и будем создавать файл, только с именем `file_content.py` + +--- + +### 2. Наполнить его содержимым из [статьи](https://docs.ansible.com/ansible/latest/dev_guide/developing_modules_general.html#creating-a-module) + +--- + +### 3. Перепишите файл в соответствии с требованиями ansible так, чтобы он выполнял следующую задачу + +**Module** должен создавать текстовый файл на удалённом хосте по пути, определённом в параметре `path`, с содержимым, определённым в параметре `content`. + +Готовый файл в репозитории: [file_content.py](https://github.com/NamorNinayzuk/ansible-collection/blob/main/plugins/modules/file_content.py) + +--- + +### 4. Проверьте module на исполняемость локально. + +Для проверки модуля на исполняемость локально можно запустить его непостредственно в **Python** передав **JSON** файл с нужным содержимым + +Пример передаваемого **JSON** файла +```json +{ + "ANSIBLE_MODULE_ARGS": { + "path": "test23", + "content": "test line" + } +} +``` + +Команда запуска: `python -m <модуль> <файл>`, где `<модуль>` - путь к исполняемому модулю (`ansible.modules.file_content` для модуля `file_content` из каталога встроенных в **Ansible**), а `<файл>` - **JSON** файл с входными данными + +Первый запуск, когда файла нет: +```console +(venv) root@debian:~/my-ansible-6/ansible$ python -m ansible.modules.file_content payload.json + +{"changed": true, "path": "test23", "content": "test line", "status": "created", "uid": 1000, "gid": 1000, "owner": "sa", "group": "sa", "mode": "0644", "state": "file", "size": 9, "invocation": {"module_args": {"path": "test23", "content": "test line"}}} +(venv) root@debian:~/my-ansible-6/ansible$ +``` + +Результат: +```json +{ + "changed": true, + "path": "test23", + "content": "test line", + "status": "created", + "uid": 1000, + "gid": 1000, + "owner": "sa", + "group": "sa", + "mode": "0644", + "state": "file", + "size": 9, + "invocation": { + "module_args": { + "path": "test23", + "content": "test line" + } + } +} +``` + +Второй запуск, когда файл уже существует: +```console +(venv) root@debian:~/my-ansible-6/ansible$ python -m ansible.modules.file_content payload.json + +{"changed": false, "path": "test23", "content": "test line", "status": "resisted", "uid": 1000, "gid": 1000, "owner": "sa", "group": "sa", "mode": "0644", "state": "file", "size": 9, "invocation": {"module_args": {"path": "test23", "content": "test line"}}} +(venv) root@debian:~/my-ansible-6/ansible$ +``` + +Результат: +```json +{ + "changed": false, + "path": "test23", + "content": "test line", + "status": "resisted", + "uid": 1000, + "gid": 1000, + "owner": "sa", + "group": "sa", + "mode": "0644", + "state": "file", + "size": 9, + "invocation": { + "module_args": { + "path": "test23", + "content": "test line" + } + } +} +``` + +Третий запуск с изменённым параметром `content`: +```console +(venv) root@debian:~/my-ansible-6/ansible$ python -m ansible.modules.file_content payload.json + +{"changed": true, "path": "test23", "content": "test line +add", "status": "modified", "uid": 1000, "gid": 1000, "owner": "sa", "group": "sa", "mode": "0644", "state": "file", "size": 14, "invocation": {"module_args": {"path": "test23", "content": "test line +add"}}} +(venv) root@debian:~/my-ansible-6/ansible$ +``` + +Результат: +```json +{ + "changed": true, + "path": "test23", + "content": "test line +add", + "status": "modified", + "uid": 1000, + "gid": 1000, + "owner": "sa", + "group": "sa", + "mode": "0644", + "state": "file", + "size": 14, + "invocation": { + "module_args": { + "path": "test23", + "content": "test line +add" + } + } +} +``` + +**JSON** блок вывода дополняется следующими параметрами: **uid**, **gid**, **owner**, **group**, **mode**, **state**, **size**. Так происходит всегда, когда в модуле есть параметр с именем `path` или `dest`. Само добавление выполняется при завершении модуля (функция `exit_json`). + +Также в результат всегда добавляется блок **invocation** (если его нет) с параметрами вызова модуля. Добавление также выпоняется при завершении модуля. + +--- + +### 5. Напишите single task playbook и используйте module в нём. + +Пример подобного **playbook**: +```yaml +--- +- name: Test module + hosts: localhost + tasks: + - name: run on test23 + file_content: + path: 'test23' + content: 'write test' +... +``` + +Исполнение **playbook**: (файла **test23** нет) +```console +(venv) root@debian:~/my-ansible-6/ansible$ ansible-playbook site.yml +[WARNING]: You are running the development version of Ansible. You should only run Ansible from "devel" if you are +modifying the Ansible engine, or trying out features under development. This is a rapidly changing source of code and +can become unstable at any point. +[WARNING]: No inventory was parsed, only implicit localhost is available +[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match +'all' + +PLAY [Test module] ***************************************************************************************************** + +TASK [Gathering Facts] ************************************************************************************************* +ok: [localhost] + +TASK [run on test23 - write] ******************************************************************************************* +changed: [localhost] + +PLAY RECAP ************************************************************************************************************* +localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +(venv) root@debian:~/my-ansible-6/ansible$ +``` + +--- + +### 6. Проверьте через playbook на идемпотентность. + +Повторный запуск **playbook** (файл **test23** уже существует): +```console +(venv) root@debian:~/my-ansible-6/ansible$ ansible-playbook site.yml +[WARNING]: You are running the development version of Ansible. You should only run Ansible from "devel" if you are +modifying the Ansible engine, or trying out features under development. This is a rapidly changing source of code and +can become unstable at any point. +[WARNING]: No inventory was parsed, only implicit localhost is available +[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match +'all' + +PLAY [Test module] ***************************************************************************************************** + +TASK [Gathering Facts] ************************************************************************************************* +ok: [localhost] + +TASK [run on test23 - write] ******************************************************************************************* +ok: [localhost] + +PLAY RECAP ************************************************************************************************************* +localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +(venv) root@debian:~/my-ansible-6/ansible$ +``` + +--- + +### 7. Выйдите из виртуального окружения. + +Выход из окружения выполняется командой `deactivate` + +--- + +### 8. Инициализируйте новую collection my_own_namespace.yandex_cloud_elk + +Инициализация новой **collection** выполняется по шаблону `ansible-galaxy collection init <пространство>.<коллекция>`, где `<пространство>` - Пространство имён автора (название группы для всех **collection** автора), `<коллекция>` - название **collection** + +Создание своей **collection** (вместо `my_own_namespace.yandex_cloud_elk` используется `artem_shtepa.utils`): + +```console +root@debian:~/my-ansible-6$ ansible-galaxy collection init artem_shtepa.utils +[WARNING]: You are running the development version of Ansible. You should only run Ansible from "devel" if you are +modifying the Ansible engine, or trying out features under development. This is a rapidly changing source of code and +can become unstable at any point. +- Collection artem_shtepa.utils was created successfully +root@debian:~/my-ansible-6$ +``` + +--- + +### 9. В данную collection перенесите свой module в соответствующую директорию. + +**Module** в **Ansible** это частный случай **plugin**, а значит и размещать его нужно внутри каталога **plugins**. +В соответствии с подсказкой **Ansible** (`plugins\readme.md`) модули должны размещаться в каталоге `plugins\modules`. + +--- + +### 10. Single task playbook преобразуйте в single task role и перенесите в collection. У role должны быть default всех параметров module + +Ссылка на **single task role** в **collection**: [file_content](https://github.com/NamorNinayzuk/ansible-collection/tree/main/roles/file_content) + +--- + +### 11. Создайте playbook для использования этой role. + +Ссылка на **playbook** в репозитории: [test_file_content](https://github.com/NamorNinayzuk/ansible-collection/blob/main/playbooks/test_file_content.yml) + +--- + +### 12. Заполните всю документацию по collection, выложите в свой репозиторий, поставьте тег `1.0.0` на этот коммит. + +Ссылка на репозиторий версии **1.0.0**: [Ansible-Collection](https://github.com/NamorNinayzuk/ansible-collection/tree/1.0.0) + +--- + +### 13. Создайте архив .tar.gz этой collection в корневой директории collection. + +Архив **collection** создаётся командой `ansible-galaxy collection build` + +```console +root@debian:~/my-ansible-6/artem_shtepa/utils$ ansible-galaxy collection build +[WARNING]: You are running the development version of Ansible. You should only run Ansible from "devel" if you are +modifying the Ansible engine, or trying out features under development. This is a rapidly changing source of code and +can become unstable at any point. +Created collection for artem_shtepa.utils at /home/my-ansible-6/artem_shtepa/utils/artem_shtepa-utils-1.0.0.tar.gz +root@debian:~/my-ansible-6/artem_shtepa/utils$ +``` + +--- + +### 14. Создайте ещё одну директорию любого наименования, перенесите туда single task playbook и архив c collection. + +```console +root@debian:~/my-ansible-6/final_test$ ls +artem_shtepa-utils-1.0.0.tar.gz test_file_content.yml +root@debian:~/my-ansible-6/final_test$ +``` + +--- + +### 15. Установите collection из локального архива + +Установка **collection** из архива выполняется командой `ansible-galaxy collection install <архив.tar.gz>` - где `<архив.tar.gz>` - файл **.tar.gz** архива **collection**, созданный **Ansible**. +Если запрашиваемая версия уже установлена, но требуется её заменить нужно добавить ключ: `--force` + +```console +root@debian:~/my-ansible-6/final_test$ ansible-galaxy collection install artem_shtepa-utils-1.0.0.tar.gz +[WARNING]: You are running the development version of Ansible. You should only run Ansible from "devel" if you are +modifying the Ansible engine, or trying out features under development. This is a rapidly changing source of code and +can become unstable at any point. +Starting galaxy collection install process +Process install dependency map +Starting collection install process +Installing 'artem_shtepa.utils:1.0.0' to '/home/.ansible/collections/ansible_collections/artem_shtepa/utils' +artem_shtepa.utils:1.0.0 was installed successfully +root@debian:~/my-ansible-6/final_test$ +``` + +--- + +### 16. Запустите playbook, убедитесь, что он работает. + +```console +root@debian:~/my-ansible-6/final_test$ ansible-playbook test_file_content.yml +[WARNING]: You are running the development version of Ansible. You should only run Ansible from "devel" if you are +modifying the Ansible engine, or trying out features under development. This is a rapidly changing source of code and +can become unstable at any point. +[WARNING]: No inventory was parsed, only implicit localhost is available +[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match +'all' + +PLAY [Test file content role] ****************************************************************************************** + +TASK [Gathering Facts] ************************************************************************************************* +ok: [localhost] + +TASK [artem_shtepa.utils.file_content : Compute file] ****************************************************************** +changed: [localhost] + +PLAY RECAP ************************************************************************************************************* +localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +root@debian:~/my-ansible-6/final_test$ ls +artem_shtepa-utils-1.0.0.tar.gz test_file test_file_content.yml +root@debian:~/my-ansible-6/final_test$ cat test_file && echo '' +sequence_of_data +root@debian:~/my-ansible-6/final_test$ +``` + +--- + +### 17. В ответ необходимо прислать ссылку на репозиторий с collection + +Репозиторий **collection** [Ansible-Collection](https://github.com/NamorNinayzuk/ansible-collection) + +--- ## Необязательная часть From e75e00f57b234a987be4c95a6692a593a7612039 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Tue, 25 Apr 2023 00:55:22 +0400 Subject: [PATCH 072/146] Update README.md --- 08-ansible-06-module/README.md | 56 +++++++++++++++++----------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/08-ansible-06-module/README.md b/08-ansible-06-module/README.md index cd7d509b3..c0d73bff3 100644 --- a/08-ansible-06-module/README.md +++ b/08-ansible-06-module/README.md @@ -106,7 +106,7 @@ root@debian:~/my-ansible-6/ansible$ ```json { "ANSIBLE_MODULE_ARGS": { - "path": "test23", + "path": "test123", "content": "test line" } } @@ -118,7 +118,7 @@ root@debian:~/my-ansible-6/ansible$ ```console (venv) root@debian:~/my-ansible-6/ansible$ python -m ansible.modules.file_content payload.json -{"changed": true, "path": "test23", "content": "test line", "status": "created", "uid": 1000, "gid": 1000, "owner": "sa", "group": "sa", "mode": "0644", "state": "file", "size": 9, "invocation": {"module_args": {"path": "test23", "content": "test line"}}} +{"changed": true, "path": "test123", "content": "test line", "status": "created", "uid": 1000, "gid": 1000, "owner": "sa", "group": "sa", "mode": "0644", "state": "file", "size": 9, "invocation": {"module_args": {"path": "test123", "content": "test line"}}} (venv) root@debian:~/my-ansible-6/ansible$ ``` @@ -126,7 +126,7 @@ root@debian:~/my-ansible-6/ansible$ ```json { "changed": true, - "path": "test23", + "path": "test123", "content": "test line", "status": "created", "uid": 1000, @@ -138,7 +138,7 @@ root@debian:~/my-ansible-6/ansible$ "size": 9, "invocation": { "module_args": { - "path": "test23", + "path": "test123", "content": "test line" } } @@ -149,7 +149,7 @@ root@debian:~/my-ansible-6/ansible$ ```console (venv) root@debian:~/my-ansible-6/ansible$ python -m ansible.modules.file_content payload.json -{"changed": false, "path": "test23", "content": "test line", "status": "resisted", "uid": 1000, "gid": 1000, "owner": "sa", "group": "sa", "mode": "0644", "state": "file", "size": 9, "invocation": {"module_args": {"path": "test23", "content": "test line"}}} +{"changed": false, "path": "test123", "content": "test line", "status": "resisted", "uid": 1000, "gid": 1000, "owner": "sa", "group": "sa", "mode": "0644", "state": "file", "size": 9, "invocation": {"module_args": {"path": "test123", "content": "test line"}}} (venv) root@debian:~/my-ansible-6/ansible$ ``` @@ -157,7 +157,7 @@ root@debian:~/my-ansible-6/ansible$ ```json { "changed": false, - "path": "test23", + "path": "test123", "content": "test line", "status": "resisted", "uid": 1000, @@ -169,7 +169,7 @@ root@debian:~/my-ansible-6/ansible$ "size": 9, "invocation": { "module_args": { - "path": "test23", + "path": "test123", "content": "test line" } } @@ -180,7 +180,7 @@ root@debian:~/my-ansible-6/ansible$ ```console (venv) root@debian:~/my-ansible-6/ansible$ python -m ansible.modules.file_content payload.json -{"changed": true, "path": "test23", "content": "test line +add", "status": "modified", "uid": 1000, "gid": 1000, "owner": "sa", "group": "sa", "mode": "0644", "state": "file", "size": 14, "invocation": {"module_args": {"path": "test23", "content": "test line +add"}}} +{"changed": true, "path": "test123", "content": "test line +add", "status": "modified", "uid": 1000, "gid": 1000, "owner": "sa", "group": "sa", "mode": "0644", "state": "file", "size": 14, "invocation": {"module_args": {"path": "test123", "content": "test line +add"}}} (venv) root@debian:~/my-ansible-6/ansible$ ``` @@ -188,7 +188,7 @@ root@debian:~/my-ansible-6/ansible$ ```json { "changed": true, - "path": "test23", + "path": "test123", "content": "test line +add", "status": "modified", "uid": 1000, @@ -200,7 +200,7 @@ root@debian:~/my-ansible-6/ansible$ "size": 14, "invocation": { "module_args": { - "path": "test23", + "path": "test123", "content": "test line +add" } } @@ -221,14 +221,14 @@ root@debian:~/my-ansible-6/ansible$ - name: Test module hosts: localhost tasks: - - name: run on test23 + - name: run on test123 file_content: - path: 'test23' + path: 'test123' content: 'write test' ... ``` -Исполнение **playbook**: (файла **test23** нет) +Исполнение **playbook**: (файла **test123** нет) ```console (venv) root@debian:~/my-ansible-6/ansible$ ansible-playbook site.yml [WARNING]: You are running the development version of Ansible. You should only run Ansible from "devel" if you are @@ -243,7 +243,7 @@ PLAY [Test module] ************************************************************* TASK [Gathering Facts] ************************************************************************************************* ok: [localhost] -TASK [run on test23 - write] ******************************************************************************************* +TASK [run on test123 - write] ******************************************************************************************* changed: [localhost] PLAY RECAP ************************************************************************************************************* @@ -256,7 +256,7 @@ localhost : ok=2 changed=1 unreachable=0 failed=0 s ### 6. Проверьте через playbook на идемпотентность. -Повторный запуск **playbook** (файл **test23** уже существует): +Повторный запуск **playbook** (файл **test123** уже существует): ```console (venv) root@debian:~/my-ansible-6/ansible$ ansible-playbook site.yml [WARNING]: You are running the development version of Ansible. You should only run Ansible from "devel" if you are @@ -271,7 +271,7 @@ PLAY [Test module] ************************************************************* TASK [Gathering Facts] ************************************************************************************************* ok: [localhost] -TASK [run on test23 - write] ******************************************************************************************* +TASK [run on test123 - write] ******************************************************************************************* ok: [localhost] PLAY RECAP ************************************************************************************************************* @@ -292,14 +292,14 @@ localhost : ok=2 changed=0 unreachable=0 failed=0 s Инициализация новой **collection** выполняется по шаблону `ansible-galaxy collection init <пространство>.<коллекция>`, где `<пространство>` - Пространство имён автора (название группы для всех **collection** автора), `<коллекция>` - название **collection** -Создание своей **collection** (вместо `my_own_namespace.yandex_cloud_elk` используется `artem_shtepa.utils`): +Создание своей **collection** (вместо `my_own_namespace.yandex_cloud_elk` используется `test.utils`): ```console -root@debian:~/my-ansible-6$ ansible-galaxy collection init artem_shtepa.utils +root@debian:~/my-ansible-6$ ansible-galaxy collection init test.utils [WARNING]: You are running the development version of Ansible. You should only run Ansible from "devel" if you are modifying the Ansible engine, or trying out features under development. This is a rapidly changing source of code and can become unstable at any point. -- Collection artem_shtepa.utils was created successfully +- Collection test.utils was created successfully root@debian:~/my-ansible-6$ ``` @@ -335,12 +335,12 @@ root@debian:~/my-ansible-6$ Архив **collection** создаётся командой `ansible-galaxy collection build` ```console -root@debian:~/my-ansible-6/artem_shtepa/utils$ ansible-galaxy collection build +root@debian:~/my-ansible-6/utils$ ansible-galaxy collection build [WARNING]: You are running the development version of Ansible. You should only run Ansible from "devel" if you are modifying the Ansible engine, or trying out features under development. This is a rapidly changing source of code and can become unstable at any point. -Created collection for artem_shtepa.utils at /home/my-ansible-6/artem_shtepa/utils/artem_shtepa-utils-1.0.0.tar.gz -root@debian:~/my-ansible-6/artem_shtepa/utils$ +Created collection for test.utils at /home/my-ansible-6/utils/test-utils-1.0.0.tar.gz +root@debian:~/my-ansible-6/utils$ ``` --- @@ -349,7 +349,7 @@ root@debian:~/my-ansible-6/artem_shtepa/utils$ ```console root@debian:~/my-ansible-6/final_test$ ls -artem_shtepa-utils-1.0.0.tar.gz test_file_content.yml +test-utils-1.0.0.tar.gz test_file_content.yml root@debian:~/my-ansible-6/final_test$ ``` @@ -361,15 +361,15 @@ root@debian:~/my-ansible-6/final_test$ Если запрашиваемая версия уже установлена, но требуется её заменить нужно добавить ключ: `--force` ```console -root@debian:~/my-ansible-6/final_test$ ansible-galaxy collection install artem_shtepa-utils-1.0.0.tar.gz +root@debian:~/my-ansible-6/final_test$ ansible-galaxy collection install test-utils-1.0.0.tar.gz [WARNING]: You are running the development version of Ansible. You should only run Ansible from "devel" if you are modifying the Ansible engine, or trying out features under development. This is a rapidly changing source of code and can become unstable at any point. Starting galaxy collection install process Process install dependency map Starting collection install process -Installing 'artem_shtepa.utils:1.0.0' to '/home/.ansible/collections/ansible_collections/artem_shtepa/utils' -artem_shtepa.utils:1.0.0 was installed successfully +Installing 'test.utils:1.0.0' to '/home/.ansible/collections/ansible_collections/utils' +test.utils:1.0.0 was installed successfully root@debian:~/my-ansible-6/final_test$ ``` @@ -391,14 +391,14 @@ PLAY [Test file content role] ************************************************** TASK [Gathering Facts] ************************************************************************************************* ok: [localhost] -TASK [artem_shtepa.utils.file_content : Compute file] ****************************************************************** +TASK [test.utils.file_content : Compute file] ************************************************************************** changed: [localhost] PLAY RECAP ************************************************************************************************************* localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 root@debian:~/my-ansible-6/final_test$ ls -artem_shtepa-utils-1.0.0.tar.gz test_file test_file_content.yml +test-utils-1.0.0.tar.gz test_file test_file_content.yml root@debian:~/my-ansible-6/final_test$ cat test_file && echo '' sequence_of_data root@debian:~/my-ansible-6/final_test$ From 706ef95d05a31b4b27c8f0116dc9dfa8d6d3d72c Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Tue, 25 Apr 2023 01:09:37 +0400 Subject: [PATCH 073/146] Update README.md --- 08-ansible-06-module/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/08-ansible-06-module/README.md b/08-ansible-06-module/README.md index c0d73bff3..45740ad97 100644 --- a/08-ansible-06-module/README.md +++ b/08-ansible-06-module/README.md @@ -326,7 +326,7 @@ root@debian:~/my-ansible-6$ ### 12. Заполните всю документацию по collection, выложите в свой репозиторий, поставьте тег `1.0.0` на этот коммит. -Ссылка на репозиторий версии **1.0.0**: [Ansible-Collection](https://github.com/NamorNinayzuk/ansible-collection/tree/1.0.0) +Ссылка на репозиторий версии **1.0.0**: [Ansible-Collection](https://github.com/NamorNinayzuk/ansible-collection) --- From 58113286ffff6bf54fd62f2f8d5a4704067d6e25 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Thu, 18 May 2023 22:16:42 +0400 Subject: [PATCH 074/146] Update README.md --- 09-ci-01-intro/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/09-ci-01-intro/README.md b/09-ci-01-intro/README.md index 6751e9d77..187b35551 100644 --- a/09-ci-01-intro/README.md +++ b/09-ci-01-intro/README.md @@ -25,8 +25,17 @@ Создать задачу с типом bug, попытаться провести его по всему workflow до Done. Создать задачу с типом epic, к ней привязать несколько задач с типом task, провести их по всему workflow до Done. При проведении обеих задач по статусам использовать kanban. Вернуть задачи в статус Open. Перейти в scrum, запланировать новый спринт, состоящий из задач эпика и одного бага, стартовать спринт, провести задачи до состояния Closed. Закрыть спринт. +--- +[kanban](https://b24-gu7ntr.bitrix24.ru/workgroups/group/2/tasks/ "BtrX") +--- +--- +[scrum](https://b24-gu7ntr.bitrix24.ru/workgroups/group/4/tasks/?scrum=Y&tab=plan "BtrX") +--- + Если всё отработало в рамках ожидания - выгрузить схемы workflow для импорта в XML. Файлы с workflow приложить к решению задания. +--- +[Битрикс 24](https://b24-gu7ntr.bitrix24.ru/company/personal/user/1/tasks/ "нет XML на бесплатном тарифе") --- ### Как оформить ДЗ? From 9d0b8e64cbdf83e01bcb8348979a86d1074a3cad Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sun, 21 May 2023 23:40:08 +0400 Subject: [PATCH 075/146] Create main.tf --- 09-ci-03-cicd/infrastructure/main.tf | 80 ++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 09-ci-03-cicd/infrastructure/main.tf diff --git a/09-ci-03-cicd/infrastructure/main.tf b/09-ci-03-cicd/infrastructure/main.tf new file mode 100644 index 000000000..3ab177cd3 --- /dev/null +++ b/09-ci-03-cicd/infrastructure/main.tf @@ -0,0 +1,80 @@ +variable "YC_CLOUD_ID" { default = "" } +variable "YC_FOLDER_ID" { default = "" } +variable "YC_ZONE" { default = "" } + +terraform { + required_providers { + yandex = { + source = "yandex-cloud/yandex" + } + } + required_version = ">= 0.13" +} + +provider "yandex" { + service_account_key_file = "/home/sa/.ssh/yc-key.json" + cloud_id = var.YC_CLOUD_ID + folder_id = var.YC_FOLDER_ID + zone = var.YC_ZONE +} + +resource "yandex_compute_image" "centos-7" { + name = "centos-7" + source_family = "centos-7" +} + +resource "yandex_compute_instance" "vm" { + for_each = local.vm_nodes + + name = "${each.key}" + description = "Node for ${each.key}" + + platform_id = "standard-v1" + + resources { + cores = 2 + memory = 4 + core_fraction = 5 + } + + boot_disk { + initialize_params { + image_id = yandex_compute_image.centos-7.id + type = "network-hdd" + size = 10 + } + } + + network_interface { + subnet_id = "${yandex_vpc_subnet.my-subnet.id}" + nat = true + } + + metadata = { + ssh-keys = "centos:${file("~/.ssh/id_ed25519.pub")}" + } +} + +resource "yandex_vpc_network" "my-net" { + name = "vm-network" +} + +resource "yandex_vpc_subnet" "my-subnet" { + name = "cluster-subnet" + v4_cidr_blocks = ["10.2.0.0/16"] + zone = var.YC_ZONE + network_id = yandex_vpc_network.my-net.id + depends_on = [yandex_vpc_network.my-net] +} + +output "sonar_ip" { + value = yandex_compute_instance.vm["sonar"].network_interface.0.nat_ip_address +} + +output "nexus_ip" { + value = yandex_compute_instance.vm["nexus"].network_interface.0.nat_ip_address +} + +locals { + vm_nodes = toset(["sonar", "nexus"]) +} From 13a719766ff5316e6e0f4b9a36137e9aa1646a90 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Sun, 21 May 2023 23:51:50 +0400 Subject: [PATCH 076/146] Update site.yml ssh key --- 09-ci-03-cicd/infrastructure/site.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/09-ci-03-cicd/infrastructure/site.yml b/09-ci-03-cicd/infrastructure/site.yml index 49d31b3bb..16ec576ee 100644 --- a/09-ci-03-cicd/infrastructure/site.yml +++ b/09-ci-03-cicd/infrastructure/site.yml @@ -117,8 +117,9 @@ authorized_key: user: "{{ sonarqube_db_user }}" state: present - key: "{{ lookup('file', 'id_rsa.pub') }}" - + #key: "{{ lookup('file', 'id_rsa.pub') }}" + key: "{{ lookup('file', '~/.ssh/id_ed25519.pub') }}" + - name: "Allow group to have passwordless sudo" lineinfile: dest: /etc/sudoers From 3b0a4c7b0ed6593307a69343da6e3c0fff31ca5b Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Fri, 26 May 2023 18:33:18 +0400 Subject: [PATCH 077/146] Update README.md --- 09-ci-03-cicd/README.md | 419 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 379 insertions(+), 40 deletions(-) diff --git a/09-ci-03-cicd/README.md b/09-ci-03-cicd/README.md index 143ce30db..30ba601a1 100644 --- a/09-ci-03-cicd/README.md +++ b/09-ci-03-cicd/README.md @@ -1,65 +1,404 @@ -# Домашнее задание к занятию "9.Процессы CI/CD" +# Домашнее задание по лекции "9.3 Процессы CI\CD" ## Подготовка к выполнению -1. Создаём 2 VM в yandex cloud со следующими параметрами: 2CPU 4RAM Centos7(остальное по минимальным требованиям) -2. Прописываем в [inventory](./infrastructure/inventory/cicd/hosts.yml) [playbook'a](./infrastructure/site.yml) созданные хосты -3. Добавляем в [files](./infrastructure/files/) файл со своим публичным ключом (id_rsa.pub). Если ключ называется иначе - найдите таску в плейбуке, которая использует id_rsa.pub имя и исправьте на своё -4. Запускаем playbook, ожидаем успешного завершения -5. Проверяем готовность Sonarqube через [браузер](http://localhost:9000) -6. Заходим под admin\admin, меняем пароль на свой -7. Проверяем готовность Nexus через [бразуер](http://localhost:8081) -8. Подключаемся под admin\admin123, меняем пароль, сохраняем анонимный доступ +> 1. Создаём 2 VM в yandex cloud со следующими параметрами: 2CPU 4RAM Centos7(остальное по минимальным требованиям) +> 2. Прописываем в [inventory](./infrastructure/inventory/cicd/hosts.yml) [playbook'a](./infrastructure/site.yml) созданные хосты +> 3. Добавляем в [files](./infrastructure/files/) файл со своим публичным ключом (id_rsa.pub). Если ключ называется иначе - найдите таску в плейбуке, которая использует id_rsa.pub имя и исправьте на своё +> 4. Запускаем playbook, ожидаем успешного завершения +> 5. Проверяем готовность Sonarqube через [браузер](http://localhost:9000) +> 6. Заходим под admin\admin, меняем пароль на свой +> 7. Проверяем готовность Nexus через [бразуер](http://localhost:8081) +> 8. Подключаемся под admin\admin123, меняем пароль, сохраняем анонимный доступ + +Облачные машины созданы при помощи **terraform** со следующим [конфигурационным файлом](infrastructure/main.tf). + +Усечённый вывод **terraform**: + +```console +... +Changes to Outputs: + + nexus_ip = (known after apply) + + sonar_ip = (known after apply) +yandex_vpc_network.my-net: Creating... +yandex_compute_image.centos-7: Creating... +yandex_vpc_network.my-net: Creation complete after 1s [id=enpqhvvlh3fcaeiok3ve] +yandex_vpc_subnet.my-subnet: Creating... +yandex_vpc_subnet.my-subnet: Creation complete after 1s [id=e9bthsk1hvrcni3kn3k9] +yandex_compute_image.centos-7: Creation complete after 7s [id=fd80n8bdihrnuj2clid4] +yandex_compute_instance.vm["nexus"]: Creating... +yandex_compute_instance.vm["sonar"]: Creating... +yandex_compute_instance.vm["sonar"]: Still creating... [10s elapsed] +yandex_compute_instance.vm["nexus"]: Still creating... [10s elapsed] +yandex_compute_instance.vm["nexus"]: Still creating... [20s elapsed] +yandex_compute_instance.vm["sonar"]: Still creating... [20s elapsed] +yandex_compute_instance.vm["sonar"]: Still creating... [30s elapsed] +yandex_compute_instance.vm["nexus"]: Still creating... [30s elapsed] +yandex_compute_instance.vm["nexus"]: Still creating... [40s elapsed] +yandex_compute_instance.vm["sonar"]: Still creating... [40s elapsed] +yandex_compute_instance.vm["nexus"]: Creation complete after 42s [id=fhm2681f29hakbal2fbi] +yandex_compute_instance.vm["sonar"]: Creation complete after 42s [id=fhmu72j5klsu30sqj9mp] + +Apply complete! Resources: 5 added, 0 changed, 0 destroyed. + +Outputs: + +nexus_ip = "51.250.17.146" +sonar_ip = "51.250.3.1" +┌──(kali㉿kali)-[~/09-ci-03-cicd/infrastructure] +└─$ +``` + +Вместо копирования `id_rsa.pub` внесены изменения в соответствующую **task**: + +```yaml + - name: "Set up ssh key to access for managed node" + authorized_key: + user: "{{ sonarqube_db_user }}" + state: present + key: "{{ lookup('file', '~/.ssh/id_ed25519.pub') }}" +``` + +Проверка функционирования окружения (часть вывода **Ansible** пропущена): + +```console +... +PLAY RECAP ************************************************************************************************************* +nexus-01 : ok=17 changed=15 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 +sonar-01 : ok=35 changed=27 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +┌──(kali㉿kali)-[~/09-ci-03-cicd/infrastructure] +└─$ ping 51.250.3.1 -p 9000 +PATTERN: 0x9000 +PING 51.250.3.1 (51.250.3.1) 56(84) bytes of data. +64 bytes from 51.250.3.1: icmp_seq=1 ttl=50 time=17.3 ms +64 bytes from 51.250.3.1: icmp_seq=2 ttl=50 time=16.3 ms +64 bytes from 51.250.3.1: icmp_seq=3 ttl=50 time=16.4 ms +64 bytes from 51.250.3.1: icmp_seq=4 ttl=50 time=16.2 ms +64 bytes from 51.250.3.1: icmp_seq=5 ttl=50 time=16.1 ms +^C +--- 51.250.3.1 ping statistics --- +5 packets transmitted, 5 received, 0% packet loss, time 4043ms +rtt min/avg/max/mdev = 16.085/16.462/17.306/0.435 ms +┌──(kali㉿kali)-[~/09-ci-03-cicd/infrastructure] +└─$ ping 51.250.17.146 -p 8081 +PATTERN: 0x8081 +PING 51.250.17.146 (51.250.17.146) 56(84) bytes of data. +64 bytes from 51.250.17.146: icmp_seq=1 ttl=51 time=14.9 ms +64 bytes from 51.250.17.146: icmp_seq=2 ttl=51 time=14.8 ms +64 bytes from 51.250.17.146: icmp_seq=3 ttl=51 time=14.7 ms +64 bytes from 51.250.17.146: icmp_seq=4 ttl=51 time=14.3 ms +64 bytes from 51.250.17.146: icmp_seq=5 ttl=51 time=14.7 ms +^C +--- 51.250.17.146 ping statistics --- +5 packets transmitted, 5 received, 0% packet loss, time 4029ms +rtt min/avg/max/mdev = 14.334/14.684/14.915/0.191 ms +┌──(kali㉿kali)-[~/09-ci-03-cicd/infrastructure] +└─$ +``` ## Знакомоство с SonarQube ### Основная часть -1. Создаём новый проект, название произвольное -2. Скачиваем пакет sonar-scanner, который нам предлагает скачать сам sonarqube -3. Делаем так, чтобы binary был доступен через вызов в shell (или меняем переменную PATH или любой другой удобный вам способ) -4. Проверяем `sonar-scanner --version` -5. Запускаем анализатор против кода из директории [example](./example) с дополнительным ключом `-Dsonar.coverage.exclusions=fail.py` -6. Смотрим результат в интерфейсе -7. Исправляем ошибки, которые он выявил(включая warnings) -8. Запускаем анализатор повторно - проверяем, что QG пройдены успешно -9. Делаем скриншот успешного прохождения анализа, прикладываем к решению ДЗ +> 1. Создаём новый проект, название произвольное +> 2. Скачиваем пакет sonar-scanner, который нам предлагает скачать сам sonarqube +> 3. Делаем так, чтобы binary был доступен через вызов в shell (или меняем переменную PATH или любой другой удобный вам способ) +> 4. Проверяем `sonar-scanner --version` +> 5. Запускаем анализатор против кода из директории [example](./example) с дополнительным ключом `-Dsonar.coverage.exclusions=fail.py` +> 6. Смотрим результат в интерфейсе +> 7. Исправляем ошибки, которые он выявил(включая warnings) +> 8. Запускаем анализатор повторно - проверяем, что QG пройдены успешно +> 9. Делаем скриншот успешного прохождения анализа, прикладываем к решению ДЗ + +Проверка функционирования **sonar-scanner**: + +```console +┌──(kali㉿kali)-[~/09-ci-03-cicd] +└─$ sonar-scanner --version +INFO: Scanner configuration file: /home/sa/.local/conf/sonar-scanner.properties +INFO: Project root configuration file: NONE +INFO: SonarScanner 4.7.0.2747 +INFO: Java 11.0.14.1 Eclipse Adoptium (64-bit) +INFO: Linux 5.18.0-3-amd64 amd64 +┌──(kali㉿kali)-[~/09-ci-03-cicd] +└─$ +``` + +Готовая команда запуска анализатора кода: + +```console +sonar-scanner -Dsonar.projectKey=netology -Dsonar.sources=. -Dsonar.host.url=http://51.250.3.1:9000 -Dsonar.login=543945fc60861f017e8d81c8d6557c971dd4fa9b -Dsonar.coverage.exclusions=fail.py +``` + +Пример запуска анализатора кода: + +```console +┌──(kali㉿kali)-[~/09-ci-03-cicd/example] +└─$ sonar-scanner -Dsonar.projectKey=netology -Dsonar.sources=. -Dsonar.host.url=http://51.250.3.1:9000 -Dsonar.login=543945fc60861f017e8d81c8d6557c971dd4fa9b -Dsonar.coverage.exclusions=fail.py +INFO: Scanner configuration file: /home/sa/.local/conf/sonar-scanner.properties +INFO: Project root configuration file: NONE +INFO: SonarScanner 4.7.0.2747 +INFO: Java 11.0.14.1 Eclipse Adoptium (64-bit) +INFO: Linux 5.18.0-3-amd64 amd64 +INFO: User cache: /home/sa/.sonar/cache +INFO: Scanner configuration file: /home/sa/.local/conf/sonar-scanner.properties +INFO: Project root configuration file: NONE +INFO: Analyzing on SonarQube server 9.1.0 +INFO: Default locale: "ru_RU", source code encoding: "UTF-8" (analysis is platform dependent) +INFO: Load global settings +INFO: Load global settings (done) | time=119ms +INFO: Server id: 9CFC3560-AYK7Tf0Hvo_99qKV86b9 +INFO: User cache: /home/sa/.sonar/cache +INFO: Load/download plugins +INFO: Load plugins index +INFO: Load plugins index (done) | time=65ms +INFO: Load/download plugins (done) | time=139ms +INFO: Process project properties +INFO: Process project properties (done) | time=5ms +INFO: Execute project builders +INFO: Execute project builders (done) | time=1ms +INFO: Project key: netology +INFO: Base dir: /home/sa/ci-cd/example +INFO: Working dir: /home/sa/ci-cd/example/.scannerwork +INFO: Load project settings for component key: 'netology' +INFO: Load project settings for component key: 'netology' (done) | time=91ms +INFO: Load quality profiles +INFO: Load quality profiles (done) | time=132ms +INFO: Load active rules +INFO: Load active rules (done) | time=3592ms +WARN: SCM provider autodetection failed. Please use "sonar.scm.provider" to define SCM of your project, or disable the SCM Sensor in the project settings. +INFO: Indexing files... +INFO: Project configuration: +INFO: Excluded sources for coverage: fail.py +INFO: 1 file indexed +INFO: Quality profile for py: Sonar way +INFO: ------------- Run sensors on module netology +INFO: Load metrics repository +INFO: Load metrics repository (done) | time=52ms +INFO: Sensor Python Sensor [python] +WARN: Your code is analyzed as compatible with python 2 and 3 by default. This will prevent the detection of issues specific to python 2 or python 3. You can get a more precise analysis by setting a python version in your configuration via the parameter "sonar.python.version" +INFO: Starting global symbols computation +INFO: 1 source file to be analyzed +INFO: Load project repositories +INFO: Load project repositories (done) | time=35ms +INFO: 1/1 source file has been analyzed +INFO: Starting rules execution +INFO: 1 source file to be analyzed +INFO: 1/1 source file has been analyzed +INFO: Sensor Python Sensor [python] (done) | time=359ms +INFO: Sensor Cobertura Sensor for Python coverage [python] +INFO: Sensor Cobertura Sensor for Python coverage [python] (done) | time=8ms +INFO: Sensor PythonXUnitSensor [python] +INFO: Sensor PythonXUnitSensor [python] (done) | time=0ms +INFO: Sensor CSS Rules [cssfamily] +INFO: No CSS, PHP, HTML or VueJS files are found in the project. CSS analysis is skipped. +INFO: Sensor CSS Rules [cssfamily] (done) | time=0ms +INFO: Sensor JaCoCo XML Report Importer [jacoco] +INFO: 'sonar.coverage.jacoco.xmlReportPaths' is not defined. Using default locations: target/site/jacoco/jacoco.xml,target/site/jacoco-it/jacoco.xml,build/reports/jacoco/test/jacocoTestReport.xml +INFO: No report imported, no coverage information will be imported by JaCoCo XML Report Importer +INFO: Sensor JaCoCo XML Report Importer [jacoco] (done) | time=1ms +INFO: Sensor C# Project Type Information [csharp] +INFO: Sensor C# Project Type Information [csharp] (done) | time=1ms +INFO: Sensor C# Analysis Log [csharp] +INFO: Sensor C# Analysis Log [csharp] (done) | time=9ms +INFO: Sensor C# Properties [csharp] +INFO: Sensor C# Properties [csharp] (done) | time=0ms +INFO: Sensor JavaXmlSensor [java] +INFO: Sensor JavaXmlSensor [java] (done) | time=1ms +INFO: Sensor HTML [web] +INFO: Sensor HTML [web] (done) | time=1ms +INFO: Sensor VB.NET Project Type Information [vbnet] +INFO: Sensor VB.NET Project Type Information [vbnet] (done) | time=0ms +INFO: Sensor VB.NET Analysis Log [vbnet] +INFO: Sensor VB.NET Analysis Log [vbnet] (done) | time=9ms +INFO: Sensor VB.NET Properties [vbnet] +INFO: Sensor VB.NET Properties [vbnet] (done) | time=0ms +INFO: ------------- Run sensors on project +INFO: Sensor Zero Coverage Sensor +INFO: Sensor Zero Coverage Sensor (done) | time=1ms +INFO: SCM Publisher No SCM system was detected. You can use the 'sonar.scm.provider' property to explicitly specify it. +INFO: CPD Executor Calculating CPD for 1 file +INFO: CPD Executor CPD calculation finished (done) | time=8ms +INFO: Analysis report generated in 50ms, dir size=102,7 kB +INFO: Analysis report compressed in 15ms, zip size=13,7 kB +INFO: Analysis report uploaded in 41ms +INFO: ANALYSIS SUCCESSFUL, you can browse http://51.250.3.1:9000/dashboard?id=netology +INFO: Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report +INFO: More about the report processing at http://51.250.3.1:9000/api/ce/task?id=AYK7doDcvo_99qKV8_hF +INFO: Analysis total time: 5.586 s +INFO: ------------------------------------------------------------------------ +INFO: EXECUTION SUCCESS +INFO: ------------------------------------------------------------------------ +INFO: Total time: 6.544s +INFO: Final Memory: 16M/57M +INFO: ------------------------------------------------------------------------ +┌──(kali㉿kali)-[~/09-ci-03-cicd/example] +└─$ +``` + +![sonarqube](img/sonarqube.png) ## Знакомство с Nexus ### Основная часть -1. В репозиторий `maven-public` загружаем артефакт с GAV параметрами: - 1. groupId: netology - 2. artifactId: java - 3. version: 8_282 - 4. classifier: distrib - 5. type: tar.gz -2. В него же загружаем такой же артефакт, но с version: 8_102 -3. Проверяем, что все файлы загрузились успешно -4. В ответе присылаем файл `maven-metadata.xml` для этого артефекта +> 1. В репозиторий `maven-releases` загружаем артефакт с GAV параметрами: +> 1. groupId: netology +> 2. artifactId: java +> 3. version: 8_282 +> 4. classifier: distrib +> 5. type: tar.gz +> 2. В него же загружаем такой же артефакт, но с version: 8_102 +> 3. Проверяем, что все файлы загрузились успешно +> 4. В ответе присылаем файл `maven-metadata.xml` для этого артефекта + +![nexus](img/nexus.png) + +Метаданные артефакта: [maven-metadata.xml](mvn/maven-metadata.xml) + +```xml + + + netology + java + + 8_282 + 8_282 + + 8_102 + 8_282 + + 20230525140514 + + +``` ### Знакомство с Maven ### Подготовка к выполнению -1. Скачиваем дистрибутив с [maven](https://maven.apache.org/download.cgi) -2. Разархивируем, делаем так, чтобы binary был доступен через вызов в shell (или меняем переменную PATH или любой другой удобный вам способ) -3. Удаляем из `apache-maven-/conf/settings.xml` упоминание о правиле, отвергающем http соединение( раздел mirrors->id: my-repository-http-unblocker) -4. Проверяем `mvn --version` -5. Забираем директорию [mvn](./mvn) с pom +> 1. Скачиваем дистрибутив с [maven](https://maven.apache.org/download.cgi) +> 2. Разархивируем, делаем так, чтобы binary был доступен через вызов в shell (или меняем переменную PATH или любой другой удобный вам способ) +> 3. Удаляем из `apache-maven-/conf/settings.xml` упоминание о правиле, отвергающем http соединение( раздел mirrors->id: my-repository-http-blocker) +> 4. Проверяем `mvn --version` +> 5. Забираем директорию [mvn](./mvn) с pom + +Проверка функционирования **Maven**: + +```console +┌──(kali㉿kali)-[~/09-ci-03-cicd] +└─$ mvn --version +Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63) +Maven home: /home/sa/.local +Java version: 11.0.16, vendor: Debian, runtime: /usr/lib/jvm/java-11-openjdk-amd64 +Default locale: ru_RU, platform encoding: UTF-8 +OS name: "linux", version: "5.18.0-3-amd64", arch: "amd64", family: "unix" +┌──(kali㉿kali)-[~/09-ci-03-cicd] +└─$ +``` ### Основная часть -1. Меняем в `pom.xml` блок с зависимостями под наш артефакт из первого пункта задания для Nexus (java с версией 8_282) -2. Запускаем команду `mvn package` в директории с `pom.xml`, ожидаем успешного окончания -3. Проверяем директорию `~/.m2/repository/`, находим наш артефакт -4. В ответе присылаем исправленный файл `pom.xml` +> 1. Меняем в `pom.xml` блок с зависимостями под наш артефакт из первого пункта задания для Nexus (java с версией 8_282) +> 2. Запускаем команду `mvn package` в директории с `pom.xml`, ожидаем успешного окончания +> 3. Проверяем директорию `~/.m2/repository/`, находим наш артефакт +> 4. В ответе присылаем исправленный файл `pom.xml` + +Итоговый файл [pom.xml](mvn/pom.xml): + +```xml + + 4.0.0 + + com.netology.app + simple-app + 1.0-SNAPSHOT + + + my-repo + maven-releases + http://51.250.17.146:8081/repository/maven-releases/ + + + + + netology + java + 8_282 + distrib + tar.gz + + + +``` + +Загрузка зависимостей (артефакта) и сборка дистрибутива: ---- +```console +┌──(kali㉿kali)-[~/09-ci-03-cicd/mvn] +└─$ mvn package +[INFO] Scanning for projects... +[INFO] +[INFO] --------------------< com.netology.app:simple-app >--------------------- +[INFO] Building simple-app 1.0-SNAPSHOT +[INFO] --------------------------------[ jar ]--------------------------------- +[WARNING] The POM for netology:java:tar.gz:distrib:8_282 is missing, no dependency information available +[INFO] +[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ simple-app --- +[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! +[INFO] skip non existing resourceDirectory /home/sa/ci-cd/mvn/src/main/resources +[INFO] +[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ simple-app --- +[INFO] No sources to compile +[INFO] +[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ simple-app --- +[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! +[INFO] skip non existing resourceDirectory /home/sa/ci-cd/mvn/src/test/resources +[INFO] +[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ simple-app --- +[INFO] No sources to compile +[INFO] +[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ simple-app --- +[INFO] No tests to run. +[INFO] +[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ simple-app --- +[WARNING] JAR will be empty - no content was marked for inclusion! +[INFO] Building jar: /home/sa/ci-cd/mvn/target/simple-app-1.0-SNAPSHOT.jar +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD SUCCESS +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 0.588 s +[INFO] Finished at: 2023-05-25T19:10:17+04:00 +[INFO] ------------------------------------------------------------------------ +┌──(kali㉿kali)-[~/09-ci-03-cicd/mvn] +└─$ +``` -### Как оформить ДЗ? +Во время сборки **Maven** должен загрузить необходимые зависимости (если их нет) в каталог +`~/.m2/repository/<группа>/<артефакт>/<версия>`, где `<группа>` - группа артефакта зависимости = **netology**, `<артефакт>` - идентификатор артефакта зависимости = **java**, `<версия>` - требуемая версия = **8_282**. +Таким образом должны появиться файлы в каталоге `~/.m2/repository/netology/java/8_282/`. +При сборке в каталоге запуска рядом с `pom.xml` должен появиться каталог `target` с дистрибутивом, имя которого будет начинаться с `<артефакт>-<версия>`, где `<артефакт>` - название артефакта = **simple-app**, `<версия>` - версия = **1.0-SNAPSHOT**. -Выполненное домашнее задание пришлите ссылкой на .md-файл в вашем репозитории. +Проверка загрузки зависимостей и сборки дистрибутива: ---- +```console +┌──(kali㉿kali)-[~/09-ci-03-cicd/mvn] +└─$ ls target/ +maven-archiver simple-app-1.0-SNAPSHOT.jar +┌──(kali㉿kali)-[~/09-ci-03-cicd/mvn] +└─$ ls ~/.m2/repository/ +backport-util-concurrent classworlds com commons-cli commons-lang commons-logging junit log4j netology org +┌──(kali㉿kali)-[~/09-ci-03-cicd/mvn] +└─$ ls ~/.m2/repository/netology/ +java +┌──(kali㉿kali)-[~/09-ci-03-cicd/mvn] +└─$ ls ~/.m2/repository/netology/java/ +8_282 +┌──(kali㉿kali)-[~/09-ci-03-cicd/mvn] +└─$ ls ~/.m2/repository/netology/java/8_282/ +java-8_282-distrib.tar.gz java-8_282-distrib.tar.gz.sha1 java-8_282.pom.lastUpdated _remote.repositories +┌──(kali㉿kali)-[~/09-ci-03-cicd/mvn] +└─$ +``` From ca731679978c38198c82780ed980732a19c6ee62 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Fri, 26 May 2023 19:03:00 +0400 Subject: [PATCH 078/146] Create n --- 09-ci-03-cicd/img/n | 1 + 1 file changed, 1 insertion(+) create mode 100644 09-ci-03-cicd/img/n diff --git a/09-ci-03-cicd/img/n b/09-ci-03-cicd/img/n new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/09-ci-03-cicd/img/n @@ -0,0 +1 @@ + From efc6123d75ff3a6785e4eb4ec9fa9f099f633f7d Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Fri, 26 May 2023 19:03:27 +0400 Subject: [PATCH 079/146] Add files via upload --- 09-ci-03-cicd/img/nexus.png | Bin 0 -> 36558 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 09-ci-03-cicd/img/nexus.png diff --git a/09-ci-03-cicd/img/nexus.png b/09-ci-03-cicd/img/nexus.png new file mode 100644 index 0000000000000000000000000000000000000000..b129d1e8a33dc8fb0364405e9ddd91f0f63ec3d6 GIT binary patch literal 36558 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 literal 0 HcmV?d00001 From ded2e6fa0d857e58006b7dd626295d7affa0cf70 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Fri, 26 May 2023 19:13:17 +0400 Subject: [PATCH 080/146] Update README.md --- 09-ci-03-cicd/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/09-ci-03-cicd/README.md b/09-ci-03-cicd/README.md index 30ba601a1..f0ed6133c 100644 --- a/09-ci-03-cicd/README.md +++ b/09-ci-03-cicd/README.md @@ -237,7 +237,7 @@ INFO: ------------------------------------------------------------------------ └─$ ``` -![sonarqube](img/sonarqube.png) +![sonarqube](image/sonarqube.png) ## Знакомство с Nexus @@ -253,7 +253,7 @@ INFO: ------------------------------------------------------------------------ > 3. Проверяем, что все файлы загрузились успешно > 4. В ответе присылаем файл `maven-metadata.xml` для этого артефекта -![nexus](img/nexus.png) +![nexus](image/nexus.png) Метаданные артефакта: [maven-metadata.xml](mvn/maven-metadata.xml) From a1041f826b38dc3076ba2e673e0771642105ca05 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Fri, 26 May 2023 19:13:46 +0400 Subject: [PATCH 081/146] Delete 09-ci-03-cicd/img directory --- 09-ci-03-cicd/img/n | 1 - 09-ci-03-cicd/img/nexus.png | Bin 36558 -> 0 bytes 2 files changed, 1 deletion(-) delete mode 100644 09-ci-03-cicd/img/n delete mode 100644 09-ci-03-cicd/img/nexus.png diff --git a/09-ci-03-cicd/img/n b/09-ci-03-cicd/img/n deleted file mode 100644 index 8b1378917..000000000 --- a/09-ci-03-cicd/img/n +++ /dev/null @@ -1 +0,0 @@ - diff --git a/09-ci-03-cicd/img/nexus.png b/09-ci-03-cicd/img/nexus.png deleted file mode 100644 index b129d1e8a33dc8fb0364405e9ddd91f0f63ec3d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36558 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 From d16b60c823865bcc5ba6b5cb61f7350e632bbcc5 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Fri, 26 May 2023 19:14:33 +0400 Subject: [PATCH 082/146] Create nexus.txt --- 09-ci-03-cicd/image/nexus.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 09-ci-03-cicd/image/nexus.txt diff --git a/09-ci-03-cicd/image/nexus.txt b/09-ci-03-cicd/image/nexus.txt new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/09-ci-03-cicd/image/nexus.txt @@ -0,0 +1 @@ + From 302e4d2ce350ca6e3e04e627b3d417d41f15efd9 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Fri, 26 May 2023 19:51:42 +0400 Subject: [PATCH 083/146] Add files via upload --- 09-ci-03-cicd/image/nexus.png | Bin 0 -> 36871 bytes 09-ci-03-cicd/image/sonarqube.png | Bin 0 -> 86979 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 09-ci-03-cicd/image/nexus.png create mode 100644 09-ci-03-cicd/image/sonarqube.png diff --git a/09-ci-03-cicd/image/nexus.png b/09-ci-03-cicd/image/nexus.png new file mode 100644 index 0000000000000000000000000000000000000000..9801eedf5c86746dfae834281642e14c9f5d9628 GIT binary patch literal 36871 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 z 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 Z_jbMs9C!byI0O7MHMBH%q~~$-{{yzv1rq=O literal 0 HcmV?d00001 diff --git a/09-ci-03-cicd/image/sonarqube.png b/09-ci-03-cicd/image/sonarqube.png new file mode 100644 index 0000000000000000000000000000000000000000..8360f9a6c638af03fae293c398d42729a0614745 GIT binary patch literal 86979 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 z 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 AJOBUy literal 0 HcmV?d00001 From bda67b17c9bd4970585286a28ccc9fc0c0f4fecf Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Fri, 26 May 2023 20:00:29 +0400 Subject: [PATCH 084/146] Delete nexus.png --- 09-ci-03-cicd/image/nexus.png | Bin 36871 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 09-ci-03-cicd/image/nexus.png diff --git a/09-ci-03-cicd/image/nexus.png b/09-ci-03-cicd/image/nexus.png deleted file mode 100644 index 9801eedf5c86746dfae834281642e14c9f5d9628..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36871 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 z zhRtR}nQZ9huGR`YBn3p@#{mASo-<{+=0L9=`3x zZhrp0Smw>iXX*Ki;C|jdP0XzZ2j-=iQKnZLRi@iJ06X5s=}oDa-&R_b`=3jZB-=#D zBP5=HN$#T|>I|=q)M%rF`pu8o8D2Jv3mI=;A7#pb*&#Fv;2)#7f701^ml|lSA6VeXYIBVY7?we2w(v;iZe{85Z~>Ol~D2={{fL8BYp&@h*{zNi&CQG*vfO z2zC7~DFF|YJq%N%i8{}?_Va3~d#otP4zO%TcWDdc!9F9B=J(Q|^(9%B)%_HCUo9UO zWpv}NSQJ0&W%t25b)o0l^3$W+eG@?q5csSNCi+Z+beM(TaKh!BNV-zLZJtJ06nnFI z5X;luchwTRlN)Ds-C~=$R#wN$%O_R?{fvaAyvSvT?{}1yMa_Jgt4Wm^%8>MNZGFEw z0>IOEC!W3}GO%0cdS&ZmcS=pi_REh3)xd`k8P3W$~CIHa=qa zus@W$~ zbZ1vg#TMI>E{6A65g*1?_)X|P!-b!%~5N#dI^t%hOW1!yq`{04ZXlBOT zjz1g6d}=lQ$*2nRMtaU!dXnlMGZ02kA}t>NA+*$d?Z~QD?dqAHK^m|t!laDCs1nb1 z{MSoxv8n*Vg2Sp^K4s|Js`(5Pdy#FTB}aVdKm5}cM|`{swn%cSVdxGIX@8iyGQuD) zvsrAlCO{|}6(R!Hx(p;t_{iP$CC-keDil*mV=gXu6m$F42nFT??gytSA`{+X@snG! z#X~BwLuVXhV#o->tTXjEVq~yN@k=X5n77)#zE}}~kEX}7tB?`rW@9o6WCvLceI64+ zGo%pEq#T|qkFZM_$He%!GU|^-8+Z^FxA`8oU4cMmpmSXTh90($$4pvBIs|Shl)7AX z*#>Oz_zHR27-w2oyA`CGOJ{KTj|!2i>&^T1Q$f`)O|6jSj_b~YqzS4dN^gXa5D_oj zk8DU@&brW8WXJH9d0>f@UXJCRrT@wh2f}O7)uOwp;AspF^1jk~SO$qlfyyztHibXb zQW5i-kBt>E(_pWU=Nk11lKb!r1BmQnxeDtSj4HX*_YkAii2&>%y;3hk5d6bnc}A7! z7Fu)ryz%WLe)3Ri%J>I&=``f(?ce3W%NZt(`^04;4l}N`x?j%q;@Vyt=GTA3XpDuY zCg$bVQUN3KjjDuY;^Ok|^CsoTraJOemmcr_DEU)lcxhK845^^-CNLlmbBijE!Tvw3 zv1btw8!=NBLVhkL0+hHgCd9%1uNFL169(%4Z!CCZhyR6BD2fSg7()$ckBoR5WAEI2 zRAknCG->ZQdUP<3xn9NdjDOaYAD(-O&`;<0l>OPNEr*d-0-n;UmYewBXudt!cU}0< zDA9ZPXF(-m>D#Y59h1mE5b^8Zyx^<7G-+Yjq39N6d9wNsLFCA{#)VGZe~5VC`@WB3S7u@_{$|KecGt*5E3#ZO+48C_aa_6p z8tja~d4zQ`2~P|5=k@``%RM@@R4$J{_oVOU*LrG-g?AY%K_;976NzjsH&CXCq5 za4Fz`!*(&q5r^Nfr2@^=QyL%=q7siT(4!PKj+K`_s#F5mjuOdr0+Ue%n~JJJ|7>W> zr67WPa-Dr2XmMVyf++Y~CJ*knpC-VnE=}l7d{8%hhS<$K##Fqrs_akSqi*7Yh++bk zEK-JqEtl$C5IleL^zTh9V_=EnUQZDbtxS&=j%NN;bXzSG`}l`zDp(@Deg!%?-b+eT z=f*<;IFU=83aA@L`>jBT!RO}=$W-Ms$4%n>v_{Y1h^`9x_CGS|jfi=g9C0#DP!pr) zVvc7oN>28-be2EOZIR-K?Sb7w#;oF_0h^y#yDJxLO9Qzk=-llw-yO*57T)*w6IR{B z%M7mBjv-cZV2Pg;WR`5t+gCHZM`veKgUk6YKxc z;Eh)okE#!U7a3|X0l&HwG|>FFf!1L3aliBbFsf~`n5}pJZHKb=|GPz$jc1#*`bUG9 zD*rYLGN$GKYS}$j09OJ33q=g+z5i;dw{sv;|JfMN-tC29G(hufiVsIKMX8(KN*P^HA7lI!vYM zyCOJUoR9KGOEHwm9pLPtkgQUyYNrXY(STh4*HZUjCO8+unGf?)H4HXJ^S^rV z_ZC3G7_Io<4aJiqu`tY<_?Ig-q?lIozpdBIk_a-BXlek)l87C=D)^`{o=hrD;j_9D?>PX_}Yzm9VHebfUFzEj?FX{{8Mg2A&ayk-4_Yqcgad;pT zE{Gvd7ZIrJ%{Ft3n<=_wCVFJ$Lnp%H8nl)B>^&MU6M3p0i!Vn)SR%{T(z(&t3(Ht2 zg6v|)K8|^FFek&I;PWA&Xd!CS<S5Hs zKXe+6lQ}+GES3u$q5I?!-_b2sA*p|Rp(e?}g~_9F_{kL$Asq2215b(vIg}56q|kGJ zolgtxa=qP@*X8=2olinU#nX_w#Vr`rL)wDf-E!|Msc-S&H#!RSPK)aj>Vz#$=$CMk zbm+r+Nt~CS6Z>2M^UQ@#$%mU zi=r7LzAsVSSO+PN2vQ-j*Xm5y068Zmz*ZNyT{xTO`(u%aHuh@MGTv+1XI=A*IN7P# zjo;Td3E4Z`KzTp_JI;{NZG=A10$n0C{8>I3W3u_=#C<}D)X|aWT4c!ibG=6fAT>jn z9P(7ni7@Sr(hKk-{Pwg(+k=24lcvrh3bL5>ds()hpHT}Mu98z@`@h3HZW^QM#S3fs z80TUGFlC9NL2Rdff5oGm|F*s2PJZB-f!VwEEXdb_D0>}BvKY5Ao%wKUMZRWz9sKTD zh&OSTjRX#R=f^o&>K92T>3&&NtaE;tGQ`W1G4h(Go%tm-h*Q4q(T-|IP80qWw|sPJ zvhfd&=TsOm5Fr`fTeM!FgqaY?^lyjaN`c+{)T%;+&QC)m_~4@hjZZlNVPUoViN#8< z^ahY%KgemMsmnfOn=enx_C3r#AynVWmZ`df3y`ai{hhmcm_O+j;C-(Jqzx0r zPkCeVTT+UYH)06m4F%2=EOiUJmT$j{VV>y-{hf@Jm?oK51G)=43H2!$;MTSsgnoXS z@A)uXh=K+8w5`C!qW_(mZW;>6bN$Mx_1AdhTTvQqQ32)PEeVXK@*1;L|Fx&0S@J(K z^%Y5pe|N3xC;wmVy=OpETemJOJ+#n!DAIc`q4z2vy$DE?A~kfR*hq-900IIUKtMW5 z6{LueND%=+RFI|t1Oyb2A_C&K68GNkKJO{tz30B?{<{7$K-QXT&M}`co@b0X7OgbG ztoc}&Gtewjm~c%2V6qjpe|~l&8rcqc8|KHG{c+QP%ThkMsZt{l+eD$Q|FU?^=}-Ky zSo%9Pz8hM9cCe|hLT{IrE8NW6B4rG4P6X)t<6)%2r`Xf<%ES6~Y_*=`(uTc=hPe$UUJ+%|Kby09s$B{q2*C`VBEt z4%5L+GSMVOlT{CacoP3NQj}FW5z)?exeiVZxh=ZvV zCXgoHYgdw?Uv7yGBU1_ks)2mbqyyl7+Ll8;pkD^lveda1L&>_6nWjX3MPFFGu7qq# z9XMZq-?G`Ck^oKORVM;Wd;*!fMv#EQuxtSIN6S$m?rmY z^QBkSE6=-7`Wa3C8&BP`<95{fPPicXZ`G&^v!8B7!O%?xZ9;r-%Wz#K{$-3%H$ zm3+&&-X8Ji@SQsVURZLf*bd~MNV5!n`9zCNo762W4Ez14LpC*o-j_obEv~u(XM7TO zZXazCor*27gr0H^I*be$xCUz^=aJ7&RNKGizm~!b*g_PXN%g576tea83i#km%OZJHvH@)wDjI(DcpPr3UP4WZY0*1W4GFN5h$Z zQeY+LfAh$Pa<@XxlByx)MwVqEimWp*JsKw2zFa!*{w`ki>f3y5Cub2F;s|f;f}u0j zvJ8~Su1Z*$%L9JezXcjWznN_{+zgUz5tF#X>3xzZynBrM0BAJg~R|7v{* zTz}A`53$6661SuMb3b0r_)Sa4nv9&`*y##@l@dw(T!7iCrn3w-d`o$}l*>uNzURSk z%!#m0^}%p(V6`}28Zdz6DR3|mjpV;ws*r(@7ZOQm0E&r{ciUN~8<&kACU`1`ohRuy z^QO;OO+2|t?={vsFZCYtE>m4OX!XiUSwz;*pl(PbNTij$rDN!;O&(aFlJ8`N_;-v2 zgfxF7eN3UYOa=u{6OgS?}J*> zYiVWx*^~nIL24Sj;lMF+`o$x|#5UX5HNlda#pg^3m3NWN34QG=BEang{tBGSD`AU{ zOJzOjiD3=5MVIywyW`vXneR?pe}1?&yn3N*F^kbs>Lh-sK$ICuw_29FYtH|j3d!iXNvzC@8i|Q&tI($N z{+A(dl6zakErv~^D^1c`XM()%=y{3xeO~K0kKj($zt9sdh~_Ar1o+q^r@^Lxj_V%- zyz=0-03j_mgSJw4^|bGJ=;cv;kT>oPR1vw_lu0&s*GDV!mXMS1$ZHbj8x^hiZt4Dy~=0p-wn9~cpNZ?pvu+_i@F!!OIyh_y` zEIHO_Bc*Zcp;yjRpo16UQ~Dxd4HYDI#?X|!xidAXu=T|c`YmrzuufmsS~$!pHb}E= zcm1Bf3H04q$ismk#f3VITzkUsNZOp7=q^ zIu)k%OHTPk_vlP~8HpWr)zR9{**bvPk+N5o<2g1Gc?VXDpBV(1S=~Y`fqMwX*c^ZgKR=K*v&1_&QFn4r` z+KIjQkmyM#aDcpg*GZ-M0t?s~fnSVZXpyG0y(#pBbo#ZjU0yAmjnX^$RQxf^`i8q;P;@TOB_9*o`+xMs=J7Cl1Bcj#I9B--)Sn>4H01EKcS%9xb z#>25)CPB8imc)-t|C5&!SRzdsz|z_NjKu;U7(>hI zfIt7w0A^wzquLS?Vr2#;pwh$-wv?wBJ6_7Fi0!RX=RY`7ktAe8?d5_m$Sr`Vhcs&O z>z8*bQ_=BjMwri#lX&_v8X#Dpa2H&NViiD-SFkc^hbCG!lGG!WX?B~u{^?RDj$)BT zEOB4cKIFGfVScPItD|B~FrNkgcAbQX;}K&E=t2c+lVh(C8uk1c($_QvrYH^MJ`FKz z9=OAEAL+qeDce&D$1 z>wj=%Kcltnuo_7cRz87CjSPZVNn5f%SE;G&n^YKM0Zc8%wf2-3r=YQc@q~NNnnD4o__wy8pjU+# z0WjKq@+J#cn&7sUhofYK`1o(=PvG%>zTujMsYj@%Jraj8J;p&uNzy_D=}IYU7Njhth)xc zsr?pNHs3_8>cq0dr1!k&g{Gjm22kg&$JkFtFsP%`RM`ehcm^v2ddtL)$0p7(oD4&y^YxS%gTN#q^YbU zV+vJBb$1`VeG6vhZDp$3LILdIryvR=UDJ8h>udL2p+2S~9D124Z$Xmvp`UM3SJiS? zJKyG3N0H+^v_MGeFfbcf-6hGDABPS|OK%ZGE90i76h*m`)_u>9pfZ0gZT)biI(|0c zXFv|{u=U44_QLXobp0LK^RzgRAA$7g#?bHa1DA;(kIM?D%rKxK42d(*Yk(5rqMkAR~!?!oiF8nUQ_PQD6G1}WJNhlk8-mpuC#w{lIuFGf#s#N|-g}UDHz&3#QyTIJt2cDx1$2_{97GAU`k9yZZb>yCWt9b9oAqI^{K0N# zetgJvN_FQt&uPHM)@xOI?A8QBWy-Y^%||OiSH|q8+@3|fb$905-I>zW9%r_B_vPfN z8}H0;UJA>{n1&vnRMQ}7+@;^4$iu#?8)6VRi}TWL5B5nMU|E&nG~$&LGP1-!cXm{k zV=kTyJlt@Ad9qYA{^IK3WUU?g!A?V3<1|WHI!f#Kti-v1$a9qT*I|4G%T&b6pV}Fh zy&@<@&H>=^9z@~EKmr^J1=Kv*nEqe7&`;i0VNn>84ff>ji4})&2p=PO-Ek@}ym|PN zy+|ygZ>)1;;XIZPyLC!}PSO#%=!wxq)Nbl9THXOHrI}&OpIoJ{i=Pyzz~frd&PEthCpz=!suLw0@%CxGjw^%`7n8aJ!f0znVkW=;xIt_ z2Jd@az>wU6MN1*651u8>cwk3o8&=oX#aYVpGoOvYvG0F2bQK3fLBZ^}dT~Rj`D3G^ zpVpo^FkkXNnNVv-g%>bQLK@q^9Q|6MW6yUIkPEQ>(f*bJEa7@>S5^dA1nCk#CR&%E zEFy{17s3;%QP=wCbuTfF(J)-SM?_#0?@SD!K;jmxi^|mf^x_}x*u3QX*34~4(y;A6 zw2aFc25^#)AD?7O(Y;c|!UVmYpeh>$omRBGXEOLp^|+kz4P-om&w2fWRQ#ck{5$Ox zkUId}9R&R7#Lzv0z>dG>zu^ymxcYxw>kongj9mpOl3ucHD2JC<>|6zRtYr0*9>-1I z&E{!aw`nZp1)y>@jwe&ya?45(eR(O=I(U||(#rwRd;wo=B~@PPEraq@;fS-6X0tT@ zYz(+l1Gp_`zS(f0Ca~Z@irvmB9S-w~`m|!ighH<`U7y!nj;x+)YD`ji~}}a zxNGfau0ff*w{FA49qeozp+(HrF|+{15koMM*OWN~wRTyQn)xh6#=n&aQqu1Y(7kMD z#y^c~D9*Qha^~n7{QSi6CaR|4el#D>{9bBU%?R}AE3NC#;*>?LZ`FMX?+w*@-rA<- zDw2Zs9N}BxU6O3DBgMSJ)pGc}^mtEooHS7S%IqFR6Ek$30d^jCvc+UkO7@kD0_)ldu!wxx&|)_NMgiz^HVRMc&nIc zrmvpf8*6gc7<8x*F6LeipuX`kTwc+Lc_gj!JC&>KIJ3kD{iO7pP4Z2|d(-rh*)8cz{{o7rZjTL zul8M`-mJd8?i0uoZpnv@8&8IIn3?W%!4?^qN6)3hV2B?XG!wFf`Sj& zM80$qysDXs&o`TkK~4?B>c)ZYbm6#hr~>!0Rlwo=k$W!Cn#k(h?niG=o*&7@1AZ-Y z@eIK8_saS#*~mRyCh8)UtbWRSS(mDq^2ZZ9^K-Fh7%bUkuL?ZwOTHI#5Ecb=^o#ra6qC^R ze$jw;7Pf7i$^brv3pse`kLZd4?ccJaUoAIsyV}?K0^^Q+2#XbpWM>>}?dbAy#iLno zRiCs`A>H{Rg>|h`6wC=XbA?@mDe>0z_XbHXutV2bt_9}!8+vNk%{>ffrACGT^7zi~ z^US7OwRaOHC2{Q>YYw>dqoQ$3J;GjYiJE#uzkK+_u2>R}S4LAtP;Q{GEfL7?^Q%hd zo&P6v`}+Rz#@Fot>>a6?_`8H;ApvwaZlv1lgu=%Dmem3>_|C}xrR37M;ca~8?T_@} z|GMhSkIxsjF#Lu0JNZ?L(r@eklz}HXQ}8MKQ6m6l-9#W8*rIt`r&p%j2)IJ9T9~W& z)|yP&_?4e!k$7!0HBFEwqm({I;mxy0h_ca%@=D`F!5_8d-yi+rl)0{Vm0wcCW2?%E z?Wl#;F>yg4>&Wt;^dm-ae0pootl5-J?(+pvxyLBn zAzSK{?V1?lH_()ApR^p0{0XH*Bil<@%7ww(9mN^%Mj=TOL47^l64|gy3%`tWhZfV!(6TWBR6ET%blUby^u`yR%?OJ&1b!Pdl}zcH_-rUEE)t+3(bpv;oBMf7VVf|y zTa|bkkAmH2LJ^!xxOBD(<}^;F zUQ!8*6HbC{ey7iHBGbE{!we?ozBJrMTcrmrXR0fKz+te>YjFvDocsBWZpnq))=w9i z?*^EQhcKy=Nr#h(KEygancH0N2O9NF^V$R5;Z$93`v8$4dGcp~?qx+>Dw6?;sI|c- zHGmt>VBV|BM!~T=@_JVcwPu8BPmKzF0i7l}Y52JRiJFcl2xaWfh zffkAY>jZd?L!%^yQrCP`8FE5ZZyx95tyD)Tk&7eO$-Ne5#Z;*dqF{4;CDOcHZ4tj zCfC?cEykhwj&8*}HEqBv02LGO|3LXI+w!;;l`L3g=0L?=1hBJxlVJ6l4J1IYrUPIO zKC%O9zqu9G8{jz%ocRIKKvc6PjXQBKi5C8Q?Dn^```?seLUJqJIX-(6f$Ci8h5^kY zs?SkSSM9Ah#6slaY%)y`_Ac&ScaN==u@u%6$yHmw4Vys#Ef1nT`{S&5e{NtRMpIlq zoT{0}RwmZ(E$ErFNg{AI#%{o|&23w@GHE~>nb%GZz`O#ifWoZrDm)gs^%Q0wCRsQa zZ|h!DF5R;ca+dx>5W8<1W*pqJ&GJsLcu|c1i*h`Rj~ zSw6QE+EDZjLN3BY4~pws%+fhKeKawSOA*<1>v~fDNGm!TBW-o)`(}v*0i=K4>4Wd6 zQpym|IDj$_i-o`A0{L;<1!#ks1Y@OyGE!iM#3EZ^Ut6yVp2K(+WS8jFia336S|J5h z<))W7OngIi9*HuV4365cV=sg-D_`Qhh`wGu`KXc3#rul?T|P84k0Ns>%?qeruvzoR z?Xe8f*O_zUfJ-<5u*64+*+F&Ii!g%*X+7t^y6|$Qm(j0?R@x@^;ej(JQSMOGe?^yA33hPVE#V9K zB4&&~=kOlr*;8{DS0qM9VFvVJtdcfx^R0mar(p^?bTKuAZx>cz-b(-n5FQXJPJo5} zO)~!Zqb$&$HeioAOdY77Gx5Ab?bo{gGl|0hf0Hp5OLkB~LS)&ii?*Pre(xnHbot9& zHPKw$aSIOcea#%F7mh^*GS4FJ|1uuc4A+n%JoXw0nR(C&JFMr9eZygO|TyRHX#gPcM7E4rjMC$2Tb_L|7?BZ!ey!g4Q;f< z!uB#>z8G5gLs$VT!L)i{P7yPzy|>6NQtnIkymqU#DZCscroFJc{8VI5dtf2GkV!hg zPXL8C?0I$^X@a3V&?rBycy6aWKBi%S__)uLj)l?kn6Q`Jrjxy&hUdX^+F4vbsOxPp zt9%ntpD%;iRRjnC-Avw8xWIF|&-p0TT2*iw=dE)AElR=;jwp^lic~xwed9l8M6eTM z>MDkM+A8VMgXc#246%ESB#FyUwn6;LzMyfjus(xEpuYW}NJjQV?Z)QNN2LiRg#S-KJd z_o&T6Y+M@~P9rfyYx}ljFO0M8d8?#Ws*{4xAcu1fL3EaUM7mPxRAe>FGrE z82Tcbh^enh1e?5z(ZvPoLi0GP1Rz$eH{FHMX@w`#{Yr4`LS`@wIk-sFUoLnMl3tVX z!>SiN&ET=tK}|(fQu0#-nZ&Q}#ip6#TZu8!F63v67cS4S1WrR|>*c|$9yx`U!r1B3 zo5mZcJoQ9>IVs$I7Vw(nMkz&O>RnD>yXzVB{8o%0sp5M*u;}Tg!LQfuB-zj|DeOI3 zEwI(>am2Zoj04wGm&pK)|uUOI0Pw&wd3I3UcP;w2vrvX|@ST-3pPgy6RxqaNL5db{zVv3R z(oNX6jj0A+FUK`cgW84t^WGOA5|%KIifdUU=jE~}t&!t5nq{fsutJ)m~K!c7ysge#~u9lg*6QS_gd@bF&e991Q1dr8V-z*04CXPXLx zdR*jNPt@f238a))%iVOK=Fzy=f!m9WgnPI^LDs+#dHtjlM+V%uIqRD29Z)~C1tcN{ zVGaik&Sa!91)29f!_BS5YM?{2Dd;#;;NGTvtU=h%+$jl6=aO=Ugt0~SZz-=T2aazZaDUyd9?Sfh+GbM(kILq z5vk3qtJrhb*omR78*zz4IYAVPc2Bx4d7^wsB9Vhqxck$J9n_&Z2Oy;HJ}(dp1CwJ5 zZ9G@aG$DRV9ymO`H}u55rkJbLqMCi7LfnZ9jNuCcEy-37tw`HTgOKrEA*$NMqkWxL z)i#=bI3tkPX4ZA_K2x~9NY3{An|g(s6Eq|^c$`C{`ShEZK7D)8VDzGKy$;^asBnr# zU$nR5)7nsvR9OgU@eHOx{P_&tF8qN84bRv1E~GXSfcX)dB|ua`**AadNn*d#On-eG zxq#cwi!q;hZ=X+a@RI25Q`W7%f2of0t~#MUl4$#;CO?6Gll zOPHG1J1#uwvOHFb}) zdT?&b@n5~u;Z)w5T@R5E$q2@$&r=@K^Xz0;e8o-~U~qD(DK;^S?uQ1H1SjN=n|m=P zN^XW}YM&IzTBj_haUG$gw-n>hepvR&Eo$Fda8p9Fph7nJ@tkPT(8X>j(P`Y1E$lld zp1Z;z5z9|~9`z$s983%V`JB zze{7w!S>M18apwmE$ejeZQd6$t{LLke_~7UaAT~Nua?|*#clPVKEcpdM#sE%94Ri= z(aoL#EVz_cL>Jd(bb-#KBWl?3u*%6$&nhW&Z4F?-&@&{BiBc17+C+Apd z?QR)Q+dDSXQnUmq@}S^MaXZaV$q}-g@;JCsHcV83O2q8b0%M6NA09xF)JO)P?;+4% zu9pt&pn>$x7_fG9^NFdEr1wga4=^*)XZhTbJ?^I_n#?`jRHh^hk)#jWtWhyvm$p|T zIKd=@0zJ=j7EkTIU9uTQ9;@#W?&{fVQDau{1qED;q6>NupqUEaGG+ z4sSHW_u46S`LJ0vaIr@zicI~LE_6hpSi*}8`QFfr72KTd?kc32^CQK6n<6^n6{dJ% zr{P!Ajm6ZcllvnG$xZWl?T*mvl=;95qkw?%F~VCny-=V;yIv5&CD+%iqrrUR)62|B z6)W3Ug6Cq{bEK0#Vv=(ghp06mNLt>OvyfD#M5oE)Lf)0Q(Dm}A)Fo!H!hwd?_%#k? z^x7^hG@Zrv&nr)=-{y_Gx~fA|_9MjIu0kHS34!4XlBjNpIaS;&|@vC zTBrqawgINp-%7vPbDMr@PfHzov~7`C?(GnWF#`>TduQ{K)g>kk&af_=!B1BJ_2AvW zXt1n5k39ZP~aUs)9u5*|jWypnq zNYV5?b@_L{1PnZaxv0+*qA^UVck$}=d0$l727>sWh8MGY`pb-J9G;K<(=pxAm#(MS~ zE_Oa}j1Y9*0h+%QP796Ij*Plw;YFc9c+S9I?#OAJ}ACaH9R-s(3Q)t(vKRZ!Q1jWXzAEOL~5Jhh{cynDuk%7q*Y)1dgOoD(JlXnTN7w!xs&M9=$#r(RnU}+QB)tN?Xi&L+94vfVDqr$t{l1-%u?br zKX`m`{?afe!yMi;){YhZKp8rCo*3uR(HL=E;C!NhQ>6)#G{XSk7&csB z@8(<8oOd|z^ZJGr#ZeYs{UO%XePQuM=DxX>#CV;>Jqb!A7yq3b7qU1JidwGrEew`e`0@F^aJ!Uw=>~I*F_i%PwWXcM zyFYgekXPh)j;Q`HtPIKZC0Egvl15k4id^DGaRvviOQ~D5;uOseRGzpHDCrEan*+f6 zE}iH4ySt4M9dKBIhyi^NwzPb+jX5UmI{$@{JJxi52Wt2yw*wiQli&yWKTe+iYg%5a z2VF>svoLyZ+7#t@v4k`6!7Gz?fTa8pYR5uHLv-;_rH0wL_)7H=m2m0Q9v@m3DA`}? zjl9H5yL9Nq6y2rOG(6z5^Zat;y^z7L@1F*&UFBVw(l%fH!-x()(ki2JXtfMmNPz~g zJ351}2S4V<(iD_(D>tWSGEJU*?D3Js;Ib16+|{aV$>B8_za1D>ZYxe0c*C4iKPI5^fzd_`%JM$WKhLZF`l5Py=d zPCi~uPzuk~b{unz7B}&7!6q!YlJgGf_u=?`>SV_5*)&+>- zD#^Wr0uWwSXe#U`teJhT-3D5;$w^pfahz=Wb*CW485ri)vnH5_0Cj>!o9<)E*oe__ zFq@^*-Gz@mO|W-#A0vR=+t*Udo-iRio(1EknLnw|v19aVXpt6b*}5JOa_x7?Sl8(M zVK~zl4?vT9avVm5#8SAoYs^&~y-@9W#6;NTdeDrIZ-uN0i()~IB(liY%$kxWP^k;h z>S@v5-xCJ3=r!Q}7i0T>?Ix<}E!VsvSFcAgaaK=J#%-CX$1RFKFWTB`sN007UK}Li zu1|{^gZG#e_U7m|$8X*B!bJv5pB%GPI`d5D9W+FGKd%6pcSNY|$=dy>{D}3UF zksZ#jmL{&GpHAk?wfZw{1f+*!j$+-N6y4tvT#q>J{`LWihSmm3LmX6)Z_h&tw1&vE z(KChT4;+5y?Qf9X>mBFgryn>|&@QIpdp7vWIC+{Q(3fqaj+bCyK z$3*v`^$3|=BP?w2~mm?^k(4eB;iRZ@gWjR$LeM;vOXWT-Amcuc zogrpT=q?SNp2n)nC<9ukUVu=kCpFKEH-9mWaw^>W<%uk7&GzouP>^34gjEbNbLTNL zGHF*M!Tr}yrF*}{Kq_3MP{Lg1!R#!4$z-|UlYsW}|EIA3lm0&5hrzW(<5Ki{dYNB` zCwx`as2p^ZJlrdmn)MzlU8OM(rgZs6#O-St#5*cbrP;}3(R9-`o_B#~bIEJ^CoEQN zyyW{*&e(|kQkW6m9jZA4nIKwT*W|NQAvE!IHyD8~gn{(n60sEt`UGL<0~gj_zvQNy zDRas*3*UVjEI#tOH!d>&P`MCN&r`7!Bo}u{^{T^r9xI-F2W_5n?jr)W$vaw!3ju9-x%ny0FIHSvBqylm`r|prS$@jtZSlA_;tAh>% z^@qJFc8Z}&1FCjHSsE9y0u?bLjg;m0L@$~B9#cE+{@x^ok8&xs)utFkxw$dK`=Rn3 z?A{{B@l>J6TC$fD*O!;IwgROut%NbI!jM2Z&Z;4Es6Z+4AdlptI5W4>gM_q%(y4lB>VChPYmi{$-&(cn1irZQXd*kD`1Cw3JLm7Q;aENh-Obb z!vr)5hA#toRv^dK39}k|xE3E__9mI>t9}O3?v^kk^2KvM{akNw3Q5Uw&y$7b`=^)M z%fFR2>=n<)9F=_%ryOJr6P-29c=SdHpWZqIQCL$wq*p4`kxuEd2HtZ59G%n^+Xh89 zT6p;)8PyCyrz;eGmE{G|$jRT83mzqu-3P?NUJO4gH1;&-XWVHPI3XQN% z{1M{+R!~)%gkaJ>bOdG2H*wYD(3+cU3(DI!#+m3oIaj%!F6!mVbXQ$2C+3=as7=o9 zlcBbbDTR8d(RD@e{dnRDWo?mr=(JIzO;}wKYGi}*8Low6#nQ4=%u1?O?ss8bbrlxZROsJE#dtv@0<}|^1kVv*>#>}e+y!Kce@+y-o_DsIbZ#6f8YiwH-%d$>%_`KH8 znxeEkOoOD(2~Lt`yyfmCP33W@bJhD0aoucjkv*@^QLu1dDzoOs!Eg?Z+4 zqh?v)*b+udO+vaVzZEx4cd+*Y&R~n2m%saDa!w~+Hk_!`_R;e;-~jN88o%}^=>X>> z!~1pBY|`iXzOrhw)`q#>fvx`*B;BE55Nwydc`?mf$aN)_B2PICB{u`oh$D!RnxZgk zLV57(lVMucs5fMcMyAoTWafGY`j{FdA)iT%lZ`CpmK@n$&`A<=I(@1j8H2K~!B|m` z3_W*(YV8reGEW%i?;KM{-2MRX~*BF*a@<)s9=LH2f3=ac+u zUi1nIS&Oi4 z_Nj_PV%G439&igN>B%n}sk+}P_?~!Pzql}Qo$kJiqw`N~y>ZM?|M4_cFV{|L)+_OI z3n{FI-ci!eRqs$)heb`385+hy9<(lVQ4RvVC_4d&1B3(LA5|caq;X{hbb>eJwT=>1 zos`KAOL69cr^tml4i_I$h#9#pQ{hw{`?i6-N+{N|@F=hQiV~uA07g({}mQCU_hVMmf z|C3k$SA4Vwj^;~7%{u3tMlGbl-UkiRXFO|UBMi|7YPfMaH2^iSnU!a>Bq#xPpg|F68^I(lsFjAh%NN{( zsKEPO5%+szB@)=VUXtlidix3+5r0iQAQELn>X1_nQoMamIve+W&06O3oy)$2+v`D< z`GhF-hYMBcw>2zqz)1^1;6>LhXR&7jy}mM!p`63fa+{T=OR#Ep@I7btmzt!j^}HXe zZ3|$Vh>0+lFC_2wQR9kz%7-5m_Ad4raM5iw%bG8=B)RT?$iulf5aM4U2rr)ysj7Yw z8Jw)Yh{WNF-t+BkkeRIJO^g-?&`1J)Qkh$9${fA>cI<}rCS6xY3}Yab1-J*}xehJh zW+p~joUpHR_+o14lj(fe$jh5|w#uxpX3r{&hdX}hp;hq6<(ESJ_!z4|(0YNl6+ub& z>E8HTiG|_dd;x<@29Gx{3YNxwIu6OY4P&o>IcZ3S`I~>` zkh7-;OG151Gr7Y+m=t;0yJFid-|VtzVe=!uYct}4p9G{> z>K&k{-l{BEdnw3_T&fM1YY0_d3k?&v!_l#K5jdUWpX(lq)g`w~Woj?2MeO5yG}Jri z&E?1uBoiv69C+)?{p+^O*)TqO<)Pdem^eZo>)PHe2$A;Am>=^JA|JT?T7?o2Z)p=r zFqGa`y{FXa>KMUva(k_x1uuDEXuEctgO@KBPf;e;hbSGZauTxQ;<(mfhdY;RD`*0- zg@h`TtUQ=rUhS|n#}93ts!DcGql+dZ*~5c__Y(}P z+@zbR|7>kjI58QM`Py^vESk8>d#i9Hv*~ybNF5wFt5FfYM~zHmjyPoFdU?;V1k3Be z7$;K<@;(VagXDDM@Y7?joiYmWm>NQq>VgyA?k@8ouwneQok1U761amQ9IJbg-X=Xv zL&Jn(@??D1b4VR{VNk1eEi`&0eg6_og&SG>xI{V-lAbIq_*p=qqJu^2qIe@Iuz@}m z(1nVAGx=74>@$>v@Q%b7ZI{Lc&XaS=*eSTMTGN#Rey*5{(&OZp2};1MofvL6a> z*p#|3<07dEp@bf^^l9>!rnkXRWii_Iz%$`0 zzneHp=2XLudA@?GMgjVU8y!P}JVq>BmBd975iV#3WvJIlsl+43pAy zkNy>?`5#}|>MZ)5(SoFlq`^Fo@iDs;t!qC6uTKBU{>LmwXxy*P@z0mV$VyV@rM<7U z@gBrMd{V>hR*S9>rdJmi+gC+ZHm@Xv{+Qk5O5}o^NQ^ID9#_J4EbNoCwGEYO?=Unu zzG4oxEo!GFfR`iGf_C2p;#Yj1g$eA7eFS|PqT2qI`^EWs%t6l;&$Sz+y7>$ao`#3c zUb)8-sFu~p$z-he`@2mG_Z+qc&RQlOHQf-+3H9dC6$^DLb|yf93}ism2m8Dcb<NVv3Sa8bwAs%{+NXMSU?!p1np^*)tM*WJ(2_J=1D}+%5exb=9Joxv-dgP6iY(3c2CkF%1GPfvP^0UR~uS zjdyB7)!LyhQ%zXf!;?nijc`v1tR6R8PhaS5gs7KHq`^KK)+uYG%~?e%JA3t7kA{kmE1{%V`fnZ#SGsvn0~D zm4(Gte-mekcR#-?$W(4-J#ox#R3K@-yv((6`y>90ZdACBpEEPYtrWyqIw z-YZI~wOLgTOVGb9_mAtOpI-*viyHP#=*ggvtv=LMJHO+d{gUAChJTQ=wL4{AG|LCe ztk&us6m-L%SbrVp4wgip0IxHv`ozcaWc6F-qc6C)mxij`cV6xvzKck9@hnuA9R7g; zUi?-kLW1wbXnZT6yE-fLk=w~^VCFSzBrZP@GTn&vvFM~xtUUr5_7|!ALnsF3SE5e4j<@l5+-HcdM^XcM96t|SDzUs zk-X|?fpdaSCiU~7vD@yMo3yd!KDF9%e2<_jG$n$$%vP6>;>ot z<0)+#u)@r7S6YPePN*N~3<-`pZ%wFFTKvCfjlbJp{%0=_1g8GqzftgC_Cq!a_rqT# Z_jbMs9C!byI0O7MHMBH%q~~$-{{yzv1rq=O From 165e12bea68779dbbe602f6dff4ad216efa7ef2f Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Fri, 26 May 2023 20:01:08 +0400 Subject: [PATCH 085/146] Delete nexus.txt --- 09-ci-03-cicd/image/nexus.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 09-ci-03-cicd/image/nexus.txt diff --git a/09-ci-03-cicd/image/nexus.txt b/09-ci-03-cicd/image/nexus.txt deleted file mode 100644 index 8b1378917..000000000 --- a/09-ci-03-cicd/image/nexus.txt +++ /dev/null @@ -1 +0,0 @@ - From df9fd73c0bd56e6d71a9201ae2e42071e7916e47 Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Fri, 26 May 2023 20:01:26 +0400 Subject: [PATCH 086/146] Delete sonarqube.png --- 09-ci-03-cicd/image/sonarqube.png | Bin 86979 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 09-ci-03-cicd/image/sonarqube.png diff --git a/09-ci-03-cicd/image/sonarqube.png b/09-ci-03-cicd/image/sonarqube.png deleted file mode 100644 index 8360f9a6c638af03fae293c398d42729a0614745..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86979 zcmbrlXHb*R7srbQP!LcMkgg(KiXgp-Nbe;eHAwG8dP@WZM0#)1d+0UPL_n$1OK71> z3lM4ogmU@$e{tX3J9A5Bp2>MOJG*D|>~1#a^F0xo>Ix)8v_yD#cqB@SAGGoC?u*`D zXAcN&OUT7&@NeJlxN9rC$EzBq-@d)MZzH27gNIieOMLn1zYia}DjK-s;gNR#ciriA zDYeAIyD3uoAfxMJx{Doo`hfIPl0lL5pTwR z(aOB>8hb`TIri-%MYMcI?FWnda`>HLEDsdtiymqx?ZA$u-A8t_X47Y9`3LuR(Sw_H zP^cYN0xPd*V`{Ifpal_C9S#8Eu>{LlFE<6Ydnf7bff_DfO|WiR_Vk!SaBOTPHn{BR31 z5xAsvm}|DM`!-p zAlh=n?$RDJ!568d+}u6<*hgzY0~F3ukm`S(YPw076cMo7u0RTR$0nK_vRr`ht9)Yn zuf1FcPcor5qD>b$(AH14bg?$NxPQ&ameS_(+clwdoR#9JA8Zr<0lh zN~Rf2KH0UWmj_OtD{{mqtZwHZ9$xy^C@kdaC>7qomK`u|WpcSGedC6xynSNwe1v$D zWV-rgcvn8{mU9Bi;E5) zeKOQ5<;rSnPe|}tRWr!z_ZDy_J7>v;dO?uonZEF8TR_y6dF&0~Fkte{Rdo#;Xi@SR zdosecV5oI7piQzn^~44$WyO}F+E8B&dihKTXUhbhX?gXGKl5gF)@#qA^PM0&jYp)U zuX%);6w2Pe>p~y3`5rx#gXP3U9YdI8PmcZH9rrn0PrVX%z`*h>`pWNBJ9J?U7cXaE z`l-$CkI&mB&W)RQ%mu32$jz-*&}nWmL)gVRbZ_1W zZQ2nmis#6st1lCMNJF1B+|onB6(SoQ&-rtuyiQk`^82vpyf?VkU>XT>Q{nEX9Shw~ zB%7tY3i&ko?G#fP=n6awbZb((u8Z(w@{n6U5~nVGd{~$@V_%G<7VlBAW|MHxn4a{9 z(=N_)o~7*H%z9xWfwNWjn99b*R0y&h2^-Q}5=W%U^$1H7w1dw36D!Pmm{dmk*CoUc z`%89_}}x{AB7~2T1O2Y9JjqKiX;XNaFivSJtjoRe%CP zW^yViGo=2E+6r(Z$eIKq8bRc#V*W+;PP9L|15wq1F{GY}>*{*nww|C;mooLnALHo1 zQ&wVrC*~A|XuD2F!(Aq9{yf+im{iUb2`D9DFq}h5bEWC(q^Q?DkyV%}Eb4R>O;LwQ z%^+~xp9O)$A4XO@DX0m$-+4LS^r-N>d$UoiT5VuYAQR*C+87`gL?ZdAXafRKZJaL- zuwrT3)d`B+{-Cpm$+K}MR zEmMN+XK#$xC56VU1CcWriBfyQIH+~w5ZQjxrleP6mix5eRK~-2hO6E0GDs7Q(iy$O z4LY-S(Q7ZK2oISwzn5QM&KoH^OT@O{)G2kQaw!VFghUA4;3O;NbLXzbbbpCr3a;SL z-yPb{3&U)@%xBaniZ&TCNg`m*dVMztH?8<3hGIn0UA>?7>yXjzhn0oHc zy&V^k&lTU?%>!j_Ld)S9#p=g)k|2f^-!7DX$)^#G<3R`Uom7u`s%Vv{&kl^-6dPDB zxB2{2yYvI0aV>)0VUyO$;2!w`@Aj+1F!X1Xb3qSF40cc=z@Rku?|u!zv6K!*y?!6m zQ{1~BoNXa&5)dcY$WVzZDjNLd1pV%<%JtfVerI*Ry(qmnc#vYHttQ@=0=>#6O&H`c zkCf*ZE%q5}OD>Da+b~6drd?u-n^rpdt%&z^isybbil-1f9H7^k6|dTtxR0yk*$-r5 zyKG^{ElwYXr+Sv110=`{d)HzYRxqOb?$mzLp}lQR*ENyJZ_&>12R*62S%Zq$R{2=b zrbY9shajPa95S&X4Dx(F%O|-vhC-&sPP%#<#qn)5~BllL0oz} z^ydavc8BrqA)(jSIXnxFZC+gdrd>FXW78!48i)Kdj)`6o1uY*!uFq3+yW?&rikun zw>rZ|+xo>y22pY)r$5l)P#JLL=$tyE=$x}eIw8$-f4u-`7weTvE`y{lO@@xsRRu|B zk`phN3~693C(AIRlNj+^Cr;*xO|;IsKCtP69JJccX6%}4Q4-^97>?OP1{lU}jEM{} zXDF-*j;yk%m~;3@r7dsXOckZJ9%e6L=3P4e&P^Shl3z8+4YJNzAxuJGrSr~hLsuO~ z16)Y41`-onALx>AIIg@^WAjH~jFFUtWIVq}($LuL@3gsw{^6dxrM`4q9hiDB^G3<| zjw?cFsky-?2UbOVI<9-8BvgG|X2%1`#}@-~Z&V!q_WH@I%qwNm`8+A3vSHWOGkq(| z6OeV_BxAeiN_lSx2Nv{tL)~&fKiSdXHxgLym`Wi_4dEzB<~V z3pHvBQx{Ml)!N^Wx3I-^kKgTW3N-01o=X7uHp$NObh`Qu*NVr^it05gOvz=?`lhUxZ>y;XpP?LG16T5#4Uo0}PE3Hgoh@S4m}_midZzdDve;N@8s7+-!))YcdV# zh!HJO2xIQOxnlI1vV0~hM$;6F(V|2;b@hMyC?H{R6x*CcChR^FmUCIzzoY(Ft z4TgsOJeZIhBt<5yyOa8thC;`9fkMFI7kJA?b>!9Q-lgyH0#NBuly$qK#H?6TJ^!8PONwgf7 zmGXm%Q2m%T9TS8x;d7P%8VbDH|CIVd%NowS2tJT#JL^n+ zKjry;3aI_M+-hLoVs?kKe=|~fVTpx~N+BhdUVq)eZ~96`NTJJ@rTd;Z>;mE>njhZi zI5A~q3%f+;n+-IjCO;3qNzj@6$lc6MV=!t`*m(<1Y!c(R^xC@rQUQniu))XVLsW{`@SM7U8w$}$@PX!T84K5cen(){{ zUemgns)Byw0_lU1J+Zpv)+=?`7bsEFfY zKqdo(qHJW1XFl)=ov`O5m=j3yG6XT@CC$q2D5rB!KFw~gRt7@=3|`fae0GI(RV(=F zj*@{%RRr#>j@a~9RaO{u6O08F2IHx$3w{TM6#yu@m*xd=G*Pf#l_hbVH4ycyYv_ws zxYe&Z)BHOF0s<<)>GwJB|FgEpaz?y4}Q zLByQ;_3w9F0n!gXd}yuPQ~uLHC?5sA{3PR<@(EuE)J#V3fd~tJs75C`N@RU0z>~)3 zu4F@3W=E9qr+q059_P{>40$6femN9Ic;`!dyLo1Fg}eEIgxh-q{z2wvn(Q)*!}|AR78=QwWsEQvt5#C#yN~ zu{Iu-(l2po6$~+F=Pz*$>~Dby?ylX-S?GB; z1%<&YhvAkkFAyA~YtXM8XR+~T%g7YpUoMGEYTZnjo@ZV9X2E^G8Ws>pl*KR5b?q@C z>3nf^XhpZI3(1U<5x2Vx=Y!J)xF|7#X!$+<4gHD~&enEQe67|Gpl#f@5Eymb{ zpEgY48_Mk)@2v9pm59=(m9>a>w>C!${n?2vdRrupY&iNbB9pi%9m|lIEffb0T<@5d z_HzTCd+MtPbQg@ZMJbhgTPou7A?L=cL4SPv-IdYVX(9j(prtlDehLn3$<5Jo=WzM3o+HuP4 zDn~kDuO@tZPKd^e97U^-_}ywsI+ALiJ}|DMn^cyETKYibc=npq%G2`I&8xQSAlpxV z>l~p?j$KTv0)*D;_37s&Gj`W2u96`0dq+02Z-pfd)z-|Vo%-)`k@|Ib5$@YaH62|0 zPyF#ajczO$JI+_IpkZcV!52D6GE)ZmbA7`kbAhtruS5mw1O#51&#+8I<>mT z*-jtJ{A4+zMe<#2)>>(jse$Jgx7=e+B^x5>9P4H2#NXbiWMW3<4spr1`z+CwRNH%C zA?FrblToefC%dGvl2NORB2;;|EyzmyOf~j{lutt0FFYmAl|X7H7HVLlToB_D2YbF* zBw1MD>fDCNS$L0* zow9eU-S&r(AjZ6{SQQhy)4OH6t>v-}_MyRi$=oN+T@j3bY5WYoiuY*ts1J2i>6lOk zyPn>od}lld>SCBU`kM10|BCU_Z`DfY_ZcTw3DbE9kv^b5Nh%g*W&}uYui|`uacB_u zUSl*{8JieT95Qbux>j=O56j9SAGRemGX&%0Z@6}AhEW!s zeaAN!c6=|Ax3FI3n&Lkw_1tqhZS|DW1GSPfKhASlf$5Ajo#@Kua3Y2zli=Q*tF`dm ziJ^4qVqi}FDa&4PuCOM|646Q|RB8`(J}6W6T0QlIpf(0}kZn+0d2er6z2GIYRguC- z_P&c;i#?}Ijm7lUm}7L2T)es0A+eA|-^nwv6WYwjG>w*8Cl?aN+-t&XFhz4m7@b!s=i!PjFnt4dS3f_E(wWRcfi(eA?`&lO%PT<+;1=Dk$a9O-Gp88Pc9!bUX z`D&H!C3(*K)EyP!_8(`hUx^CYeU=3j#t%`7dRD*Ckz{(M`(_`_!}@~=8K0fVonL7^ zmfZ{dMh5%Z=F0afnLyl{maU3oED|&RcGG?LS9YZ~)j(1h6XG*yeN`eLRg?O31wvEx z3HCIdC}P4GuP9?*IhA+rz{pNU+R*l!bwgn$)l&i$Wu01+Jgy|eD)+}c9w-qNx?&ah zKJA;o82-@gqZkf#SK+n>P{2uAfIpt#RjWFK;Pl>zQbD!HyzT{d)Bk$GYV<8`=X88o zdo(3PgV-A&d9^yeSwYm70Rx}GKzacp{eMvM1A^zQ@i z!c2c8FGs^toxzSN$sQa|HmmVU^+=?*Ac3Kw8go6?*%MY(HK1$>KbcHAs#AJutNB7~ z!8v|QApdnbAAsw4FREF{eOyofVK8^CYQ%Vtu%K~4PN(jaSMa;!n|2n0fTyqKs354o z-Frej-=-H%tyx#vUpe>_K2Z6?LxnGxB>96gL?jWl@qHBY^p|E&SY35alrdHO`XhmGtQzn$v)-n-f%_Ew4lT-20Yp3UD-EB%{E)$WAuYa;k$gO z+7o=7djjN5U!c9~$xu<->}<8P8B~>buj&#(IbF2Q)R=!~yyCuSl3m^|2|(vCo#f)K z?h9aOpqAOY<5Ij`=0E+AqQU}CTcZerm;JW$MBhtIVq9}&2kj;8zv(`Gf|ViG0-N7A zUh6VoD#`ZBh|F-H8BiZ)Kg7Ae+3-#Aj!M}E=wjqps`2+y3RMclNGI=wGn3y}OHowS3)mh3(=&E-+A0Ty zRRSgU!qfH9Av!$+Y*LW^rf5E@cp#Ffpa?(1)?Wa|Ii_=^KTDXW*icPZjonNfF}4-I zw$a=0Hl|pd*V1S%QDqm;*Om#7`UTHfU2>pIzV-~fgh;o^(-uqwk6@-^+w2UU_-b%Y za5PEBqiHpI>BL9=f*84OT3f$_K{i8kcJs{Q7KMS}3@xDuhg93orpAKLv0_N-fdnOy zuzmE+#D1Wiv3F@l=r6iolqf| zDOGaB3P095HUQe}KEG#yolCYZOM=FnjTnqKd4GwsH0Ww&Jr$lw;NY!q=GWab66Ow^ zqQn>Wn9%GbTRJEWX8OA`hM>&ucKXOJZoYb4uUxKs|5#$Py!t+g`Nhs_dld^AP4|r} z>TA>DR^^W)_i#M`7B>>tm^4R}&@btgvX`rf^cr;f1AvAb4mjHDm)hg=-f%uBuwY6j zzg~gKs(goQFY`nB;}3G1kpRI6*I6DJK8`8Tk8r8a(d3C|BD1#3g_p0%*Ix>XTmVX# z9pPV}!)Tv(Y%K&Ej^Wvvg2H)N#07^WlKCkjJa0~{%Gu&e^VBIZQ`z!oWo#K$f5-x9 zxbRl!*Z|9&yvK8>>fb#a{FQhSC4U3V-cKZ_=Y7I|oy4;f3axYs!;T3LuS3x#4h#ds zB4=^3#`p5)$ed(5$pzm*cux-wBbxR?=t0@P0+p;%b4*+!Z%$oLIJi86cj|AtFqfCG z*TTkxmc36De%NK+9DC>y`TV`zX@Cvq8go6~S~OR?70h&VI@LF9&#DXt2t+>50?*X% zYchKvX<$4U#8f_N?BKKt-cT}rhpdpXczP{i85_U zyJR^t&^XY0p5^OkHysCM=WXMGf)TG{==0^B03GiDCw;4U zniC!&YBYlbQke9f{HV=eCB%C2fMEJQRZl`u<$5m7r6=p9;g_-RJum+OkCs~ifdQz* zG3zC>!IX)1goEk-D}Vex?p|rzj!_&l*X>jOSF_aa{{>unXNVH6BD=twWJwS360W=! z+bZ|{kMR7X9(G8HBkQ{i?-&Y3Dx})}rXQsC&%YYYbF!bG;^u|RrY2-%2$2%}uh$(` z{{L4<>;C`z$9vB9c>SN-c%m=i<0x`@d))=>Hd9`%XPX_TOOa ztI@*Tb(Ib&1hRPJcB3zsnj9wIJiGhl;$QQn0z%bkD@4xo3Bj-D{g}R}ZgtGns8yRi zz}q2&l>g7~{}bH(&q;#=WO1bokfY~~y1h9)-lTp*|7|}zQFAk_;Y4ZTZ|yaUnP#ZE z&@yxDc$!S{{aR#yvL)wPRns0nnu;os{^%^5jhno}$IE2}{H^j@txK=qqMz)0`!n9L zW2$9IJF_W%+pFAv){-A7?-{GYN;m(!k04h_OSGYQFyCNgUBq{HH{n?GglPkW%R9D7Lv7hL6ZH?}!BRS=1b zk!=b+KDU9bJhDIhD8Y*Ni0MzLmnQYLykErr5Q=ydTn+NV8zLy!ra$H~mrntbejlFw z`MdAZIy|CttT$IL98=>hw2hO*mS%ik{3w07LS_Or|4k&!Ge6ffGltoo{MAv+r5^xP zxJxhKq>Enk0-q27r`dB$j``2fz!~&)<2O!8yg0dtJEZt;i8L6t#ZCuPrsSH=R`Q$| zcXYKcUFf8?i2Oa>63tZqIxQTfOCBZe80h;RSxcJ3VHg&!YuGA6o+)PANm$L0>QQoa z{xMs<&!w6Y7FuYTe6_cc>KMDE>VY(c!i~x-AUsP$ejF&AW@i*-@}0|JcAq?F1>vV8 zu1O!nkP)*=%rBeBuDuR&lGGW*XDYmH2xPU;aN(ioY9cwEfsbPSRZK#YVWiPs2sPtp zs&VOa_Y>mWWO_f%>BMk_Q^e!YSrR)-44PjV$5LL`Iv%<^;))1&>;bZYR5X0`0 zE!~_$hU9VxDW#|ae#wVeq_-F$HW}s&Aag#g3Gs7guP4nE<^Jr5taK3(C{6G)J+U>W zDZI9IVvAMntC}MqzejJXMj%#4wf?}y)^Z&1I@6*^5;wT$HT!jT-vzxmR)yfriH-%Um3aNW95^Fnc!LPy2M-pt@G(( zhN*{MHhTn|L`tz9SxvPeSd^G6BTnSU=#-_OBaGdnQ2|upC7|fG&20aLfQvU{{DM=D zqw1)wd68Rl+oiU-vYXzq(h}5u9q0y)>45d&OeUTyNEA%^vPB&`CqDw;U^3T`yI_Rz zoy>)9lE6vh58=Ck;gYy;No0d6yOG7l_r}h+Sq3%_kE{~2a0mtu57G;bTv9TSW1+zp zYfx3wOzGr8$X8i_$oIO^9}GAjtbvdFJcQ9;h08xub%!R1KW)(78Bu2W*9r)AJf`3|&M#ROQ(ueueE zyAG23ukIoT{-iqJT)uVk-+@eZ&iI`7GFcU9IPYH^9~sU*>7bpXtCx-*EIe~QCdW;% z@Xku7$T>K_4%}}1*c3W)f6PnAD)j77teO^#HF8)uXw=Y%9hyJxq;y8EsK#KKvMgog z;a1c@{uj=H&agfyq-+1#j1L?ff#dTq-xidkv@L+mDfbYCz=wo4=J(Ihb8o@OryPZ# zx$=_J*{T!Ci|dfo*{?C(!FP}U{lWC-NdtFFg*bHv<5$6L`^k;Q{ysu2wA5eiCM3ST z=B#ZbX?C-;%aedtGo%3>Cl-nK6L<~Ge&e@&#BFI3j90rH=KD_X|GdfvjQgK7GWymp zyxGX{2`pV+m?PaavK?H+^^u%zjde2=To zrc+DBjjgRVbH0}(+jS7KFg&4c?%HH847A~5&vsD>?)(#MwEcU}=v@#wic(aH`X zihz@HJy{aNVR)ZI$>F}l?;+|OH*G)0wGrPlG4QWZ-0ldtrD3{%7+qM|)anHdJ(-=>nTo6Gtx`J7SUE-h--{dWXWUavULRX&qj5KS%e@!f6wAE;T0jGO9K7p?lcXUc3_nqPEpW>I$=|o_X6hCtXm<(zJ4R!+bM?) z=7B>TovIYbguca<*ddlq3Fg3jsi3kxaf;OLt&(~TZnpM9u&^AG@JD?wk z8pka0hujx>2=spFo6|J~*r-JQAw_AK3-oqaK^wRK*1eZ%?kLG>teMGDK*LS)CqRL& zCw6Q%9}haNyeIK+%k5zpJ)!i5{JU-<}gT+--b|UrvcwnPm2U2v&a;=fkg&N*N-&5SugcR ze)G;8)AqJpOd@8X*)tvQKlp{O2=JqtazO zA*b~;T7rd_M`vT+#ppwQl(Wd#kxs=@794-V(XS@XKiZGMQIZb*m|^9^$l7#b!K?z| z-{cet6V3G?b2<_JPaRKIj!%1~;v03B{fpc2!u2VFVk!tk>(n|UK8mSdD|tB^=b9Bq zGl))IL^n%4Et9-Gtu2le#{|6M7fe@takdhU^h48>3Z=Z##)I+DzB`QH6cM;_hQb1C zkbE2u5)@-2_pbY35+|B(`HmLXn0JT122O##GWbm5r(iL3wZi3?8@NXLsq}td6s_KAMMdpNy%fQ*7xmol%`j^bi&43M#J#uKHNq|sV1iv zOcXzkho_6GQErB0?Y-7l<2k$d7{L2Sy>K2shHHr{@1km>nLlEBkLF%bFnt_HDn&A~&=OD)GKRaDFng&reeFX@Xeg|1SiO} z8}@um^`|_^Q6;jf(iogpN2X5e=AWJ`pP#V5InTrh?`tKL8=F2ak@vrgiruHlN?Dp9 z-G1uC{JeVEmhSxHcB{A-k3ZPkVj^X_a-^(DFSOtr*&;4-&+lhYm9*+Swl_i5w^wWI zYQD-RsB-7+0*L%PaJn@XcgTAiui=O^-y*EstCk&TdNQ47Mo1?f*fN-uwghR+0-t=h zHQP*#b=(DYEWl1B(69V&^0(^LnwB~-oQ}H}9rxyY$(R9dW*A0CvBa{D7IlFd&M5 zJ|cyya42Bb+R4@MQ(=RfMQSjaD>MxrT!?;NMEmFcBDj{&){J?iw?!Ws{9@-Hv(;TD zWwp6oe!zwS<<~w>TlTYOTU<_hsxD-w^!&1q5}Q@Y@lz5~qRIIU^7CcN_e%(HOfA_= zj|b*BI5=uxgz_PedD>ouCLMDdn8}@&-2WRo?R8WZpZ)bwvSkCz_8r?1jo4vQ^OsPA zphhfVn)wyl#nFL5oSP)ZqNqc-vUJzsv96XF_k+6T<7boFkpxv2_l3tpPI-9hZgmT6 zqQD)FCFWR()w}fej4!0&m!YJh>yI5Kild1=w(N4JD%A-^Nzuka{8SX@UnBsZUDJbY zQBu8f-%H}jly{?_QgJ^{HE;m|#U*Y7SCU1$(9VI-9669xTM~@so|Nt3k{t0Z+jq;F ziwy|@l_&tkxzJAj=ULAwSbkrZXpenMTl_Y#tSPS`vK-HCU$VA^oNEqKOl~Y#sn8Nq zugK^JIt}f^7#>+Ueh_e1Cn_$1d@n=@x)^Q;bc8_Ea=6)to(|~NK}2a&cj?&=?%=1lONcgCAiM>PV5v0n zsbZ7OTwYUS&xFhy@~CLUbuMiB5-4B-NVc2c{cJ!&^qRfC@HEQ=S+~N;Z7LU2kdK4f z%2bplKEW69ixFzufrKOw;1iMAI|Zij)}mjAmi7ao^&KyzyIVQxt?jx$9+8N?u9R(>&cBr? zZ<$WFwEqeIry=^Glf^F|uIAv&OtO=G_+18P{yYh&-$y7vCpSOK-gK-#)-a$82G)^KGbirpFpJJ zpC`*04^GullC_R@F@9RU`WY+8QTO7=f6m$I+Nru711X2BhTM;aE)5R* z9;rZg)!Brp5!8`Wp3$va!}}ra5c33>O2Pm}h~nd!|42mBY*qs7*ir z+%ejq666Fo54y7Hu@>LYE#5!%+qpK!U7swTbWF zWM|b0>oLM!R&dFO`G>9~4qLm0E3rkj>e$FFS9joNxUIX zrmErBbA}CykGzVAFA9s>_A^t}NQnx`ns@Hi?`w>KzTV~QUhswtaavwJtP>| ztP?N3VoSM-w*w^e;fp1)7WRGQlu9mTy-V+B|BW^&@Hi3e_{Ywl(4rn4jW2bzhvvD* z%z5~xcFdkfDa26nq7_fE;`{ixEps7<4sIZRcUy)S9tk(hNfBVM4pPHjm|II_I-xB!4>n)NkmM&lA#cuWkoZ-0Nx9 za9S=kM@J866QDI}r0^AMhK5N)XZ)*Krm>T&agS^5v9~^gu&sS6I0DhA^VoUmJwT6V z7deP8{`4d+0X<0d$K1&vsVv6KiqT)k7*K z%;t7w&b>$zcFA`50MO7^La+u=P@gCbHMTwB`bO$b5(|kA{FA;Wc8X);v@+T!5Pj+LJ>+F1sKP? zGt{y~`ZoYIL*aaKu@hQf3fg@kgWPPFKLHwLExjU*O#(d4&wb3*T~Jb|W(X_yAg_=_1ZyHlW9ivlzWqV|u@b!tjom5)! zdGG#RJV=#Hkwn>BjI&BTAx zTHM7ofIt*19O`&1mpM>Y+8MLEn{T z76~0)bl~$GdJHyj?#!3CnsVX=Tc70!>*^aE2{Z1pO5&~5NT?d+iB$OB7i>VE+ zKb!-r#`;LXk=E*8Aw|t4;IHLcrIAk`{he8hsmJWix5+C^ZTonvy)nJWjU}!s^lw!r zUnwbX?)tpGbhh08Y)ri~=&L=$in}g;S%^{kcdAkrSlnWF7?N)^g#agR>=gN`lJ;pj zT0gX?xBOA&E1B|aY9yu8$BCf=d5Ln+?i+g>w^CYxDJf$Lry7BoaF1#mrT#l9H&a=i zhrgk|^vdC28r8(bZvJqOK~;13o-?#2J>^x_wyF5;fraI3sP+fYNRF-h_#Zc?u0qJR z-V}6im{=v=1cdp=--@`?cLjt!*udYozdh9}7?eX41UpycDdWq8eJB_Iy4mu372&@y z7*5bVwhdLEm;k)ju#Ko-#uSoT-MO!^^MDLqshT(glWPfN6rBPjAIz7tcNhc$o_4h8 z@+yxBbhJDLWJ~%t`A1cNTD^menoevwxoKI3 z*J96hTVw7r>?BR$RVZd`n%b+d#aPWNRps*CmvU{t)e9 zDjeYRI zj

_D=;#7L&5R`Ut}Ai!*L^ib7B9*%tGr;1k-0sZY~pd7hUy!M%>g{+ys=Is(tSL zC9G(ee!CFy!nUFdTQ&SFIDWqHv#?v(Sx!F!E$$R!ge`Y9Fs>xgN5A6O8=-k-VRwDS zgfGfDCGLyhJr{raZOgTD>!W;lFs28I0gvl7@7(EZk1i= zz}HB7woAga{8*YNAZP~%us#Tivv)&xVCN22y7#(>dH*PXkrfsOI(10jA>--$@&~jzjK?y_guD5CIsbCUGtRjgezqFfsoB8YCrcW!sH;z- zOZM}Cbl=}~n(^zcL_q$-{9RwpX9?UPYxiiT#;9)7K3l5VpDO?aIQb2vOyZc`eEB5? zR)1J3)E#HA-ll+xM*hdHO9c|}MeSQhjb~M34nVB??hw0lo;84#F>BW#pg}qvQo#$5 zR(|pyCDtmrMdOopWkgWUv+1v@P>RKoUxDg^+!I#q12M!*vJlWiUj4CaOGq6|_X_XJ z#lO_kKBa9USVSn+GU&VIT7uGodhsBjL=`JN1)KVCU}p3q_2T(q`{(RClivSH2;Ox( z=DB2{T1=$e;4=ED(PZ2jY-2@K6ftPodXp^4T4ui@>NXEB0g6SScw9c(Pc(awZ)!+X z1AL?JJg5Fg^-sH+USAf?ds$%|jObN7T?8_F%N;%g zO}s>;z5H@i7PPQO>-p&R$Oig9Gh?R!|G4`9!(`e2&%%H@+Vz#lqO<{7`y0SjUq3i1?Fs> zPNFh)uPU%Drq~NmjP~K?Fjxw5l$Gn=Q3=;M5!3%$pVGgnw5d8@x{ZE<_ijk(GVsL2 zs+!Gy70O(DS)h){1tg>3{%tp_cMzdCf$ao?R=*C03taEuAKZl2O@k+$5Wc&W^Yo>a zbKpfL$sF6>d`F_qeT(sl05QhB#28N_9O6$)qcyO-0$VKb^R zli?HUfPij=qg`ZpI|3#~632f8YM1&_P5t^8Z}S_S^s*JPnFUKuS0I$PL_6GjDbQOU z?iPVsOhI@ER=Q^v-$v=cfXnl)HOFCKSc~&?>5cnZRp1eP-$kvw>RrU$hhQ*D$J^26 zdc`JXsm^a0Ab0jWA(*ZaaGQvyA$4BJ;IkaWbFs76imKXwZwl0HEv334&w$@{C zJED*`rFIU}6>i{LCIQ6ipO}u~*4ARBNqa1r(4o5%p^Ej^L#w8UQ`B?|yq5{wj*HZ8 zwe`i!+L-**Kx?3Hb5@%|iK*vG>TL)uc4DB5euE|p96u{9%KwDUvZNZXwtAc}3=4qt0Xj5$0GogA#KggBqiijUu?gD)h);ni2?4|4?Y-tCXNyg&2PSi)UIkJj8coxqtR;9T1vpd1P_FQNVd#Mr*XFqkOzB z6r8i5QdloX5I3FaVzo{~I}^IZ4hi==qx60akD^c9&?-5-Sk`L28VjJMHnkDDokuI^ z1*qff_!Y@9)3sbARSWSaeA&z2r9_<>dNZ&N+)s`*StiFEnB+z$Au@p9b4Qm>!lwq8 zur*N$%u_NWwiBuyigaM71%WZs#cSjdkx^3!mQ-q#4Kh^Jc zfSvcKX>2BHNV)a;PN)gbl8Wyy_w2PGvYmacsEmaJn(0XOYe#X4vk(3c?%q2Z&Zuu2 z6$uhGMehlbgeZ~d45B7_7@|w`GJ1(JBm@yHN{EOaZS*$EFbF}2-e)ioL>Z$SWen$* z=XuNbz2`jZd%yLqb-q(7@$IhU#dpPZ_^~eE-q=)OGGB~f zm~CCJ?khE|cNMq$$&8lSFh&(V}eo6$mW+xtmrM<=<%7-#a6%fdwOQ}T* zin#x#&E~p%w=`D=PemCXe6o%G;?TOExjmAx>@wtBK55bJGVA#C=fqREJmq4zJkxv( zV~h5&))sciIf+?eax(^LTH6e3-v@$wXmAGrq0Ay7@yQCN+B40KY3GY&LwL+%<;)4Z z2-;E47pvt-w}Z;^wTZok)MtNq?Z6HpLd{!`1EqG*>lN4PGAj*Q`vLAs1)=kXP7I;| z{UUP3r?e2;$>BHi0KSPTm=G*3r}1_jF%OIgukh-aZF_SuObTWs4l8+EoK5U;<}w*9 zC##AH6OJ~T)|e!Yo%$Zd&s0)w%1ha}rQXb4<2I5z%@VzE#j@vMSB`)fT`ve}W=Piw z$NvUn&Gwmn*3Jl~S<@{E`wVa=J8NMnsl1pEgQ-EdlwomNOkvIJ^=Z{nJ{sIKCUb2f zkBC_8v=DO7UK7xFV@I0^N<~DQza|xqm&I%Xoc}#v+Whfl#0umWV#zh z{>+lc3`j0eACTpQCLq0otme-lYEoW*IzexbNw@l(In6Z*Ma7h~tlB5PpVSYS`%Zs{ zSQ?f-p9i%amk29_*jMwdP(8IQm!>$*#WS58-%6MC$i+@dYVBIC7av9wlxU?oY3?ve z^VbaYjvVjX!Zw1jBo85PI?hyl^fLcUm193l#LQ7_&VPOV&bnq3U)?eY3$`7gGv$WTH zW4^4PrPLA}z;WYZCh*wAj{0w9S&}Jtc~v3>k0aeOl5~ZzUK1}vQG94yD>w`q zSN_0C@`2-6Yr-u}*rsHt0+YD48FE;EdlXygJxLnXTCwIW_~D0Gg$ z5)dOzrb{1FbeBv#NW|tKbj3OSXY|A6t~eg!kL+YT0qdVPkMoachy9ho7LR7RcIhZJ z>htznyl0K8pof;j{0H^2Y3uRwekdgV4qNs0#Vx(gRSrS6Z+H8q2ude*8$_Ah0tc;u5G5AJuX2EpYN1y%jD^=!rCh7 zb(Sc3u1iDy&uonSM2N^p{gG$GN0YP8MCQY#WRGksZNT(#7!(aNwNm2V^ARRN zg9m3Rnd|b}eNR3(n()qgS-dfBWJ!|}L(cA9Z>cCMKWq8OKpAr6ayTh5e(?ElbJ%8@ z^T!+&(sGplSk8puczq>K_f=p(Mv!iA>&7Yc%RTd;wOa<5?@e0hUy-5C}*()$X0C+fv=hZ zX?}jt{fEB7)0mbr`E3~4^w;e7_&erTzgE|7xYs2{Jw#qE_=?|;Q1_S7An5BEUjeY6 z+3H2DNsKAX=KD-}fFtL*YGPu@RJk_E^!SiUi|bK{pF{$s9>1oe-0_Y&_0vZVL)lLjJvlqs(UzdX3=WLk0 zy%-J}RbSSSpNnFlEgl=gvj35vY|{U=$@^*viUe~{_-}2Rf*)L=vL`!=CTFk{$b|=q zUoWwK1sclpN))=9xZd)M&_^%>OF-+LErY)~r9|D}XA-8p0-0^9x|5`4_L2;zpv|c$W<}6^Jy*TqFn@H&aA#}kZN{K!@S{rD>D&@FPJqNuh07H&wpdGsO1!^OoEBz(Unr_8(H}0 z6R?w9DXtkN7W=5KcrG^xs@7w4{~*I}uDA;En)1@yunUx=E77`sB2XozT$!fcN5iQ# z(hL#ME%or*G|}?)F!{UE+GT3pWj^^P_CESK%Hhh8$x-A=-4@v|U^RrZ53TnI<-57N z3;NSy6?0x6=c%3roUK5!p|H|U;{LLHRrZo4o#iXM{L}d!1Red_Cm&j$%#*-#Pt%LV zFsZ`pQ^+P1fJ8i@$_LhFpA&D)L7DvOvvAOMwpYGafmh*Rv_(jn(x^}Hvtq$4nidOK z;#V2zdG7Z@;@-nK_sIcYbeQ5X{iU7d@m8jjMorm`odGYOkwCHOKwZKw%T)K)!%6)# z-&F^x@$?D%he^>2Ar^c7j4kpcB>PGQlfdClcCz`dbt177yJu5NLkx~Yx9&`eBA;r( zL(*>?m}AHB%D8DqQ{d^kac?MRM-P6H9rXO_xr-@;V5;@LKxrwb5*}0+JzwJa>T|_X zoJ@nSxbnEj*rx*2Z`~n9F!-GKcr{m5dEB;-F3>v`Off8e1IgPrCU*@Hh69T#y)U3p;P_dmqnrns#z zSteFyr-x_uxHs?MT?*o^=iEvBdyBIzOfMiW&}lvFoIR-_51T*orlv%#n7tc$2=?jX zs)30fIZC^IHtKt8X>^4vopJ^6@gnn&%>se56Z7Y7!P#NV!vyhNnwgUnx=RxWiVpJ%t8Kyppb!-*e4e6CNxw8Y!$hc%I#c8e>7tQ^P$$pQKXri(QyqeSsLzF}ann?v}w_)F2E!mOxkp~EDs&{j) z9+A`9Yp2V`{keRN&55FuLT}H2UTnbFd~Bo$z3Cn4ZqMs^HkrE)w5dj7Ks8eU(?vO>5nM5WIHVZ+4NL}?X=u+e(erYKB>F_ z2$2;VV-s`n+&ymsboLp>gxj_b=CfQ$vIF{2QO8 z-PZHx(fWc_Wx$uC_0VkLdReIIayH%Hk;lY=W9sj3Bx8^MpLioA|Ct^0ze{fU-%f}9 zR~fqh{!n91Y!a@ubLEff70xmAh#)XG-guW4+dm58=#}jCSAJ#I=r5@{Gmtd?P(;I-63$^7P>r{v-`m% z00wE$d$@EF(pf%_qmE7;O8(_nMD^T4e7ATSsBZOiX{s-)1keSPzw;qTyxcvEv2 z^n5Sr@;fWinyJ`&xQohT&4cIe_X%dM=LOX(s4Ex zAw(b32KStFOYGRG!^|ng`ew>#W!&v%?bdP|LJ@Qb=>Wo|JG8J)ASE0}I%5UmDIoz| z4#p6_Ntv53& zkjK45E$<0q`^JOf&CKBA)duS99i$Hbai$jEc1;O1z-sTJ2Zm-9ufOXU48@<=OL+L7 z?+063AkXzUlyWMJf-cUywqz(^Kx%o4f-C4(0r)NDEs#jgQjJGWh1F|H4wMA$Y^+${ zTv5H94j1@oqX@J=rZ4WYQu$or8->s}MatqRC=@bQ&{H$Db=No_XSNC z(_@5xvb(ok5c>6tYG>LV$Sop>G6yqWxCv7?AHdL3Uq5<0Qf}@?)5U9)MA#s%jaYuq zA4x4N!0RajoN7J}dGio(toj9-kjz%%hRlJ{=yj@s9%zQNuRB>ti~M+Ts~ZN{KK9dK zk(jv}D1PI3VAL-fc~Ri8F?;J#zuT+Ub9qUYUK5{>p`oEu8Gbr`f57=l;YpfQwEVA& zxINu5VdgK4+R4aRsulg7P|&ik9M^G>$%$SoZ{;eNu^fj^R$nBiepe<@H4yv>55_W) zIT$RTSZf_e z`97IEZI9Yoe!yPTvq-c^IB?;Q$}%T2bOp#j4Vp3Dgkow*+iy{pMk=AH!2K#fKLXx} zs8lkZqu`NOe!9_HN^bslMGCp3p_EemA~x6oyH+49!q;XP6wgN$FC$y%Fvtj_^P8Oy zAVxu`-Z~PW+8=~JWQfTO+IcdWrLFY^lcN;bm62`$p=#j2C-a@6%R3Hi`&~kL4V=G5 zvc}gU&oHIihV7TYcyEqR$kfvoq>R|Nh1iXSmwdK44j$Z-OMid1e(ZC%A)Wb?MtxT9 zCPSU$*Vk1=86ON3wa<6Jc~G)KYRUAc3C-Vhu{c7SXl}q@;QgS&N>REg+lY;29+BHb zD1K3wR#jHSs$I>kJq1VkF$@?qj5zCBbZLU|!}d!yz4bS8L(L@>l8Y*#FNT;tW@Wh{ zHmWs5=$EqKp~q@0%mHpNflUIBo(g93$6O7v*SsLe@SW)6THO0*y87)}VhSd6e&>wJ z*Y|D%biH9=ry>Uac&+3?Res$A@94bj+HFS+RYxHzH(I-jUBB>MNlZyTv3q zO9sDm+m*;D@>2rm>38#U#92?Ig9<~RiigMRphqnkvb|*kH|p%e@p23q4@0`8W<4BR zP~{UP_>13`AAEeDiLt2-?#B+k34M;DYbm$*Elc^{ffI6vg-j>81&|30u_={~oov`@ z(mPve$vMz(QZRmL%Ct824pOjr;JsXW4XgVy};pn>2%J^}=kBP#S1v2e>B@ zS4ihn1ba_fe5`3(P4jm{{H@{tbq_=c-q++EcX$y%a&p9ug(TOCdh^ElXB7CHWdErS z`+)`suSn1TNTQqcf8t>NJJkQ3)a<`J_{D5Hfn!I z@DRmV^Mmes*pA;lAb?Q;YB9LNTDk~;^r~?zT%5v9!E`W{vd78W^9B-iUh+)KYdRPH zB_Zj#V&h5D!zwEEfohNQ{{8#Z5wAZR85ndPa052#R?wZJ|gPNX(KfVW%GMB8Yc?JzpyJ4mX$oD20dvbjN zAz#^LIcEXnvU9W0bki?A83;nQuTKEy8srRA>FvJbmyRW7w{kt?`Tatk&b2&n#q92A z*SGeYa%q+oeZ)_(#PVPphWXDNfvI|DR8kSgwL$#w@uYzlaxmLQ1Ao_O)f<=>^D(H3H&rv zGkX85Wt1lCXq{9do(n%}J+5{gmhEujETJ5rjkO71vT<48+LvFSVa$QtDeW^V)AQSa z_JvmEC*mZW;uHPue4eAU&lv9B$;*35E9YUec(%MAoy&*EV8LX(W>D(_^9rY%h4FRy zu2V+amtoPDz*?O~5=R}eJPQR!+sG2l3H9NS%=%@GpZJYxH4(m#Rv}O(^k$K}PpaJM zmZ}Kc;H3|zs50=FtBj|W{Mu)mL^p1JarPfn77DsGt9>@}gC?Z125oo%bb+4R6W~V_Zcj02J;e9yW_@$m;M1KF2?(2naU=J)u zo=t-7JWv zBg|!UB-A!MH$d#(#1Rt{pVt+3W`FlFjgK+B(|D@OWU%5rM^(ko_pzTfO-5qpv}V*L z{u|BkwI}!5hDTlB1r5BfBPKG43%M0BbcTxOPv8H1dgPI%9A}%9ev8umaPSRY%;e+p zojU0bz?&We`QQyPpZlHHtH|P~!$*bBvG^3${U&0l>Erd8JItc!vT4_HNc_^p)b6^a zD%W4qfw-;7^{Ers)ITu0fRe|nIw-uUD@t)I65P4g@{+D z3z;R2dVcP9(+KHvwpS(`e#<%YCM>27!-dxZ^h79L+u%>fYlN&GG-LY3ZLJ;aK8}<| z>zCN%ulBPRc*)fj_6MaH@Xx-b*kZL82M<^O8& zEWvl@CXEX=Gzx#>mHtze{e|2uYc_Atw60r@^-*pR!KD5~zo9|M%xdhTyre^ru^Nz!xTu!T^iReZvQo z<&WxhJV%fNR90<&!Ln?RH&~xptuGrnr;;v3=aG8-V&OLRrp~u8C z$wgzCn$cBP7Td^I#VOawp1Goy8PSE`gUd6n>hx{Sx%eTRDx7CzUr<`z{gk`(C?1n? zdhDw@C++lJCQhU^{vwsO2Z7f_6^*pV$WIH!BAPr%dYzmQDi<#&giabW$#HP76x@H8 z@wv%~YnXK2+q6=45HG8)GB_{3k#MCv+rNuLr{UX*Y0ca_a=B1$rKtjO4wp0aoPN-; zC}clj#eB!63&Br4yt;Hr@7cP9QzUKRzGukCvIL8G?l!UZf^w)FYa3-K>jMdPMuTOC z8~txzx#kF7;k&&vt|Xl?*=HMaHz`lF$#>kI&m^CZA*(DgCQc^Fg;7tb6lE_q0?Y2! z&#Jgw0NBRliUA5KgI|MgX3W%SQ2lDudkIFwX&=JEHSiJc&#{q<*$X9m>bhCWnb}N> zLppS`n8~0~``d>y#IgOpGo18T>f#$el6@o}5@t)97 z_Ws=25z$p<&B7Ajl&&@!j5__cw{Mr{T(x^n)}^^rK9=hOp!|^&t|`Fhstew zu`p#;OV1r0b1+fs64*hnMS_1&;eX9g;QD+lQI^ZG@TK&;H&>_Y93B631j~G!dtm~9 z5#DbuKe>V zBa@`R05Q#(y^oXtJOt*M#~nk;Pg(lYSfV>NRmo&O+BWXX^eQl=G-ZS?9anEiGOrK? zw-gzdP$oUspSv{b$|dhQS#QvwzHg0o%gcjA_1&;Da9;W^%no6+o7eZcWwzcM-3mv~ z`>Gc`7<$f=*WTc8p?Yr{j>0P~w_NR`-6s1vFWkCRP!S|!s?@D=Sg#wh2~DZ|54 zF?wY9Vd#00sM|om4jq2fJnw>&CCyT!eWq7?Np$F))WdCn%_A=KGS)j{BGv5CMWx-d z2R{8jYFWKOgQt)1^nq*Zt{$;(RN0=!ieFv3DCIOYDUo=5hzogl5^GrhgnBQzIndH9 zojq#P3uDC}8&68|`hC$uqc+N`G1!Mf6BFORa1B%qx2PhVIOif_*>H{FXWlrUBJ@E% z(VFI?g$VJRRr$|ir(Oy*=r7c~ZaVA1$>zY+F)Gdti@KChXF7?R5HvMw#qZ*YZhjD_ zBL4TVfpz?E*QzCL|6Mg#WFDFW5>AuHa<}*N)nQ+26L(B=^&SJ0fu40qF3Ee+dn5MC zVK38Ig`8~$h~hzbcfV#6*Tp+L)`|=y#bPq+Ck=R#ugh+efV|Y)nJ}M*hJw zSp(~@39GHf_!~yg_j-XvpmpNvkYHpjbIo<)9adG$qLwo>gc!3+ZAF#~pE}+zgACPZ z+}cFTKi9F$SQt|)mDDQecrn?^MI*b1p6kc#l81MX7|A?QiANAmGZL!Sc-LrK6^(CU zL)Cill~|2iXnpQ(EjR1slo^9^(rZ*7*qBve^V}jb2gJ; zMYHo*HVFPmu{A0o8Nqq*zU*lA7W_e0cxb?GDM`|VQm zq{BNu0OJirT3m}RCEm+Epuwi~N@o!pA*H9nE@_O1+x?^wDlhl--g-AtAC-l4f35#I=+DtpA9@lyuxxr}%3r`lT# zU4^|xuWgMnI~_Vc{CmMMrv2PiC>aZ2%{@zLXvD~2R!Xk?MSc379UR`>$U+Wb3&G4wrUTxYuf!YuJkCb$go2PhB!eQqP zxd8CEGW~sB?l$=xUQNZQc;vnQ3Fe`VOH2y7zZ7TFGJ>6CmVt8__EOY#+F(-NaeMK3 z9U~cY`5bm_ipR39r31yeacsNVbt^Dug^Wqk-*#J|3ND}ApQCEHKlUk=E>LQsp{Tje z$!YzGkdAN=O6=vDW1thyVmcR8|Ife8${i`TMP@m_T4>{TwAI~X$>)I7TK5qD)vK=0 zYe(ZUUdFzoO?$v=D5&!0D%n-~SGtAVZ$qz{;D6kXN5Jmo;wAU)8ewQ7;rR;T)gmW& zWn=DM@@YE1S#x4|U z%8hq1wO*a%ix3qW+ghp1GUK3n>g_W1LmTV<8GGhAo9f%+OvIfIZu%)kxr-?83an(? z-e4mI`=q?tq;`+bqjA&eb53_kU)ZZ3co#TRg4c^L2j}HcYQC*sI?(UVhEk47Yrook z+h9Ffjl!79Bc@LgCo~f0$r=E>%llUuODYS>PHh+uWYbN~ZNN>E{qe+8jq^-yyYA8o z;VTSF0(-pK{_QcVcNbj$-$G{?6AfV6&xe^&`?r2F=b^7|pGzwd51;i#e{UkEVQpyj z_xEpSw{^^fZDA)cTX1OM{vBV|iX-TG%NiGFAhynCJU%6CTF(Na_p_M9#6&A6Su*BF za^S6-=Gl)k9A-fciJGrMg6^2KrfAi<0sp0-b*tw>wna~0IwbxK?}<3^#K_qVN2;jZ z5Bagt5M;LMZV0KqPIhJF5*gfO`uAz@_M-3%5+q)j#)kh)+^kx8AbTV)QK}Gj_$!Q* z7SwhVbom;suFHOil8(=aFI3@n)h_n3UvTqR%DD3{C>B*%LeldYwd2h|Cdr97c_F~+ zo<`i*qII2lAA+%~*K~CYQ=_RS&V2e@xTVnal#|j^)1oO|@F$m5-oPnr(NJlx>gSq#ihZ=yEUcErP!_slO7$CGFvVI|*C5^G4_FgU8tyPv${TkQSJLA*D zS$}k2)jk9DeYvw!vEgG@xXf@c0byO%?~73z=zbbV#HT~PJ(DnkMzT4Y} zQXp3A$(gNs-HC3%(Gk^p_j$iFzx}We;_~4*C-f-f7TIa%_7Wup84~lmTITw~CFcMR zhrq#CK>6_>%;;hVRN1f{Fx+0R&!CMyi;i~+(Ur6*81t%m+$xgD$jiK+yj`OdiyC`l}0biW{=|> znK12KYCicBgb4k?;~%kf!9mt>TE!Kbmoi4hIfC+&2> zR(&ZUZd#u&EdcUxuSozAJ}I5>C7xuxU!+&lY|OmtEeIbOt5v2cxCWow5%w?V-h#x} zV`8Nz@q_6QuE80QILNJa)Xd68Pj~j#z(H(iChtz7yqv9m2i(^R^EiEfLsQ}e5S%V0 zD9V|&)^|^bM1f6>>o+JS9$dcP^CLXkr8oIr`Pqb#AsWe6*crXrX z8@ljA&3YXuXVkTaQJ@plI9XyY0jmpSFpG3THD8Zt#w@Zh(V*+Xj4uI$Rd8-_SF|~u#&4j_OT8ZNUUkw~ z7|_jwA?2v10T?;%4x-E(Y^drR)IK18c4GBZHY+Npur{Ps-i}3%v}@ zj#wsGFYLet^p|+}0M#P5hwF7lpsKVCg30EIRgl$h%P#apQV16s|9WWef1sl~PF3a* z(wV>L5?DcP4+6Gz7Ffk%`xqSq8fexVZ>E?(v-qHd`y|`qkZn$^xtPmi_D6LsJ1%e1 zWqqy3Uu#aJv|2CVU~cZuU=~*lu&4e`JjD)v(_Rk5&SoT+znHh|@@<3^`{}BPx(e9H z#CPf?S3kAkZ&rbp4hv&cKOTpWoN$c{%C|i zC}HiIb1`$R$ug>f@O1(e&7#aVAZkiM;!$_QlxRM{E{qQ2o!Ryg z9W#gCs5-YBd$*U_Y``*n^%nl#>sRjiXPzpem3oGY~wAhI1eBJe@OY z?A_YA6d+JhxZHKV0Kl0vcG1bkd#H%Yg`lQU;;meB=^0aQ(yGURJDaYoc+*LluqnEI zcuYM*Bn(b{=#!c=-0R#+79 zlj@;w6fT;S_eZtVOPXpvLkT@Y&BFX)RdpUa=wa3Lh1on7Hm=wwLmZl?*|lom`xMFi)73X#B&}gR&(WfE^w>^F)@p7OQ=jkt=?DD&;e#jO$qQcb zo#Uf6vShdE*BmNmeTBl5-q7_we3-)+1#5jZzd9?-2?_I!w@aScMtk_K5t+~%K*y*T zdW4(t=BMsyz(Ljg6TEaq$8BmunSk4j^GV}`p?0PSXbLYi$0kw5G`da_v3u;MmaV2LUzJE$jy zb`PBUHt6fXI6W7NL+O{ZLV{;{u0>suJaAry`B_dGoll5!I#q$C0|%dX ztx*c{dQ8+)F;0d4XCl9=`nce^7gDE-^zzL7_M6%4!;iu^-0nK7}d);{&~o_h6a zt)St~LSjQHr7gRI*{fy%uEo}&qu5qV{gdU~W({6vK~``fl}?9>OM`FWb`a3j>AD49ki~0MuFdpg0secH zoPmCqyFS&)*}dNHNw?h$I*DxwMt7Wdp$XiEJNPQ6mC|uJTo%1sj@Xb+wasaJGUG|9 zFk{g)Gvyw1t9m`7UAnv9g*`^I5_6T!XCt`%wedgBXhSn@yK`s72<=xNYSj?Ktz`XM zUn!LM>L-Yh>y7qnu99>`{_c^-?KXHUgdXvj&um9ji-p=EkApMig40O_xsu7>KkjBq zy`AK){SvK1Z|vtnNDvCzFgzi^txh<^@x#s<2g0|$93^_r0uxyz;pFo{Df~oR#<%)j zU*QzbE~f_z2SYJ=j=%66@g-uvCS7ndP1dw-)fo{`QDUAGq`TaXpY*3gdz{G)^alco zy^RV78PyQ@%$CO%zS9-f49;|8ZhBv4sEeIevZLwgRo^#?BBEyMsLdK!Z?{ z7lk;}M(((Yk|mwHvh5rQJeW|ry^QoK$4$SC|Jq%#q_XRHCNzaRo7tgEVXqxkbT!r@ zyd=6X-5q(#Qa?f__tKclh{K+Y>qNj%j90i~%9rpXHo-B> zWvFOmDbCSed^ajVJjcr2yRkiRTFqKXF$rw}PqfM)NPN0xZY*VZpMYY8JG+G=pZ?fM zT~GKCj;{&3#in7sTm1w667#@!vdGy*;q*S+!+c=DdxH}mZ`w}Ay7lc|&L znJ+19Zrtfte?xd+^h-W>cHY&D@6l#KVyvtGG>}s>-^%HT!$FSzybKJO$C!Z=Ll}sC zzK%0ua5*yeN2l_AbCquJQqP6pp>+zp`C?Y6;LgmqkfwP}Z@1}Lvdgs`Wk%?6{Kx!T z>2MeKH|+lQONb4(TO6%0+?cZ)y|{kU}<3mt$S4yzMTx9tq-!MZM(at8(R(&Y8D7>!-nF{eT^qi z-uV2aBY#ZabNK2H9&Q=$z^6JFTsZyuiNJOcdu&KkaIi zB>xQXudd?=D#tOzIu{Jj2B`Qdb&phcFbXigN^Wf7U-{yRC?jkv!ISDk%%G8b70Aq0EMME!ARnj884T}4;o z-SHht?YAX}BGy<3f)Uicj#x`fb8U9J`)K@?P9MQ%wa#JktJcQ>D%}MG4rM=Ln9NyU zm}a!-WAGgzgeLgeH{+*ADOr38-zfBi5GQu&m18bPlhOU}nVwgHxksOXS2J3~ zsBUq1(51C~*y)gc3J3&5l7-{HzyjJnbx~e4jcZq+p8kxJT?xE9NCrSN`u6oFGD|_GLVu7g= znwTTDF?^D(%Oe!> z$@-U-3R3>4?%!dmNXyud5f}MTt)X3HPrA>G66LV>m=M8=`*i=93Vkz%7`pB*+iS@| zdtbDke{NoTGPPrLhu6lFw-828z?-`Wp9)O9t9}s7)^GNX+yGP=LPlc^Lp>S!8TTAb zpFu>Y+C^d<2x4Ae)=Ji`d-xA-s4>1JR!%2FU*wkg;VT2Yo}WSOSS09vQPJ4u7d88Tz9tS_1v(a0W$#(l>*TK*dDNy z+%}~K8cJ}X?hDiK{fj245T#oQs5o8mZ$1RGW!Uq(fsbRuoSIq3Pg>1|-N7%E7e=T9>_IT%bcmuJN9=FwO?p^`In>RQV5DifcT6R)J^Ttf{GB|UXA zLoYzw-GzXsvjSh1iNEd+`M9W(RlbwM>d~?zX?pDo#?(wHC(O*0MJ`x;j52J&a6Ah~ zkqSxTK?OglZHk8P5~J)t!dI_NNABvJ%w;6?38lZl=?FnSbb`Z&t$lqmA1|{3J9OXZ zFO=E~M37`IO(hdgwlPCM@TML3JR{ab^;A?IjO;MNF7)c?IO9Y ze{(RQA8(P>_mZY#;?j98o+|8S_Md-u(Vct%j{WNZp_$92tX_i5W_cIRvx;Ma{|>k5 zS!{!=@||OGc>ccxv-!_ukLL*AvbwAh5HqQ+<^Mbd+5G<*FGRn0f#gFVj9`+*P4T+4 zxSX4UOcVIJ+y{3*Sk5Za{{I(h4SY!wlK(cM>;E8R>VE=<0kNwi7xjgr3ZPi@vOisd zE`nbTb0<7Jyj^!z)cI7Du+VwnGSQq5ckSSlDEF!9^4$wYOlMm+q36g1XC#3ylMUkM z=ZAUv-@KLvq^tYshZ=w$lIt-tnKk#agks1fZI+s1@dx$x=+|snwSjjAEBj6B$@R~t z!GHmX2a8lG9n65175H9?T|jdb!LV*~XCE~iCue1p`eT0f;i??l{x`%WY2fp(ogM=r zsIfj*NePf9YNyguSitYbRdpbIJUgmiET|F|z8>ImLPD;_JRt0bcTZoDYx)alR~T+KN6lLh9up@~S7GdK~~ZNIuj8bnA2$OVo$iZTyLx;zT{}Jxb9*cVTZLiP|KmX13b>qxT({c^gd2!5o_($8VX~ z!MEkc-hz3pfB=X$u?hL)PP67Mus#yd4uX7pd&Ofn-;^(XtOuyT8PK}=S3;SN4*FBT zz5%DJjt`}4h01EmfeHx8c$qdeLE3bX;8Lq$B?=>e~V! zrf_OQPoH+K(jnBeaw~8pCvqlU7C4IG02j``3VYROPZlua&zu}pUDvms=LV`4>PJjv&ythrCyh#Dox~~59|dwO?D_cL%2%-v<#TEd z=|_w`%<{oOGvRNfW0O`N+BN))c|QdtPa#0_bvS5b)%82TPGCjw_c$#hZMry_h0{|AK)hQh8Tx2Dws(McWD zoifu9=icO{C9d-)lYCZO&Tf-3>1k-8jn|vq9XHpfgM%)w(jEtzQYdq@_Y_9J# zu$mJzY|>+#0AW-xsW@K#bjlY4J@6F1O5ZS)!RP~!a_a!CkIq;l66G{*K#;`y0uwO< z;9;i&%c#qeHly&Qv^;ly%SZ1e9t%`#%6q)hKWuE)6nu~cQfQ7i6`C9-jf)(!fqG4?|WV#DNovn>|QwFHns zm-=ihi0T9`e=YFGI z->G&X#5$06ElW3D)>GqxoVT4Oqhf4W1^UQ0#7v!YXXas_5W%iPsWVj^@pW>h>n|+J zh`pSIod*67&C)vW8BeMGo=K?8+>?enD04hu&SB(q$$hSr%!}Uv1tjO%$Yh+iYeb#IO{jh%` z0Eq@r<%by8wi!Swr)uqXG^3zrNXI$H-f#BV^xA{mB?2DDW-2}!Go_h4`D+CzAFsh+ zC)TU-fO(Gp83=5HyB&GWSWyu^Yl#lY$-Lj+z%?l(7qVo}IJ{_vY*CW|I)kVYth}$C? z!o~n!+U%-wh}f6=?(;`ZJRtWSfEz=uf6mCT6*PrYM~qlbCadAn`qLhE&yEdiac8|r z1Oq!kTz-mG+`(!R=aupCi}~*+4``S1XqT3GM5L&kC(Yjnte^D}&9Uggenc7E(QBOb zzLxE;wl^Ey()yo`Xg=CKbxfgR5{e;i4Q9wp&fXjT{tX~L%t#K?9RpH0%c7vYymA8_ zz1FpYh=+=Rpw3JN;G(_u_U=#}f6*bKF73PSa4tbpV)8re=Gw^Y%#kfIj> z*;no&w;K&uU}-}%x4_0}V$LZHOiV@^V1{V`1F2|f91!|G^J{M5*G0KBrpZ|VE+*8W z6q{I(=sH`+^7qbrzv+rc+&8Wpn6Tff{TRz8KGh|7yS()u#`*ij+r@{4#kKJ#*(u9v zh1A}=ah!6}%t>YqTD1A^_z91T)7O%PV5{<=1!}Z?7BuvBZdr`8h5Q*%>sjp*h*n~{ z&RVfwjC#rk2?BQiyK*-A>{m-msk4=#6grqfL?xq z)d}--KppF~Q#MIBDMK|Lp=DSb(1O*mA9$a?F`-$?Eh{2 z>9>rEivmsWh9v7m%cE)K4EybE4;|0Bt|O12u)>rBENm@r<~%0K#gfn7*OPfcY2)ym z2&AXuXFpu2pH7HD;if{)hG0kM)$)VrEJqzOn%CTtFV*@ ze9j2v82{K}GStAm67A=5TIKsR_07f;{vVl%xvJ{p%*CQ|$=eBdTuxRu$6 zEcTgx*VE}2<*m|MSr0noZcP9tXwMqA8YyAA{G5qnULksIbcded9Pm=yRGxXf128qE zC#D?1vBJUaO-+nm*7$^IrI$wq|% zDqfw#)HhD7%m6v#m+LV<;&O9y`BRy$CjcJHxWe!u;8IaW{5+NN2`-Iu5Y;fMsAt(_ zq)@W!J}AxPY7*i4wWVWl#mIaWpjok1_)3mB&beH+cP`>-J3ng#>MRRFQNO&>-8_O7v3zSP*EAG%Q`i@vDdN+=OTy1Ly|IusdHh2`{UN_P&l+ zd4_o^pbmg?&cgA*>exhpPrn~=Tt#pD0UcI-epTNdiaX)&VN43Epxaf5VR(s=r=sTA5os(x5LNViJ~lA_j@WOkKX(*=9gkmK z-5it_DM!7pmN}JNB~HoiEK|kT+z1%!kH`R?gi0Ju#)GlbmURq%sYy8O!N)w3?qOUU ze7I#qLfz85TF*TEZvYdoNGrx0&~C|xj%obf&g?bKA%|d`DiAcq5rtEydVTW8pN}zi z)7bBO4GNzlHTbbJegk#&$l#KZH?(Auw9`jdfneKAgpc3=1b0qSwr;W~(Km2Y7oVc1 z?wZsM@b!PPt_Ttl7HadDAEvna3m8J7PS^c+Ep6fLil%3@f_b*iqHPI(qs7n1pMG2u z{}11NMD07=bz&-R&P{^NThkAX$PQ;azXyX=*7!-*l8-t6vSr~6WHOvz2-z)-zqOdQw%TdQB(D8+~xN-F1b>JU$*|xnI zNPH;&(J=4BKYx;tsNZx30u62;E(Tue1p@{~7hbOc{q=x%JzBt<^FNdP>uUlA_5Ah! zW*GK=Frxck8tTJ;FnTX!`x+yBAw%bTfP3=MUt$m^Fvyq_r6)Zj<3BjSo+^5JdUX_1 z{}*}h0oByE^^1at`Ue3E2!a$vP(VRZh=4Q^L6qK0K%__uMS4dNQIMiE0g)ac^bQFS z#X^@FdI(4-gdSQT+!fCG&UfCs=Y8Y5-?;CMd*96%jv<7-_u6}}HP@WK`J2C)_xF0H zm&g7Od}wn2%*3M1n15=6_#aN{|J1XZp7EU55}m7v28|T+paaEF`~TsvyBr7~o>ahu z02^dfBz!`GxqAm&J4lFUnx(b)h}z7ifeo!;i_Ak#d}9NnPbarLiU|P=S|gHqqIN@+wg2*DFeBUhw1C@Qg>djC7E$V2ML(JrZ9j4K1J4DA%cadhl> zO&Iw={?@OhE>^A=K=BS#`G6yJxA)2iVQuRITeEEt*z#T-#e!mYu*n2#Xo^Rbf-$$< z!RS^ECA;{`i5@Imjg|f!p5}cq+(`OpT1BQVe#{v;p?Ht2x4{0DG_Zz6hOv(vDff|g zgBAjq_?6Q4w!b}l>ci^Z(DHl9ZC3m*4-KFQU{^Mn+x3q2-rjQ0x2XAnZ^UaGu?kx+ zF$R{u#{MYR^b;wTBHsOQZhJK5qJk)+^V?aBsF65D3KMuFcGsOcOhFw0XM-85eQ#~$ zLFB{Tn<+*m&?g~0A`NMcAGE;HJgNVsh`X%0!#YHZ`p|hw8IMKPFkHIVO|+-<2VIo0 zGC!RreVdgnpt{ZeSH1Vf5^(!L zzWL+G1e=(r&aJqy^xq*4*af^ppL)#@NQZ}%wc0|BUO*L(K!7!bd)d?XsVRhK4D30@ zh(BVEy+7EU(&qM9cr??ma&QIMyeEwo=!>M>G7rZ0mpp4G4w|jNbFy~bd(tDqN_D2B z1Iskev$7#S)q*~jFc8Rp`=mwLs7D7^$*<=I?{@Mo41gD6ckSR8?%vC67G~z5&4oVb zHi!d;fkYj2>J_8<;5j<4{vTU_7XDug;II3R`#T{?Qq!3cW3hJqyAzN2lP&@FK*>#$ z+V1d#8-M+JD8dg{O|b@C7}e1&Wtej-Ut;akgi=b-3~&c7dk}8l;upktfnCYB$PB2A z6>P5HWZ5j1YxbLE$z`fZqI_(z{>Ugch~sCHv38t`rYUb$^DMW0uG>YM_5tCF=*Ha^ zvtUd9@lo3k|X_qr>TeXy{7-eN#phmyDR#w7yy!}tSfduS( z0ne5pO^|(Dwri!!SQ}T);aK~P%YRc7V)h)gAv-unh~O?cxV%9F_!YUf71ql}e7Dmx z@YL9))lI1qmv@77AH5C4eM~nChS)tEpE81+yvR2@PoezDX*=?SJ4^ zLgJi20rfAu&*e3C1zl*9e2fnKQSo`uoocCCe@Mn>!zPT=qZG6k=|CzLLw~)$XraXE zUnyok&~f30!2}#{{h`=U(sOy~O~Ieec&8Ko0uJJMK*NBIlz$sHJ*Z9z1W9D6dgA1a z_yeP5q`d%G@iE^wnOV9H=dXGAjHr0Wm1S^S1d0MtOLPiRICYpU<$N3Gy2AZTNrOA_3|11=3 zK7B{ktwI^%g2?h&8Y8-fG)_kmyb1vUfr(^C(BB$Lj2;$>FfHpE^fQ;WsmhJK&*M*% zJyV3Lro45D4p~h;PTdy*B``)^!!=JHnN;af=qa7e<&fYrbWg8Ni9GDjUu@am-3Sq| z=9Eg1vD0T23}^%@uj5uuUJCSJL*|_9cxsO5O}H1ByorlDRrUhOWAN^SYt5mUzm!v|_EZNScfb?d~TZr1nb0 zV*OVc0(IlGB;0TRLH$7RW=0%?=Iwa9oA(03_cO#WK!h9s;!|uEC}yIYza`{XqwHz@ z>;9+4Zz90qlt%vbaS5)l^XT24d&onK#&x$ zs^LPXjS$M_?SYjUG;AH_E2iY*#9(9nR$kZpcn6O*tnNbjzH|{+Gp8ZD6mk8cZ@uBl zTW;~;-JB<_?&LKVsLyTs`Es^xYVaB-X(^b~o!i-xU~bU}fzt5+1mziEDl_-5MrJLR zXlc01YhGly!b$@MUFM>-rVGl39r2^#~+Ud z4ptiB3lLLSknQJzeETnLtGar{_3J8-Li_Z^QsWA2aAW!AaTe*vit3MBeMLozQ2^%# za11-2DjybUf9GhAiwn(gIBi&Nms->{VJpM|aVU*6Rxt_O;AA&6Zx27IB53czH-hN? z`D!tB8GT50`4&>qB{K@Wd!3+7eFn>ye+v5S`jdz4_J+{+SM8^oWa-q3;)FWgfO?ao znO}H*xg5Vi``lGC-n98{&QBJz0&9prsoLjM54TSq**ynY zet*Xy&40_~J0Qin5z_G&0yiE(-nmsgCdIdksqiDkZ+6h7AOrb&10lHa-FBnG*RR}F6IEP{et*phs7E&1EZ7pIaN{y&M$4&tQg zT6Gh6^Un%lHDnY3^Xm{dhqFB<|CZHc0)k8F>`Rs3x2lchHy?B3#U08egc5*zGJaTC z+4&Z`?peG=rF4Z>>#J~-dJ%w)fHpbRqBb= z*?br;%ATxhOscj|nR@FHc9QprZK{zc^dZF$d8Nh3v@#&TCQ6#?-z^@u7Hr%9blb`0 zmZgVZ*W$a`Yi-%DdbU1r8Y6N5X+a}JzIT9fH$O7hjeBU63u+*NniTMJ^$`Uvxj*ffGG(JZb@itI=FuvfCaw+4 zjaLIV_Z1$Ot8MK2XON~mp;dEv%KR^9aLIl{I|Db6zrk#^=!@Nxgb%Vwm194A`?Qn+ zWE1+I`?6M+#`+{wKLGLVp$ozBwE&9u(nL%|^vVYeLXhrxHXfWq!&89G#SN8JFk^e& zC~QFYJav@Aj~!G)3}69-A7TfYiRb?@MZtGwf4J3l;rZj}1W$ z{}aIQBr>LvNHmWBJr7F8V^Wz~eJrxfLC`FBGxz;zX}*~wXhDM*|M<@AkPvrA1iiC~ z*CsV+TmVLLllk+#qVKlxphQa4sG6VV((nU*N`z5t_40LRGP;9&Z%sNy%qhQpHD;ib zeYA%}unvh@SVq)=pheTbfbA#@Y++GURK##ir~gAh(wkuZW}NExgBr`75RjFR&dWzz5E<>j^f-L8Y>WLJe`o7Rw<@|-fQ z(UbyC5{{bp%cpi8EheQyf` z#f-$~O#JGjPxHV6sfysTRtho>-~>3nTCwy9EQx54@mIU?wZ}7>(c@taW3g-!Mbfz7 z*Ofc77nG1W#oXW=d4(idH116Y+jBqzC>^5;v*GG2u&Q(rrnJYv$YC_bKQ-K96P5Bo z3xj@gwj_>s>&D_$rl^Dy@}@qr{=C5Vppuh>1iZ|G5*KvK>;zactSSo!GzX9JB&(gC z#!Kygbc@X}YCdi^oevf+RjW6ri>!Yy-^34DSQn)9Qi0vxBCysao4AY}Jwed`yY}?c znGRs=f{;%Q*#H2qp4Lz%F|XBKZlnb5nm-y>x((6Cm;}A6+~XJaNN=b-AFrO9u3KRs zb?J#-Q3a8scYjeQ_!tMB&1ukM<54sh?9k7=p5rJjANZXC@*|ilnbkd7^ev^|23YJG z?t4%PAdH3;3zmc`b)@K5T+F3p)w3SkcX@kT5&e|3U|7JAivO;i~l|XmdyW{>aswY0^h1YUI2Y}>{(%XhHdlfX={`;wM)rEI-2+l@pq2M1%7-_meQ>ga?nz1 z)k?(oM$$5#+y+Sab|<;K(*5^cI;B5o<2a{&MOJ`P(vud5u&9|@(40#^8-CnEP-&2V z(T>K-q+Vn50RWNy2iXmdsgm%3rYG=^(A7&XTP`oJfcm{LGb~h-=Zay1l25H_yvh}>Rj)=3L>u8x!O z4S+80uQ%eHr1rU(N@@_H7pSa3$&+*7c^dY2kV~81#I)8`&!E?`iF*a+hY|xXzXYu8 zJAEOKdyK*y13GhY-f0aPxQ^k97bx6RYwWdVn8=!Mw&+Jf$?I+PyW=a`e=7fa{9EbI zcGm3UON=F1Y+3#W8ND3lXmrky5<-5@JXS4I8GT8j z7fU^W<)S^c$y;n2xIe`WMHIjR+GgqYqSg>#Kx*Z};txajC}_qW5kEJ8sqhqmL^GAo zmkdCYq-2mSUZ5S-krt+HA)q>>`?J@5qH|K8o5%>`3g^rst9`zA+aP2ZPzvTo?)3mt zP3pBkQvk(e)^7CPEypG6^*Hh}R^b3sax z`@_xrM&3=Xf%*dd5|51{gR-UrD7RsnWDn3m^lz*xELVNQ#J#+AZSBs9^uScf{3y?+p$1sp>L7{RTzBq@%{9tbg?CnWACXyPXKS zY78H|Er|K(wf4ala~{f*?R&fg-Cl3ga|Kc;Rhuu&tXE_-bL?&a8Y8_opY=`0)e|8G zW%WpcmkHLMSJMVaw;moabL&N)0W^uF-KWRfu-4gpsp-Z=&cS$n(}jWfj$aeY(PV@) zBkkR-F?)5$Z&qfpPO}(lma}BP?UlhUf5wA3F+Z1*?S+dkK2HX_W_H!WbCEXc+ngCZ z;W8pddfz(yw}zWLOVmbLSw#0Gx1*TdC_N0e1Jt)J_T36X^f-N{!!P#3LmN4oE;86{7k2E;;Dl{L#f0w3r*z*vQJ< zq5mi=fV7Fa_BO6`hK516+sGp=neu^ zhkV-;U75F<$?Oq$IfE$3kpUK?qmOqJk$h*SLV+TL>)Bi*%1TFPx`X;@3I@LC4pC{& z)iE{WQ)+78At&54{zWV1ww8#HgG*T&mHf^S9y_NUqDVq`K$o!z^HUxo*}QAF?4IQ-u*Gq2Gm zTE0^8w>~FpL4{CD>$D_1+)2+0X5GW~Z!7HFxk$$910_X?_7k-1%o?cx(&N|~q?zg2 zepIVcWD|HEoz}m5L;Uan4&y@&tPY;d{~g9Oz36H5?IQQpzx0z@5uMilDclYW9Cu6c zTXnxxeha%`Yh|ViZKvRX6_mtP_vVO1Y0Z#)!as@R^IdPWvd)en0iIcST3WRFek1f9 z4Kg?2Sa3j$zts6JBZWJw-K%|1(#IdqZQkQTovRaDGjtbvs?*%2jATqn^@zF z)aGs`K~cZ-EqaiC;YIqUj~HX#Swu_yZZJC_>9a2SIFY)7fW|4cbOTfT$0CGYt4zcK zFxD4)%T)yQ&3X5CHPCd-bf0%t1Yu^OO#a-vgg3GlmL62PSzXA0lSB#PrXgk}yW~P< zSKT2tZuP|o>mUEwV3~?!IL`OLQ81=th2hZG@FLk)9w$NfaS!+B>1SYlmPsu&ObI&& z%;c!EhtgSFKhIT+0-1LO^ny=tD%W-~&V%+H^JcdyU0^Zd!MBL&$k7uDRttX#`g{!k z^6}%grKyQ0$Pc1UGl{7rt03J6t&iNZ>+}l4Y~_^9TiUliJ#ojOXB;(gwd7f;yX8#@ zEKG6Pv5U<^+Gi|5Dquinoo0E(;A&RHU%Gv(x?=tLld@t|a1?WL@m zZihRDs@f`ZG3mmET4rLVebM*VTb|kHFEq)qvXgDEWk%cY9Zmv~a3Xm<(o>W@FTBiMU!=25v)6cZ> zH&?{3AME{JP5ZF=LZ?rpezj@n#nUu>T5BquFEV($eeF;W|Kk3I8r8JGz@qf7G?@tY zw4Efi{d#+un+3#0p{CbwZn3?LJ^zN6it6>dCVfn?#=Q@S(sVex zw11`QCvHwG|NPrA-la(zu9tmt{_C#3fE4Q}X&pAa#QOr3%*EPOKg0#y&#Osq$y?5H z*biD8Z$M<=5UR;{*OqfmhyfZeZL(OQh4hHx=o_aIBzCsgbOHWkV?kdLgYccMe(L@8 zGTmF|W`(s63#8PJQa9nU}u~U>eEX?Olgbjds zRUfJ{Qe7;9_fN-!jqi3ilGQ6=JL%GrLo}?M7YiIY)x~6gH{fYgYOY8+?uR5^dZ9ql zfr{DZOxu+de^uC@1lOdpqr+J5PpLxc0`B&^#l`S0wrod@Rl(ovbZYcJ%9xIZqxE3&M=PgVu|_1Lv{F~m?|+QOR!kz;TG+&@27MP}Eo`u0=cQcmiwOHM zF1_^m`?h-l(E0XRKETXwq^N0>(eb^E; zxBGNFc<_EHkc%>FDChZE_0ny9^vW?N*(HtIjAv6Z17Sm8p7x$|+&LvdWy$$~k~84> zJpXT4FZIzcfana}>%W7(%;4`RAGzz@YuAI`>z$Y6N<~(FO;L$_#i>2Idk%aR^NtPR z`UB>FLwY}hAC8XT`HxO^=IPdCq4aZ3doaFoe`(l4Y*bakoOf<@0~UGy4DJ^}l=x6a_z%Fs$QHs+JqHw6qD7XI^0VPixXPrP|SR!$_>yiFa$+ zeC|?X3DI$|zmq2D<0|Jds#B=_eLwr&?023bVw5FSnauVw@77Bq?|DL}A$`3BAL>u- zD~}#ck`Z>KszHM4tLG^y9$y{B7EP2(-)vy*ey^F2CpAxn1Flhe1~jmG92&c^67W-I z$1WezT&RSy_RuI%8>oWa87=jWfDJeHbsp}F&Q#wN^`GD(6nWeZ%g3EGY!jI>nIC~e*NY!?J6R#&Y zLu5JgTB(7>$xgmR4+(Gz^jSYJ7~MsGmTF>L8N{fP7W?xpPHrz-N=Qg73ljOtOZ)TT{lgNvf#Xc$;LcXI&%_imqrYw zE+IYxXkRG^G+BY4HPjQ~nSy+nLsxcef}mUE9oy+psnxa7`G zZSNQD`2Lg4xY@%_lzzFZWST{a+OXwl*UmS`Mb}tJjipiIfT8wTum#c;zGc3(Uyyf` z15!CcY+IJg4+uG-hgOS9(VKh}`dO!2c7E@qo~&>%FMx#npcQz$HiCTqwin#Z(@aX6$qDut-wDPGZ3_rAT z-uPC{w~l+mJuoa#mm6o4r2shV_JUw{QKm*$$k}StREy;ivphx05*X}^8<6e|zWKR` znLfCxYt4%<-oG4cC*RoZhFy?b7hRXKd{Ehk#2u2iw@`SeQfitLwWLg2K<3CupMrBZ zZ6?G$#Yyim_IiG3jFs70RnR|$h`J?58))$R{6xIm~* zSMhKt3N)7g0s=XMcr6ym{et8*T~+k{`jc&@n!qaEcF=P~oODa;RvqAM<#$qN8^Ha; z=3PtJFVWrJ=Uxlk`OZCNR(EUN{}0*J%e?TBQs&nOIBviP^^7_EZbti>Ubyz_xDUR_ zpgU$>>T#gE*#=RXIU9iTC_zoa`$!H55)GP*Cz6Cta=OKkP+n`#YZx(FN40)Fl`@0~ zvkhJYY~%e=`d(M!&<>Hx{N<2&SY3DTVaK8?rWh*aNlzERwJEV4_+%#y;{Ron&42u$ zEA8;!P3;NE7r#G0M=Ji~>% z!QCNyzB%-Rp~@*H&q=UM!HDxYY_Yn+bFd!IWmcj_qhFDAW5&>v{|b17H!`?)5LyVK z8+%GSD}je76apcH_+wTT4{{itTmd`gH6{>Ug@#2$fdeR}^8k4cJv<8?6~<|xW1eY+ zLbp1Iudlyvk85l|5xDa(E}Lb|b!d@>&5tAwbsYDTgc|}EMBg?lfwrcMo;kX>$B2at zcAGWaW3pMNENI>X&5+-J&_yAk*}XUoxUDRL`@sn!BIRg6VSHHy**_LqonKId91#M2 znrc8w0Y$vzJ^jJatbgup;~`uvb#betessguSV*tXnN&2ojSDm@d`A0P5rjYyVurgD zAxul)pGRNg#N4;T&wP8ocR+XVvAM3mF&d`(&m!3&9veWh@jQuBYuJ6UqM)nl&{wH_ zlQY{^_Ps%kV`?WTC4?z#Tzl9U-FE)zU5BCW1IJ#nT`CA&Chh8hv;wCPX9cA?j}*T~ z2AsnD;~t+l$7Y|6lE3Sv)CZLN?t4n<4Rz}&v@gA`>~Mc^9W2e32M9d`_rcy;i4a2Y z-h5cF*-xENYL;W0yboljLogcDuW{G3bL-G_;(qL!ieln!ebF9i++J}5)cJ@?2yCPu zRZ{@=MPqcpL7`{1+(h6t0TY8NyLggguYc#@OEg`*nZYXkUv!rHJdle zhtl-SgAIjG#ZVOTK}_ReWtS2E4A%5wpA426e7BP(+cS6jgHE9~+MT(2uRTE+x=22;i<9+vKah3inxPLlT|VS_ z7iL9}vqI-?ZW7wN5u#hpE6HWvki2XjL3d#|YlEu_lGtc#=CuFI!>Om;aU^$>QMuj7 z6aM$9$c?-*>3cvNBurdZ7>o8lSRITXNR{$LT5(EUU{L*wM=Jl)L?)*R zKb`D3kYU9+WM5sQrDus@7Iqk~ANGgvWg2nPNpDKSo%O^-&%u;vuR!xLs`{3o-mk<^ zQ}5K&6Axd({vBM!8fN6xElub2WA#mP7=v!bI3E9jeYk0Es*hcM8h%~nrzA_%PUobX z_IV_aKjb(~O7DZj^6SdFRM|W>lTD$hevkaTa>+~56@3?r^V-;u8kqUJCp0I0$ybm z3h`2D@%A+;=!7U_gi`LbTj9WIhco6x;^W7>rEhU2R~sLF3Yaf&&OonyLvXi=+x53d zL(bAN2I#tDnXmpBOwfpo+#%oE_wV)isQHCJn@>GiGQidwxqizsDhKC3$p(Gc_F|!Co^9q z$>S4)o#@cwKrw7^yJ4KJOVF)GiP7%|JH~0+&MObDGz3ByIl8;W*p?JQbd|B^$QEZj z-l4SKtxAEQd?1*(cl%Gx9aglqFnXj4_sSr%dXq{^2;8ij;+=7Z@#{iU&C#BHGdU}i zx_7CT!{0sI5qlLH&94!~MM61tcS??hCFG}PAA2%d4THXFUAb%6uFH0o<;>WSG3F69_W5{5HP=2`|mVeYF>chEe7}jny;JRC%D*Hf1{cJ1i zOO^8uzQuN!#T#8Kmg@Rk2bWo@OlYaxV`dIRMr)kR^oiQ-#Cy`F?VB`jdUS*O+bdVj z5Fr`K95R^kQy$`og^8GQpTc7?4>z${D?Eo%N~-smolQW2tYclHMWqSO*odEeN?7TV zcQ&bDS1`ziGt>DY=U<3ejUw&K;mgf6E`$DJsy&^DYW=Ps2@mTi789*YwP98w$@A3O zS5Ea0>jb7o%}<-9$20uc8UG9Y3v(?WcrB!c6?tY2+dc`=0Trv@zz%B4O zFMa)Az+}h&4JIp$q2WPU{_$+7T<9ZY_GDozAF*fxT889B3`P~R7(==e7;^a()iZs> zZjRh`n^4J9!+G!J=DCrq2yWssi^P@fQ@%SvVPl)#Y5QXojz~(>u(>#?Ww;oS81IM( zyKv6A$ux_>@>TY>vmeLuk2mzE12vUwxr#ULAe6CT+6SRjOZT%+XLyU@-;Pnc`YM=`%;d8c^!qkphHjd;SR!8)6h*R=LMK6Z5&A^6Shiub+8#~&Iv*^mp{u>4sAVEb5b@Q&fKiKOT ziFO!=dyjvfzCLj;Z$@5seAq@q*X_Pa3pGy`rZPrBN4akA!@I57!rm~$hG#!yw(zlx z>CVT}*%}q7s91<8T>%zdH+_W{(iNzi0VGxpI@vFF=5vAjD_2uJE#Y^EwYYrLEZOc3 zYoS}{1zSvQW8@GjEY)?VvDi+M>S_~+pVP0*IwsrC`Mr$l9KP3##noD5kvO`z<8##e zWVYt1qm8c6v!>}G8Wla_2O!(uR`S-yh{faP^ zWkPW9F(;t2KqWVH*S7aZiV6ep1uv>zRx&mH;>kq$y}|U{T<-np^g7C4{r?gr{1?v% zEECFy=ig!3|7GUUzlPEj_>=0K9qf+H9dfWYC}XYT2YRgxPGSgZw82V{PRbs%a|N$KF`0%kuWm;x$W_c2TR=h#%(L(3fmM& z?%SrQvKLGhStQTx*|?>477ju^`mniZ3JC;q)3^t^i~-ylw4N6pljSi5?>uzg%|UN2 zACt2lZuIwUL+@y~(6RqUlUPU-1v$X}auJe;&$jbJvr|>KcU*h{m@wJ8wR!^B)2N@NIa_f z$7q>r?!oRb6Ko)JWh`KS_F4$^-Z7nPsqIs^Pqu?HTh#|^!>t~3LVaTdLKmwc_5^6! zTQIAatH!y~0}@1EfX1)k!5-h?ID!<?7xOB2SKpQ*U(Xv%3QFFwxbxRLLJv3pi{P zcX!`!iOOi$VMezMw6s_HQJ}A<4NQ8&sFuVM-$qa)Ti0Q?f1QRD8F6PtFRdI4mm#>q zqFY=|KkXF>-4{m~w=*tdTcw4^=OXk0@AGDz?ajO)BW6A)CNG>4Tocap?+< zu1j_bBxWXR_J`yT?5^w2Sh;q%eCF=3vg_y|YDi;oC0MgizOa=VRLT~Sko>}5s>-Dg z(W%+Hp&Mbb&v9q0oEkei+~Z4JPoTnpZ6}AR{;ZTNORqqTl)rP@(5}#ioSpoA=#y6b64m}jSWLYxblpL?sb#N zq5{nj$$@hDwE!uj6}{$>8iyr#q7qk)xBZ&X^m@-=yTw6p9yeohe!8T{fYUa{4neN>3KcoNA+aeh15`ft@u$`U*$V7JB>k6pgw*>bW zygt6M=msegn#-XTmeciGFEXt5a^I}iQOyKEtzTj~3|9<;?Xz5~(+so(Zp%`L2#6!7 zsdzdlTb0$w5ytsEHAU|gA~4%oH$j1PfvA1kX=a2D`dDqyr;h9n5qoq)NzJP%=ckMB&jm ztv{mf{DNzv#s>#XTl2;}zturmj>Ac!-3t8G;yPx%syK~7(=|?dw8pLP-RZ?X3{jfb zOxVzhegOE0R87&~=^}c@R9y*>w1Z!?Y+(()pRl*)PEeA(l-%Pe@GQ2kyY?mLTKT*` zLXM4;+_hyd1Vp|~h~zLL_*e}-%fqF=!j!~L!JpXeX>#R{7dJ75@{|Yk=^3NM*ll*0 zEpM1{5Gu0#r(M3y-VjksvZzS(V=efpS>v%rz8{3xGEArGS+2VY-6-sJvm5`4td5Mj zRcYNPZXAamQKg|eV+~Bc27{iHF)S-Lx*BVS#gf;FW+p)&Zh%Z8=15u#xx*Q#5`wHM zk}u+J@O_uB-R0x%N!Yk@QMU}rASEQY*+5*VaU6m8nm5vmW(U@c8AP5DJMXoLHFVq? zB1=QlPRhBbR8-F2!R1=mI|<%SMc+)hySbbM7&5RuS}M6u6o;CHG#7lbsJTGep=tlG z@y~f&k-n5v;?lPR?oyGcy^cnyH7TL{Mcw~+d-4Dr2E5-eRTdk&bJ-(o}VH!#d{RbqbZQF^J;vsE?@lvE3ZHBUw|aqxn} z+H%rN)y+DQD6g9yLUadDHJk7}I2o-h zM&!;4u=I)d2bda6%W6E@ZlMO5kn<$xSVLw zY5Xu6wJXa#d@(Sv6~joawLpUXB*i?|D~$%?nN8u8DIN6Sq&xefcI@yfjf7J}zzzu#3h=du1d{=w<1m`b&x z(Oj6GZeRR*^`ZL1SHZG~$D+MeP))hp=p6(R^G`;Z~>VbxHU)DHzFUm)#hx zcC3QQG6P081K!Xy{i3pWjy-Deo(|_*!Mtwe8%isfcH`#>AZt^EWyVHtb*31E?EO@T zq8Ogh_=%V_IjjC+eVmcFFuOp`mEg2%e}7Y2(@2rxh{(*$DEWfScPdv#5^xvux8zA5 zRp{vUgMGgx5Q@{y5Cg_gSMDf0iR&Kp6*xD;z1v7I_6MUj7+Fu7>3FH=b zQ`jAu+leLAPRpqA(6g92Xz0~#^j>HR*GP@)yQ+Krui;ixHs?Rh;ORa7 zf;Jj84u}O0sInWBF!nUf zcF+nD3ifUC{`emB(Js5&jD{Vz%K$YtYB1kQ`&qc|sLfWBA0)LUPJ$lR3AZ_=->WPK zc3lcWq0@U3=RcvE6lo*Xl%kS0A#;5DCX2ANM-T_>p-v3hP_Z@{{AGo^v-` zs^pj}?@N0}`F^$w-X!$5snX=fP!g*vqZrf+kFJ8gC#O#+&TYuzc00h&`{}MC61rFl5N_=8J%~RTt4uELkmh&KDmYb0(ae#a&_DS2`KCCUB4xc(P zV%5yJnh>Yf#j(9aDx0*{-P!+Xe&8@2V`?I%6z>iD<%imQ1*!Md+}pRgn=$+Z?W$_% zx99L4y>pKhlp@90u5WA<{SABj8~N%%OV3hZr^8f~&0GL3bte_LM4&e@#h-wg+DySy z24Hp^0b2E4r>Mlzf*FbGv3YgjZjRU%N7An5@k>-e?{!%&pX}77O8>YYq|nRhtnADk zOgh1HKWZ5V`kd`L=x->SKZ<#Dft|E*d8^Gy{n`WwJvad^s>MbugJ0?Q9f|Qc!%5rF zaUCD4KQffcQ2Bn4Njsg*e_2M1<#7#V3Q`)upOT{Nmf7OOtOK)_HrVdC&ff9u%e7A6 zE4iVgx#8~Ak4+IJd39d<@4uta62QEfs=9dQ*V|QDMcBCdGov= z1qx$>DuP$pHw#OigQv+(2U7OuF*kQ#^Pd|Yy(C$eK56#tQs7Rw_r>3)z&xRCY(uxJ zq{9F$r{7KYHj?i0Nx+KI27tQX76++)Fwmt>X`0L2>C)btlwwDUYfBNth4{Od6c7di zY5@8NqW3-!Vzfw#@lAgM#4ZAPae2I9vw!x~z@HeW=-mMy@#O_9jfQp(Qk_#c%v~vXIf`z|TP)o%Q_RW2cxakQMg|v7*s_RUrqB zc}-~LP1%WV85=Wj=^zIM3csKi8DLK$$>H-6jas7brbR_4QsB(4X~>1Q~&J2%M@wj;qO#x1;)I*ef~_o zE%Du#PLT-=^<-)_Dt-1U)w$`fYCw@-MNtZ&#(4!_{1ZuHOj5gQ+!BVZ?xZwQ@m>4L z+908Ljx%J!LI|~z1LFo%JxXd$5FRBr$9bp3pomcuc3MnA0szGn(@@w+54$m!bjh>t z$P+zZSa+F1px{h>k8p-RF!G~TroF&oA}C~V>a<#JFrAZ88hPMu07Imd>6gV$0mqrW zPKt3B5~Es+_qb%Yep@9TXp;=x>AG)mL{R`8p|BvwYn1=MUpF6-ewEB-;{&95m+$-q zL>C@_*N%}>Kq7wqtZDYM*WX5t_}pEdyeT02w=kl3k&Ax|G&PK738K&yAS=-jY~06m z-gpG!j6o{1Glei&4Kg;qTZ^$^ceQYO9Cs{A`*6?9o;&FfxQK>RCy4cY%Aue(W;hZu zJ|7&V^F}ri>XC%P9QP)SQqr#u3%vj)0VL8Bl$HKSnq#{XfWLOG(Mk3zr~R8LloI@1 z9qLD=k0an>>g}6s(t4D+5anjCfo_DlV|1&5STX74?@LaOGsG1fj>~)ctbWVWP)97X zj=12Yn%Vs)-|XWPEh z+0%WSo@2Ex%eN6Tae3leepK7fE&cg0@3l(LImrBxRf;|wM3ZM6$@LQ!L8W&&wzSWoxui`82x6;*M(8ugD_pT(vTx20oUF{if*I#N0D%I1@$u zD!mMg!0|W5`?MgtAFadRSBo~OL*3M+kfx`nmyYx$UXE~f|2TPjm{Q=|P zx`!ipET_R^kqgZe52ND;La>{&al)LTU(HoM;e za}`8wUrGpxl`AB5Pt;Py=$UI^~*H7nEV-h4947K+hS z;txziD8`6saNdUR6c1xc%%hnmAzW*np(9 zcUahfy9$tj=-JUbm#b1%x_s+;sv@(Y@EfrUJj_>Af#-S z)w?kYbteN^>atQqq5ohtOJyGa)5o)2(TwiiLo<(EpBG?i*bZPT1-vG$5Qwbv_52HQblZ|q0Y!A~LCJ5Au{Cfb#HI(ocB@`~ zg~pAru61>_3BquSq-?uSh_oT62^Hu=B`$Bv0nG7ZRN0KcflYtlW_1YE zX@s`pmo4dD0YxCS$Cq#A6*lSH>b%vD_l2pC5>v{L$LsDCEa=#9{lPG=(q|!eJA>O? z-vjn~y{1i8Q?*^;&PtJ4fqc6=%4*n97&CbzF$G^i+|fC`8rMPw@q0*VHthNhrMZ%P$Gl&bO_9SrJR@Z**$)11lq1-5+QjPD;cWWn+F+7Ua#Lx?ZqJ^%5@Ijg|{Es`jkdhb50PKtoJ!LV)^tsv;@wCUY5 zD{{-cKQOPGnwJwvU06o14g!g>^qzsaxjucp%e3Fmr`FE4UBF(0N}g>MmsqK~w+4px<55Ir1cnDOM&wUho zZ(J0zq5cWuh^oNPAwL4XEqf5m3Vm|HgWE16S8G>I?xTai*6fCi=DaOIkjV&)GVu0u z-$Z^QlfosSAKNAlE#u@bcKfXudZwA;cS&6~R;XXVtDJ>P1yE2f4eApR^ zJ85Ta2TBS0u`nm(Z~hVbe|%2EZ-Lls5QwcFPjGSuJFhp9-^UCawC1Pv=!qa=DB1VN zPI7YptJAhK6B#iT5C-y7H2-v~xX$#mmg2VqKu6sKG!4<>SIa(V%YZ1Z_#$R7*HA}SJc z)z~^05DF2;4E)#<&SM?;?U;6g9fXioT%T)@SkZfx>SxxIqbn#sh0K@%G?_k&VK#v5 zfvqrPgW)QVOKvAr#B~>26B3=Wil~4P5j7I6*ao=EY>MmF@&an!KLad<^@^@5bHlD+ z6@&JL0Mm}}@xHlx+rkgB?hdpLSw;h+g*QmQfD-Pgqp&*qTpCo-@WIxgqP$5s?p+3P zL`k1T)X9UadXOUH6wyI_e9VK75DcDpzb{;{zGNGCt+FF@{PSf!%jFEvl}Zwa9~L_d z?>IbI<+C_$WZ~*sgpU@?M8-7%Zm|Icajl-KHTu?pT`kqf-FZ@4`l3D_pz5}mO0@w3pa1|U2F(on4TPj#x=H0%_4a}BCa zEsUI~TYI~wdv4CjDl?2=HwMt{KA1<+#?Yx+4?2?Boek&VO;cB^b?kcf{noK5F|{E3 zC0u#@bnH^yJoTfa&v8E4#V=U7Kdu}k`@ ze#$}C!$q|eGnw{cQd+bU{IXM7M*hnBF){9g#?Ts6_8mo zMeiWJ#u?_d7dQVMnvma9e{-WD5t<1=DpTor`s9(#KUwaX0c(PC4EhdmNRimgMFT>h z_a86_8q_|R(Egc&(`5nN7@NQUq%NhI)NThkSeyTKRQmS?NaO1LvOl#1a#a&LA4A<6 z{gSL$UE)D(`zQ5e2r4BSTH*kbNdTGzXm+Ut)o6egCIeYS<^sRYstmvK=`|}&uO=0b zpLml05k95M5tK@n*}2(@o`?S5sa^lA*;KLsZY=5CnH}|yh8!Ck^P`H|1D3`L0PQ9V z==lL$Y6UnO`cZ+|^E4&JdNQPw>Hgz7o?n9Z;@mm^o01^?S&Vc#*Q7`K9yu3biSq~}ZiS^nNJp5_-Hd3tX6Qhj2-r5NqX6VS z7;xYip3B{aox@!J_^7Wm2x46YrWW#9sL)E3 zCJz}?qQUD`>%`S*vB^CC_YIPPA9>pJg00(L+XA?GX?{^vGjCThc^n+;TA4K=1{m69 zys8)HEoEyW9W zof&FbQC7n*>?-iL24cw*P>ix7MPM1%zMqi1(8e56?XPq7uJ#;!D(;qb=h#gTlcQcx zIC|)eRu0vQ7+NPux6K?m=QU--BlnV6ev~n?B(U08T0@SEMu#~Mt}lu)=nn})5TEMW zNUt%j&Vg11>dJ4p%P8vL*=KLwu4dG&Ecu3ngyFwj0PN+naZkjD2s-@oeP48eb4)2o z?qh556aFE>b(1>hkhixy&nia_6ooiMVwCOsg6`hP(AXFnvKSK=z1zmWQ99px=U&Sa zIa!zZvhC%wxX4*r%ToVE%A1bWe3$r71WZR=XETmt!|N|xLCf(h5wM-gf%!E^({$Rh2wd@v61s&>0)>Hhi|+$=<=?!`<;#&Qy^icW{rE4-vh~y@+1)M!mfyE+oju?)i$Iu!u-wqG$@a7JF#NZq!gG0-f&Ge~>b? zq*iDh0&1dvvZ@l&yTzc3RdkrAht_X6gY1j2vZ0j5S^xf4F>raku~B;N)4X(W;HYe2_d^bD7QJB|FM#E2w<-3|KM z@@#NAuhQ7CpwEWl!pr64iJJNLjFt8@iWdFeHs*Hbpk(f_7t4&e^ThJDjG-af0&EpI zg~)oV>w^|o>ER;U;&Wx?* zpkt5w%i6yABa(q{o7Rd0hmscsuxPShDOH_tCcpa4R9jNHqUTeo2BJ1j~A7kFs#M#wea8{d0Q3+Em`HRlecXs_Er|2QpQuUoq%I-c1soIX<~5BMD-}( zXMJLM+X08lg+~XPPRi?e22U@)TqbLm#ND^Pr%tR2dsk?V!D&g>qO{odrl>wxxvdH^ zQp7i8Z;&DcfBdD^sHO7tefTbykq2z9$*Qp+qX^%Tr8O9|@zy~=N)ViUUMO#TUu8aE zNm?$hI+`Gu2@_t~DpOaIPjpgD7fepb5zMH1ub;f-ltCkyV*cAN)R|+00VM6@S=y3X zIf{4J+P6I1PSMa@y+Yb+_n}d^n_UjatnEF@gx)M(NU=JgT_VYvr90+p$Hb0YR)5xg zKR!zCdcY?7YHF%RP;)B#*p?eEx=R8R9y7gNn%Q$xSVFL7y7{Ty;*rrGmt_XNXVY=2 zV{DfBYB6TZq*Qyh=T&U3mPXf3K4!hf3g=RvxI)u5Hpn_czF6Y$u#GAFluCVjIcxlU ziJ<_!82I-*aU)4PUTluGW&4-t$x_k#sE3@_n0g1phS zAXmwZIy*+g9NoKd-~_DWbeDCZ>0<0Eu%`}3GoG@WNOIGawa*fW8xOxBI)aUT3~NHrV2qVDRhnq)1lR*hp~9vB#pnrXi&=on*p zN43(;U&k-^uz3gfZF=7_!jxa$+cTwdMQ~;x_6u3r$Y_r52lqa@ZN7ORC(}2|C01?} z!)}#~+4AhW_dT0i7nc+)?{wRu+x_`pckrbxyL!!72jPx+b$UD-PT6(l<^{=k8d}sq zsGq97A$`lb>+<;+!*d1+&m8@Y?zdr9_E^eb-{qt>q?kU1NnHNn>_qs^<7&a1Z?^<|JH$EsO z-L7u!BOj^uwH`Eg1_@lJ4t?+5Upc9sPwzQwS$E-qk|4I4v7IM&or1xNmw$e!OUvbbgfoc|Py`4_+|8igk2{2q zk|Khgaz8ac+$%glU+B1b1v}{Z1adLAM)jb8|BX{aMbFA={ZP#1^T1ztXDMcBI6_dM zIz3t3>YBzNHY_#d&GJ1{H4Df7`#U)Yf?5&N1?2-V*IRq#jKeEy z5XyRs6OHj}d%wn-L=H?gX z9$L?44z}qn7MP_5q^&ZfLXrhWsGrju@vOY`8)n5}&#Tx@8$rY*4%l&4v~vzD+X z@m2afez&*8!FGZSxB7?Trv^`Bv$7WmElx$1*?p%ar^}74KG%t`im#8K5#{?7aez@J z>XH0mv0V+JZmOcq6w$Ve8JGQv%to-@dJvpnwmBOw z@77jv5R|}V1V7(*Gpg2;x~pPwh2Ym}%y1U@5a;7f5cdgw+raF;Hl0$P1^54olo*Lm zvXNnSjNr-_e-`j2=`EqhQcgXJIsxodUQNgAcNRX21bArWEH;tl)v$h-SSg;fQ-tJ| zQ&z;}FoB?A(a_^=F09Nb*1gTuF?HXAZ(*1FJCuB4c3rxZo_!{7XF9#x8jhD0SvbgH zAkL$&ha7(rym-M*37l#lenq@+#7=G43e*@BiLnGTNqq}c)J2HGH;9N0zfv#e_{m~~ zH9qjKg{>c~tU^nv0^1rIZ=!ft_B9(m< zjdih+x(+4tv6o*0(%VsvMyuLtMtfK(2an)(kRDSmF3Czr)+)i13~rT<1%!Nwv25Q; zDo!YKAb1UJM~L`8agz8>Pkb50WwBzTaccee#Z!AC9dGcG&C0%#fG3)YCD%$r< zGJDtPLkcyWyq($o#}4f~ryq&n?oRqvcYGrFI$x7N8p4BeNjWDvAL4_QelQfUG0^Ro zwxwE?Is6)^6YYi8L|e1|Sg$+dIrL(QE>cfqb_ifKLe(y8cQlJv-D`Q+fD{8L65CsQ ztr1Pyf4vo4ZCM?SS4OY^6v-T)(w|>!6 zbU)%2Yy-}5z||0Y6(B)GEfw`PH0?WMLX2vslyXptmT3lv-TfAtOnT*GM53wR%MfOs z;MBd=!Wo%GVbgIDSSBf^NI(K?2nG85D2^C)mH!6}1mZX+_}nK8}hIVKiTawsmD ztI%>d&d)_-yM zkYMJkO8>wi3OjC|eoAfe9{TK$#F7=qUI2i|i+m_(bYf6SZF6{j+?E2SIi7UcMNWJ1vwMAnO)#1BawuJ8tUgYc!)pKD{Y$uadTRn{PRkYDZiW5<$q#MLc`#X!higOwk7%_n3Y%UGr%8q4bb@`W~A!LK(+) zNa-7=7_OD(=8=L!_U1|HinGJumR?<>n&H6L@d?DgkyAL|&RIb>n)Nwc^^UHSkiY2g zE+omb1RHm4LlV?|GR`-ddZd~6(i9z(9%wJ<^Q1=_wg*!3;FqjU_cppOCv3v`VWm#c zAScDr{qp$kd+c^wfI7LVq8Pa~_gy7$V#QVh_8#R6TIW;vrU=*Oe|#KLOkL;_4!Wpz zaSLo;{s|B_Kq?u7hyestiG$#wuuNdNh5G*EsEUOFkD1+B$Xm6Cy<7kJNECBEY4`-8 z|C3Aj5MSn{&NW%@p;T#aJ50|IU+My2{D8W*bI)xfetuJa>%*Ntoi8lRTcYzm&Y#!* zpAz}JXy~Wo`w%*_Q-fL@E*n_lQdtAldA#++LVSjN)eT&`ozaq?@-cv*0KZVF<3{Ih z6vqK%OyyE#I3*+|*u^afU7xu1@IxUxCcCo_Vwquw`SNU8`bPwlN3@S-C+y+p?Z(_l z#DId+)&0>)@+5?H0lLv%T?3#nwuc||a_aS_!cUTD<(NM1h_S2FgHvz)^06EBv%Vq( z`vQsE)Q{HW2QJ~Ijgyr=b=A!hg18>G+N#?lRM*6{{1R38aes`{lt4cHZNL<(dHI?K zMtmMKTx{MF(vfrC*-RxOZnanq?`nb&q4=+p9$|wKd?!eLS$>l>N<&DJ<81_eR+*Zqg^^`=JQoTWuw@wa{!kY@Wtn;%W=oE9bKM~dkPeCc=Y}e`p_=R!kyfVL%q2~ z)(zTdk59|Z!hvx{UEL{OyA>hLtEeH_r$kYheqY+xj2MiLe#sG>Nn&<&rAxb28Jyw^ zfXSI|4Skeli@|lhV?zRk>G0F26tjr;d#&ftD=q8aGf_k)IE48J(^^n|y~W!tPgAY< z^~H-V1{YQCZHdrEIQs~xDKHDNDsx>}xqJWpbGr#Na1wi@NEby$5>94YHu%prolKFh!S*Yva+FkT_4xf>c!WOZ!ND#Yhmv--EgYMmN6@bN zN~`*Mwt$9L)b>4w`<=Z*TGA6Z{iDMk)7=wA3hwT8R!V0mtvBWia(KCmGV1_W?w!Z7R z>{=O_OEiT$^KzIk1VOLlyyeZtT4b+Nv%}kicuB?wU{Y*qO}NE}s3WUg+><}xLFN7(dYpfR1oyCNPZNC&k*s{yUE6++sp@cz zip%kbrh9*`XaH*qeewzT=V>;EYyNRNU|kAcyr%894t7IV62dpL8o{XUL&D`kWZd?F zKLLIGc%GMgXV1`I06}nOq`Zz?WvGZ zvl6YrBmNl^qC|;?JL?hRPDXj34XSUCE@#mFs~oyheZN~vR!>4cub1)3&YXlK$JJFQ z5)YAY#L;BHkLp2rKEm$V{%yoMBp^G$;$GFq@`VtkwLI;V)u==Yrqru3#+!yn7Q2JT zVdTjH^%bszj$0{%4g19{o#L(C%g~Ovk`MGp1OZs;!h|oEauuLD13&|aQHeG)_<5Fr z=a#svrNaZEOLu9al)kNT-&UY>;a#iEvggL;hG|vAZAWpSW)Up)EIJwg76)Py z_l*n9&=$9a=+yo}`b$}B$qEy3^DC~^7CdHr@axv*X#aA!YtH~w$xzI+0EM2G#;4v@ zv}|Q(<|KSEKV%-SYtvNF9{-_dFv~D`(3hlJsNb;W8e~@7L#X!gaq6ski7ygN=DV$o zp!$3$2^zG%h_c2(Byh2sh5aN$b2y-q@&mqB86Jxl>aCi=isKU1qrExqunkh;6Oo3E4vKILYVe3L^@JIZ<`;FkJ5EHu-`RPsvGln_5Y zwwr42?rw^W6Hm9%I1)*Lbf@NhC2(4OoZJ67o^aAD=-NX$c77W5rsaXOJ=c4la2L6; zhjY^?tzOi7t(JiRHg~YR&Wnn!%P+5E8sioJ;>XaudU8@1%E*X^08MnL z5j|;OD>Nw|l5zD6NtBWFQ->l}=FIH@wZwb=7iZ zAif6^WH?P&(!h)P$hZNZ%2BO~t9IwVSuiWtW@{2dDHXP|KU{a&U&#Se-UG}K&GMfFcfJzPmxA zkWOs;Xfc`!^c?6bg~B|CWZg4mWMo^Xd(n5rWzsmiWik_mv%MvHDX{k zwN1al^NccWqp+}y{82Y4+I4jQi}PrgH6MAfL;7iZIO|!ZkqB)CZp-U+%rLvdz$ns; z7j@YDgqJ@GhVX9>{@uEK$|eJ)?OcUC0hIyYkJxAn!)XXrgv|dubG& zwf5-wRx|d8d{YdU5Y%?B$#`B^88a}vJb{qKdX<%qd~3eM<^Ca&p45-xwl`exI2mHA z|6OP+uB$@D(i>-0*t)ye>bf+a0Id#m_cZxeXkx2?9C zK^@KmsVJeIxzA$NHXd^wdDOdid+2Tz@Ij~U^Qnv-Os>#%Dp!+(`en53-`+ zpuxKO^|kSZV89l3>sFgOWnA4ATCh1|{|L@r_nAk~$Zvk^KSLZ7o8h@zcNgsAZ_R^= zdR_CSnJ<|V+C;E_N`vjW07R-I9CW4!h=+iX#>dkN;-SvJ3Fcn+%4>y*pj zd`9aPcy<{C^IxvNkvk{YUsg8@hf#ATqN0zq1cr zhBd+dXl#5ANQ0xx{AN>!p98V`&!FDtdmRY|zz*Vj`&Y(dK*IP-X@x>UK{&W(1kJ!N z*D~yFe9d5!7k=+UmoxMoReucGuzt@RD#$#M9~UeSz6iTZCtPeX73#1d@eodVG zXB|Rs|NO^zlx+o1YjXebH0=fGWCEJ+1?D;E=U;z}yq(PQ$oxmg@)M68&wz<>|4rIi zWWU>jb|A3fuOoSQFOWOEeZRM}6`XX39UOYL*zNe^!e>@?-9wwBbazhp*Tuvlt9O+* znUaV;D&ur;s2i*bmVE>Ycc3NxHweYLJlE`QOE_pvrE<4Z89^@>f|G9#!_b z=4*Bs3i$teYo^-OhR)ff>Lhz{Q8jU11zPzJDm11a^q|$wu==yW zL1WFoDVbIGj~4<)qkNpZACM@m%_JxX9%E-($lHr)bD1)4uc*EnAIDZ0G`-d%Uo0E0 zbU*s1P(1tXJL;8W&vFrawWM)nWDI_x8$Z)>!`#`go=S0H04ja2YAVvw3nUp;p^MzA zF?ewkT88ataDFyhtp*Iy<+kzxQpa)HXA*-%DkLIb(cmg0!dy1J{O^9YpP{~w+3 zlHc+?8nGb5xMn?G?1M(^FC4t?VfxaNCJa&>@WL3Y0*VIBetBY@3x3I=p|hia+2%K8 zU_7>`ERSC5xhxItipz8i8I^WBFujh_&H2=0gYowae)J@}giODI2FkP|1TUET@jmZw z!wojXjI+G0*H@>u(4;nKS4c4*2`=UE#0tNdKI1@Q&hDVcmyN-aq&kBAT_x(bb)O|R zs;Mq)e$t{s$b=>wLgJuw=ZROi)8h;hv9~7h(XCFMt0$z`!ACp)COMaP$zB@iW#|!e zQpCltO_+C`16!4MOq~5adEYa4cmLJ~v;{t0Y10*xTPl=844!e5aSTbttu%B7qbq!& zt?T@;-?YK|J?<~ErPK%&Ze@wfvwI5ZX>GazUXGV?o+71o>puS78rT)kq|XZvi40kB!jVC+K>t+anGX<4BuGHt98GLiTypt2-gYakX8YK5@fdV} z8VSRR6w3N_^b}O1^LS>~yMFeWlPxH*7salh*sCB z#*xR}_J;er?S0LRSbo22uRt&{Cz!;6UF__5Q1=q>k(^#~iMtMN{LT6Rjq?A9s52(! z5DErdSEr>RSxaxz&86?P0&}$Rn~B9DTb5Wf8d7VQacHeVDk(*3$z|omO<%JFw4KPW zss>1PUY(4Zz4ngY7Ej_dr*QV>VeVMv2wBWy6H}U-Mlf-Tm z52Uu`%-@rm*#AH30!CepP-KD4>Kd0k$`+(W%z1rp*rDO^@6w}uY|$wMx!Bnrx8KMS zngi|PpEjv{tC=IqA434&t48Pn=7D+nZ|d+qA4_8M?jU^KXV;$Ut!P9ZXG3R?!tb`r zjKi3o1*1X?%z{v%PF%Yo|Iye)bSw4_-|{~CE<@3D}PoaNLXS!A&N1@>!$N+ zgtb=d18dS=T_P<7WJeL_p7(R8$v^gfSeESs{>!^L)N6=o{FjXeCi+Qm%_J$M?P^)> zfEuA=)nV+kf{Xv3ZB7BXTE6a!oBG2#gLRA4Ep|R)56W-TrGCLj;RKID2H8L6xeEk* z{g3j!&!=pEJQv&#Mg}O$o_s??#}IX3=(voY7 zZ%w*8DaC&6zqAMAig!>W#NG78)tZ^3;ZDC<6=1?s1J~2sx>qN`Ht>vht-^K@cVcq= zEa!uqqrV%vz&*H*6P#LKD$inm$-5?9?2zORR|A|FN#!`_AF6KI8g$>8ekokRjoUli z>>vFh?4Wj|0sQY>6l35NV$}OzJDRC+ULGOd{uKi@gJ~J3+=*Xq`CJh@0-%llc}_Gi*vT;{z3H%Q&Ki{FYfB zp$%65^2U77<8jw2jh1m~l%?9C4$N!*4oGMFgS(pK`uDki=p8^_ZYrgXo`(?CHv-bk zcTEo#<@yv)fjb_WatmqnZ}kQ&DHc%jr9)@l#$AvgTQkLS4whQA8Qg1$OW=E!2b_(t zCUp?B+Y^%jK&sbS&z-G$l#mBG*IK6sD$8k*PcqdRj9ILZ(Y*|iEav@jEFKS#tj;_Z zw^ceC8X=cr{}YhwBV{HHH-#vbKmmut0w9@w^S2Ldw41;G0LcIE*S;ug>v6$DMDDYY zBl&$s1%rwwFen_e0x-K*Bs|9a`7!O9fTpvoJClRg90CBsVUVt4S#^bE_BttrNF?G1 zeFhy2vjd&CQt*-^?Zt4Xo<6bSn(LsbCdz58_V*jW7FY6e8_rm7_&3=HQC>p` zV_vx9D0pyfpcZ)1D67O2b5~c_sB>-bdXQJU@)O^Vw8qwfY6?)G5xIw%Z-iXk&JB|Q zh)x+dA_w9v_O&LnIJcQ=?XtX^G(~$6J8rl)KQbG3xlizeBNx#$At8O z0BcRwYmLU0*Ez{$z*pb*fbEdIb;u%`zT9)C=-sPaPo0|8@x&gd7^@2B{<0?o>uUb9qq|`U*D_`V}_iwAHvvzwl52VMRNv7 z7EJW7kX845LTVj9?};x{%`y1UcYDX6fD&XkJ%s`RRnnQ>2}=P%0yHX7bI- zY&F?=wCQP2g^Rg7C|WqUZrpN4rXW$luZ)Dtz`&(c~*M1UFPP%%egAF6Mph$l54!RUlv48-%0~O*g?YOY_ZP-P~1`M zwxnfEU))Kn>+N*n)c{KWO(*q`BXYBr)!t|~EL~c7*9aPDf~w^y97x5km9>vJ&swq2 zc8Cnk?Qm~$Ev-*CWX&*O^=15-D(@IB=Yea4kd0cOcBwkqSV!MgTK*}YkB_*E>@~Dk z2bh#AGISw!J0)4Eh$7#O#gq*c2V(uJoae+f7huH4h=e$Ux*oGZRSS9fGY^GhP} zp$P=^bsW{2Db*10pyk`E+}j~&2eP-ljHjqW0dC~}$+S~i=(9#E&lUZb%Ro*M4gg)< zKq7J}8%T>@yz#+C*m>c_=Zf~wpaQF;CHUSB+4)Z(L3$*IaWVn!GDXp+Qls7!%Sn0~ zK7S-b@ExSg49b&0(ZQhLk{NwT?REp^LFV%Nc2rN*dV90Z&N( z!i|;=MrHnI2t}Z<1~gJ;xLlo)$~1s4dv(9{GWJ+}&?@cw^;)luZLfsopmD&U(c!+5 z;Cn8+E%=LFMFR^Si2-I<%lnW=h9nNq?;jkgYnqwzFxQ=&hGsZuL5}`Zl@g zlZT}29`gIl+ySXtFE?zXWk1E8y!xysc#F}Bi8V6-<`nO;9`Ymd(>!sW@*_{qSlnHI z1kyJXU8_E`KYYVMr%V!)pSK-jWylJ(Cd&BG6OrwlNyUy;OT#+^-`?mb^|;ylM?D1f^D5`jA9R{#XweiF7oDfm{WzS3y7*fia*pK z_b`1d-Wn%Md@}-g#@$%BQN~veo|{m{-%JT|9xr%Z8rIy_WNoRh<0YE1o7>EPX<``H zMGJp^{_%cpu{Xy@uT&mE2q*Ns=ytp7*nG0xdNvzMI_^nT*_uDnefi=J%VDLNk_JmA zz2V12o?@B$cPR-@MWy)JnpTEC-lbwAlxcQePNd^10IaI#=pl=Zz)EGQp&HK(IOWa+N`i zpNGE2lVAXoRq3A9OQW^n-F$?N6;|HSr9Jyf`d;EZuh!aom5P0sH(vEZTNzIppK95b zwQPRMckWu^Y1;=*`_pX;f@O^+Tw*^Rz8F^jIDxT^T6tR|t@=_CJs9N240O}>-xXT} z6=iZft`P6P-@|5Kt3%E_!wblxn0X*4)gAh|Y0*{g9PV<**d*(3w;1 zr-ZQUAf8IPB>$B0M5q{R0F;k$TnZ|{s) zEGjUc24%K&XFRA2T9P=R-mD9<0qfM_=tKz6CgITbdSIEFDmJevX?((z$rv%~6~0=( zL(tRo6`gv4`Mw*Lfvbz*DwFe>dQqYJST~$AYU#%galxRKr{WfD6_rolztxqYCk&~!Jv34X%;I6^q*;0vIV4N<==QL?GlBHCqeCrii*lg zC`mI*QGJ1Wwb3l-0+=&Bv z2qsakygf)URMZjXc~34DH1-F%oHCXXqvTHKLh@pDyMF*<7GQe0LXoEui{4+FJK$v9 z6(6=1&N3V0h`6zf<-FBw4 z)L47#ve>ho#QQInDt8&AW{zKTeDIQej6Sd$)_A2sI-j#+s$lZvjBHvX0TEo2ukvz2 zQTgNFwje}p1dD$E7|&QUHNCbIw-7WhItO5Zw!%kiR(?FDK!wNI%3ra^C@ws#U0s_V zQuJU(7%LL0PMCeP_T;wE=8!|Vk*zZFJ_Fd~E~V}hj05>D*tJvoDTh>Eceve+PNJC7 zNKPOn&!xXAt8X6v*5)247qzG=)P%PE^j6hPF1oaBM-mUCf|K7ig|J)9GN|bV)q^Lq zH+?v~GfN?*I`#W$6Bd&}?fz$qBHkC;#sHu?lk^7UmPJ2C9aP<~oZS(l_aHG};8F)% zJ)PB@P8saAyy!}(qf4k2)NRz$ij*_N(xxQ8n_|~qj*XA|YvsqVo)oOvs0#wH@t%BB z$zCH>HG@3Xz!Dg;_YB}dH?Q_CtQ9yhgCsLY={$=bb{UB&EjsB$xJP_z)tec~36j)8 zJWXfdmnT+vtZsoEzeNH4AXJK+{S*ql@s8oTV#tq~Aw3{h< zmNRm|X~LkEAf5pCAr?`De4ls)ruZ)awR=G&>;fC_ot5FD=U+UJw-a?#njio(QHNL! zDDZt3A{`D!W58fsmj84ki8CE%=(ycTEGMoOaBxU`Iiz%5-K=f+l;Q2>f5cMnH8>Gm z5FSM;X~j!;Z8RYb-^rmJ$)N7t*&p{N-<>{-?#HmiE4sYT$DYpDel`ERPEYJvyl@(-N2>vR(3TC0{Ot}9k8mt=q)k=Jx&Pd2Wujc|>r1Z7*0eIg}rJreEE zi<7G$-_qdsdI3mIEicK5^b}i@9eLk)c3h<3@{6xbOS=qkyKbD$vq>ETKuK?Awc4U7 zRy$7}=T$}k4=Xb!cT3@#{@36I9(~5 zfB>dA_ZBO^)f)kGj2(jynFNF9?pDhc+ZMc!lVdhIvz5Dw0oZG*kFhXbnsKwcAK93k zKWe$NP*iku(2JNP?YCfuA!{d|^D8Pd4?N<8gWUwf@aln))Yw^wF$V#PH?gI_uycwbnlZIDPgF$Coq%-8T zg96u3?A`1!kGQ+Gb`hi1ZDwU8y8HnfFV17buV-x*9q-atQqNssbjpvhN*pZhjg1Tv zW;WBmn_9KYEYEUorn4Of%3hFO80wTl)yTQGB*NWhALJU_IK?PZN@NIuo!z2(5f6Cp zsD^7K$!y)e8`%>UH<4E&Cs(^RmGAOluSVY^&0#I(?x5{6woY~C&%q8b1PF`rYg3JJ zvT3RqRrck|1z?9(2KD-#I$qW;s*u-n*O6jGG}d=IDBazw$gWpg&R61dQyiK~uOp z2_GWN>>4$Z9yY@7Gce3L5>mI^UUUulK8jUwvMjh^tuMwGJ&8DB@X7$bO59isydW^r z(YABBG0kj;+@}b>z=wmk8`wa8&pz4@P-MxrQ$^T%Vk%%!^RD^XZ4>Pw3=h))Wi*GU z#KcN4U>c)T6XvSp+y7P`Dcvu;lA8O>*L$yye+Fd?=+Cu``i#d17{`=Xr+4` z!MGI3i|8QeOIH?INp7yy-rYTt>IyEVbY-NPR=4{e62>vLX0<0#+OBC&uPjklN2!0g zzT<@Z42@Ka!BahR9f<1Mw1Msq9!JbUwz{$cghUoSAC8<=^vAVGV)?44^76*3E+IU6 zF89jjgq*iVolFwmeG9L_cjtcXVw-tUA(s4Ajl+vMA-S6RgxgV_RurU@1D?KePt%56 zOC4Gqf0h5En4Qhb_-gkW=yg2tjo#Pc&a&@}oO^PUU9l6P%A__)@uJnV+3j23OtwaHdE$xvZJJD`-F0VLXKVehMnorBEW2a( z456-`@!|Fc)u3jBkLlkff8f;hG@ZT2TqN)`tf=Vz&GZCso#U^*b^9%IrZa>yfel{d z7oKp;E+N5JrwauvD|rzZ%osSnVP#K>nm3kaJS=Ey7(y_f`&yTY!BQ~qmL zbMPQZoHQK5=tO5wY0P@uYnQtU&1GoV=epi>*uSoK~ zr`_rpRfonhj9d0Ur7NPZoOuNOKQe(*nIB11m;UCndn0=*O9xdok2VGQWg$!wj0Hj; z%!4`{|9^3ZO$XsGyauru8{Ax6TvY+ESeqjRUC6_UoLpE~s5t>U)zaRM0gNcV)PD-d z)^h-A3r8hxkT=DztOs=7S>T0)e*bSgj^OcM`tv_U`~N>H+iR2t)q(gDo_`%vHgTH9 zSWEHl73-{({rqi_V|CE>hU+xQc^`9y?KuXH-+)DfyLu|E7ce#{5E*e}bXhHDf@>vI z*BQbX$Y4BK)!SC^8_o0;-)#c0_W+6pof>|^)H=NdmC-3~dqozH?C|gA%GxCLb$U8hH8{UuWV$%AUTs|pSaKubrjf;I zdjXG{q@j3hd``O;=DR{lkM(P_BQU)rXbpgRjk18QfHe6TB)4w(Hv;ltzmwk&0G3tn z{?e^8rD8g_shs-AJGaR?J)l|!ZPkW8lYfKoaSLbo?s&vXc2cmOTVeq9Jn(0U;9ECV zn{en`Gh1Fjl@LI2ZzqTpQ9!bBiR_xvX1&)uBH=wMMxpLzb$ZEpn%6*R@@#ejzkk~f zYl+Bk-uj>|p_hS;2|AS-x+NN-RqkAqA5Y^LL;(&+Dgmz@e?jHLBd^4nrF#@lDz`e) zB*M|BX@Gm$#m{b42r4=|<`CC`H7}x>qoTbe6i$ejeD&xF!G3hnrDdjmBpid;$$=FQ z-06U1Hp653LQ&ku$$PZ7t7B~EMkizH+_iN8eJ|4KQTkpJ&y6%6B@eVHSE#1d;)Pj| zoqjldAq>FkY);K>qeM4Po<$yJ9QgHxsVdT~31@yG#yZN># z;#!EGjtVT<_JqBu-^w0W<*Hpqbvv9$DUlMhTic;_T>%6x5 z52vfh?cs9tz_koXm&G1_Z{n)PTL<_}{qp_r^RiVTKBnd)(_>DgR|rLyLv@64MfqlH zjbe&8r?k9&D_d02kC^my`qv2wKXKmp{u*YO)Wv9qsh*zR#4MBYgUCPxU$N( z zu@GO1e|vGd=4iKYV^7})^9vs<5RP3}65sZiUwPmrfX!5;F~=*2+Vfbt6t8)RW*EYe&ODWQqjdJb93*B6&&BuH^= zOw0Kcc;}|=^<%uc<3=u<{XX)Dq!E_D&KRNh?hCZINY)CB;-ap<^9V!VeB?qPh>%wq zmE0CLZ_A&)JF>J=(9uvZ_ME{r7-!mWJlOg?&D5E`H#|SCZ_6ROh#5k2qHWK@s}#Iu zK*tcR=9F9mz@=-6KW-;uf{OjVBv)Nm_U!-aL>eQfx1i{~pSZgH56F$9CurPPdtceu z&Pehsc}=e^OgFnADu!50JAc&uUzL4VRFmBnt$(NE4CXyMlBA z0z&AqfHY}Rr56RIMS2Yp1On1)fIvbINJ6Ly5R%;d=bSO_%YC`~@%zTuFME%@)|_jt zIo+Cf){b5V(iNdwut#bdKgG1}=8ih)W((Ilj+xdy;Hc@~T@VjHp9gd))Qcdc&JcNK zo`;>jQ9kLqh5sZjoFGUq6-UyOkINID81<^*XfUtTMx&6g9y5m9fANUe;z`MHK+Y1%+t+9(SaL##VhS0>*CYPzbKs3 zGq;a?-vL5=#zM*12fV0#-_Atn@Ml*?Xb(QV3BDa3+s;U9A0zJ#&zU!p7yw?oRYa-fij<3XhTSU|>H9oUcfWI39oN$5-z&tWXab~bm)v)cY=crZ?{Ay)J-L0< z?ACcz0W$soX+7MWN*AmiCl?lE1A=vG48Qe^L2AGVAwgvhR#oz7zL4T%>*QY-*Th+O zf`QG7G{YHs3*?#0h1OgVFL%Lc9>R;or6)0UiHXw(ZgTVbLPiSa&8e1;i@N;62?bew zD-q-o%*<lkB1TdIO~2l-yDITYIB@(z9oV(|373Q|Y@B!Y zwX(bA!EvZSfXAKN#z8f&yJLG2Q{7J9cE->9`jSX!e73 zO(6xP+Tr*UEduwtb*9>wjzqoMbc@}=aXKc#QPECW69bQtRXu597rL$}l;WOez-MsX z6VYS^5;n-bp5p^bto7HYZA$9=rCy)#;G>3ve>_99O_c%q zP9wcBW#L~W(ewT8!_&Eo+a3+xH0VIx_TM0#n;HZ2!)Q}eY@;aO>kmT@WvGZY^!#o3 zjdDEQViu`~Fj0H6>q5}Kc6yk;N`VBCcLuibUqk~O<(LJc?y1f~kKU{jW<0f;rFz9r z;SU^{TgJa{#?h>&(wxz?>CZ&HdKd`|qEFwya1Tlh|LY$G@^`cb5>DoZ1u7 zcH?^|CZ-;p=jc=xw4Wz4-H@QLS+Pjeeehj3pIkwR(fpQ+HR;V0V6~8m5b=W;bu@i# zw!E=|$A&NT&h^{xU!_-(_vS4P{pX~KW6BQ(czWq`)=c#5`Iixc^Kx_X70s~fbDhhl zedBiOG2<))z{4+>J(oFKT1xL+y#4SZk!EyvR}smfz7rSTe#8i8+tn1axP$BD4B7$;pH>Q?}+olorSl7xsqB-U1fE+yb;wq4L_cJ z^7y85mA!`=_Dj6&VNR^o&o1-eR4UcG0#iKWd-0rmIrHm2qX92;t{gFVWTDCqE7nMw z_rdpA`S7q_iMZ+)yt^X!{U%r121Qol#7=L;pRU><%_2?vLUxwOtL0WTeL4CXh^+=VkK8?9Ju5~z#Wd$4yWGJy-Eoo(0QPwjmlvp^c#fKNWx7BCJ^2xU z7nVkxJ55%LN(ARal&8OTM_o>W^Wx9=4QYgK;~#Uq^^2*JWsqaI+EMu3A*!@R83(~8 z)nb5VZnw10Ywgb{j=2oRRvQdGjtd5VM8RKhF~hI*azR6wcltUiO8Sq6Z%X|ZR6QJ8 zJj^M=S1_3dB>!+`iE-2m6+s~{H$W?)GgGb>cMHgoux&vm@bhS*ta-D=P=bv7y=m=U z1*j@NYn-jHxDWjDR_gLlSzKaK;#3h6x=vgeYT{y&E~pDcJ6ld^$hrTW4937*i{~!Q zVE};-lZ5!-&=f_VSuWOAL?f!4c!_+}qfiyN@9hmIZZr)7Pu6!VV=jjY7GGB{*IQPw z*i9!=D|ma~EyM|zX~-#itPKX}x%>kRn&_A$BTMLql9C&t?zNhl$-Na_yt9w>!mV~z z>%@BKzo{$3jaigXblnb;`#*e~U6dD{L_hsi1+~;m6iHu*7+wY2fiA+uG)3^O+yR{B z2#>zGP+*dLP4FIO%tf4fdNizksHnKTV;#7Ki92B&JEqLRY545!`nczO^y6|Ld&yBJ zjv47&dQJD7NcuMtl>m9($N|kMv`l2%@O3-TS)UfAgm#kwD5N)F`n$fM?%IiJ)<(Yn z(sy#zPNdN^;I*0R)2OjJv3bW^d>CHOh{6tWeE}fU?dq)gZ~XhZkml0!)&=Y;A}6m5 z5OvCPpNvXy%ki|A@gtIRaC_GUZX2H#5=?;m^r)nwd1YeF3Vd2miB*TjP4UKJBARF< ze&xpCW7eNN8i}0^aG|BdccDp@M==kJofP*nQmXe&Kqd|D)qBz52`Z3D1J;Fmu$?Ze zj8OC4Y{6=xeiM@}s9YpKS$-A?S7E>q$Y9J#=kaZn#wRDe#3N5c>v%qPFE25yG6oy^t*+U7iI z3adxnbgfrJd19{mu8FnZ_R4_FeUoT&EGDobRxqi%>fI zRiZ~b<_h29Olr;BbMy#fyJ|-#7CIfQ=HA zvkQxwo1x=QrE)<(JPWx$GDURy-|ok$5A@#3Gq0{iU8>enUtLE|8x_6y1X`&`PY4v+#KUMiu-_sYxs0x+g)_7B}56 zaG#btLCqDm6QWrikZ!eldEuH@2ZPJI{Tt^yLKo;m=}xi`?8ya86uJr7%U1XDcbvDA zJ$t)E3f6(&vT?xak0s55&gNS8bTS_ zCDdPK?Zm!SK@KCX4wVkfH|z0*#*HYy{X-uBx}QwF8G+64#K#U>%mPUBE8Zjrs{!wd zn`+uc4Yf;1{huk}?bmpA)XOGt253)`4_8EMSyTP1*v6bVijEdNPRj?8T8RCwJ*?{$ zt`Ux`U|~0M{eg?AVY$NyG70m-V5V5ff*CvpbzJQC}9dnKfAO1

%%Vg9U(MGy}cbZ9j%3Hi28EF3UxgW4K|>D~vsk6mg`I7LGE zB)-Gj2~YEI8%?7e-oQW?QUy3%WHNBTlL2n&`$mglQpG7 zA#>M#WZrtwTk2mG|0e)_M47#N0+YJSPX3ios&;F8Z*kEAvoN*tlmYimT;@*e-_xP3 znu<{>&+aQ>EKOxR{Wa}xeRVQzyGA>{`t^C1h`FY+(r}Q0Ejd!UdcT9!ts~z&%&t`l z=rWJuIZ3GodFCL|M;X#K6Wv3)^$YZTUDkYG4XQK3zFqfE2%vvF=?{!!X&2a*h9mK zGgB|6r9!-Rr3h=`xx(Dco?J&zN(1VA(1=7xE=0~kPDUo8%j-{b>Vm6mkf!xktLp}! zjr&Nld_lAJ2C{Iph_|y^WV;~GtK#jjwsv- z14p|nP6PFqh9HO84s#~*JygGP3*C~Lj`Y)J3nWyU*uf2DH#8+bCKs=4%jyPzGI<4w zKf9uIz0~uR(77?ji6v)~P`_!dGQ<-{Xj$66Bo%O&c<2|VGYpUQ-5cjAyH3NE8s>W@f|pT9@qAswPeXl7LcPq@z+Q@V}#4W@9wKA^6M z0&a2j>r82ptgyy=saLL^&Ym41{tQg%k+8 zNJnPG9rH!r(3ETRzv^^B|A9tH;fb--V)z2Fm8{_^6uI z74^I$_pn5+eJfmprgUwtwU$S?+t{>L|FYrafiKuA2Zrd1m>SYhsKCB&DJ!K&LB%*H zMm?5ip@4ovwdSoRO{iJaQW76qQ>qA|07awc9v=GKzz{v77guTu_h~KG46cWHPD$vt z|FB4b?>sIa-OMy#KFh46h}H1qynSKc^V(BQhmm$?DcFxQQ`Iq*TZ8Z3tysPPj7EM- z3U|ZzY7JL~$~G(!(B`;9v0FiC)vyiTP*uyBn3B1FJoO)q6K_{y>0U%?TEkY_1Z$ga zR@DRhbPcFaL{s3j{QbN-zjV-_DyO>kMbQ~sP16eO?HnOx4r4XdTGjlAQ|CAUFEU5; z<4b6csf?Z4DwLywhtA0X-WI3Y5D`Vn$C)oCVzaNHhHc&_Hu7tO>fn~SisRJt0d?*4 z644T2;wHIiZ#`&Ez}ZRM4%f&d{XEwlY!HGJqXWIQ?kUUQ^@XayhH4hfp^3%fkp&iO z3rfECA^(o~FG<1*XMZeroA_bKgk3n@tZz1zCS!kQau<23hE#D?CNGxLjruLr9&~i%8YFJP(VlLEz7_g+-0f=7zUI5mB(SIj|I&~$cCHh> zD|EUlN`$bE#CL4hiJ=^*T;Uz)%y`}))Sad9;4rn!8R`sI(yT6~q0y;#!O3;w8MV#{ zeIx9mpgN#-I_c%V+oR;3fxd3_S>=G z)`~`UucczO)%$YO8+|=Ew&cEM;u~nTHb-^`S^6PeWP8I6zuEQ;pf->nIcKS?c-f^r z7=fBL8W15rxbJ6w7UNSet+2a0fggqWSCaaX*8dU@M8()l9Ld<~ApBs3LA#ldT##_* zgzY3>kYt7vxCcKM`@U{~3Ubu|ii^UwKc7`4nAxSW{%a=umTjs;y;`9`isB|6cnBL= zlCMRb&Pma1m93%Jcv_I}sAZ+|o7QIK2Q6DQ{1bO6TkSei!^=WTR5!pyZTJ z40-j$ZFnAqStkmPLRa5^Wz528vLr}8I#GbXXb)Ulp6MuG4Bv}s^^OSsZm0yuKD8Kl z3?=_e)yje?m)suJSw2kb^{FjJN>;xRumbzQwjU>4g3$P&k}R^EFp`JIQnYPH*OU|} zMe{e8(a^gW&BoJPyBKopi1vpolt+0$3ALeUzj5+J3uvCKbRa%veI>(Zg{p(JL8uUsiiXZ1ZjR=34y>CPp`^ejW6v|mF0W*XsMbC*p=#E z*Q^M%ggg&d>cNKHlgzy>M>|wds_3ZMx*9T9i2Z^HbEf|-=J*#0>6VKV)&5^C!#?Ku zKbHdI%=A>hwxiFD(f;ln8B^#kaD(fl%nR>gO<$=**oihjo@&#kPEZB`uG} zCBDlIRWja^HC<-9UhhcgSeCI5Olr1Xa1_o*{k*2DndR5Z!epF=x6G)-NX@>6dZ+(9 zb_nWj_IWSYB7`c7p*Z(EsqMoylNZbEUSc><#F?@AL}it^Ty?~o{vE3PquPS8Uw&CR zfrJqQ$X^d=H+m|?l`j+^Iwin*E+jw0M~*Z?8T7b9Qp~L};;? zR7jQNg^uG%6@E1Q`%L@B=9c4@VZoJ75{l!(!L2=P z>f(hSNE}}5+k%{|Zs*lIypCo&+t(YoY2zZ<)>n#h9!l^(W6wUzYTON*Gxk`}h?O<$ zDeaH@W_Xs?SD{lETk7MU*8HS4R<=ik*NOXP>o8$Z(SKwxuLZo0_G)V(Q+{=M6W4}w zgZlv^DkJ{f^}YqV7-jO%uZHdTr(Y;7YyPC1l)5&Mq5GQy=l#T#**}OWDJ5VY6_z#_ z?4W@v6uJ)nRGlF1pcpnPA)D;GJoCbPM-QPMuAG+ODCCniyJ36yO>vejUnG#uf8J!>vv*vS)7~=MY(6HS z7ictGQZs%QxGFwpe|5+G8*YThQ}9#2@wKFUM~4%{m(~8jRCv^y%jWY!bK@0GJN^eI z+xszzHk{3|Vm>Bg1{MM2MPrhc=bxC}RI{8`;XEn(AG?=y&wAtx=FiHbvS$mtUVI%4 z%xsCa`I0XX{dbBnm}NLU6=Fa8{9T7uAzkI9xEt2(fM|97PWs5v_~W!!NLFu$j7i1W zU`!Xn{=n9EW(-Q8Bck8joO>-80KzxQ*)h%$J2|O8&{y-&na?N~{)IAqZD{6MqhkEX zIjOy2T~z8nub7G!&fA@7m%HG1WVI|ldY8!;Xvn0cjD``Rni9{ z8FITy%d0gsRQD6)#ErkneP$oOUAJ;7O48Jc*sDe!QLB@3JVy@YTpiO)--LDD&>vHr z3`9M^hF`I{en3{u>WB9FeB{xvesd6ODtp;^B2ulad(&inCjpfGyA^LpOb~=13rbiL zQnL{!D+NQN?mY&UVF?u52@Sgjva1WaPui@e_};a4fMC$BsSB3$fS`g*MZe6H<~07L z1GqCuyOrZ^6tOoW2w2MZEdY0^_5cq~_j|rccFJ{lBB#HSbZumQz7+TJK82Z{`MUb5 z%Kfv&=W+7yevcn_t{_|(TR0gg)$g5yuL(RO@~E;MFbFDcdNO8Z-3O>a~i4` zPlIJ{C{anCCh`NFnNhcYujg-C4CzAKvxo2hISald)Gn(C{(ZxIJK*RelGnfFoY@V+R|VsNGo1^Ay#FV3yJ6WTD zFZL1vb;OHx1y4^nKQtR{?sbhPRp$Y`3!ZPWyElDf%Ql1@HU3`TEaMGmhp{k<0@O_d ze?m{?XLWvT=@ltFA{Q)VqG+pemJM^CvY6IUs!C~TWg9cIY)OSG8lsn54E7Eq753{T zbFLH(CUkDdg+VW+TbtT-Y8uR?BEfn-X1$X?woc9)uPJ1(&K>*TX1jYd&f{#6Yh&8( zp&N*+uS(_f3-LRfsuk|WoIW5tH=p%F+sBx8fK7Ml|9mu%Jall)GMlBtJ?FQmKaYl@ zJZwB4-pF>l)!gBYmEi1d6GI>ChZg8m!q)a_F-Ym!^e6Jgm2}?oH;Gy7HXS+7BM+>X z?iWUd%RL+QHS;(!rKGG9+~+4NI?tbbXq9`ijt=_Ftydh;uAFTrX0F+J-cFRO*URZ$~)^Gf_9Ap#|?aW58?%>mmhy0h#RE}47XhR z?Z+n@dTBVl7&J~%S9^)MJAFRJgj6NUq{G1{s4b^{$s$K50-IhU7IN{-zJS`L7eeDX zh$Jt5g{@)LjIS<*@(frs@6tDfN4d!)+h3qPf( zQn4;|4_%YJ;F-^F=r{>vu!BO}#_ymwp^c8vDLlu_UV8hkk446mz6rk7X7&l{>;06w z>2^P;9*dTu-#Ru3(WkHELl6b@OLf98u042#*0wM`2^Eq%FPT7BHW+d%=yJ|O_Qb{(Y93F2LzW;W31sh{sDUhkVFM7A2H{;^=FY2iM9 z<2p&g09nX*HPj&vPJM&Nucx?Sj7e2)aKzM43&g!v+KgDoHg(0~{&+C8Bm9GlXR=&6 z49zgeL6mt-7mps^&N?&7pqE?Fvb&XTeBc`}b`Kc5b%}q_vhV8o+x}hE&y9;dF~JZn z;vm?7KxGZ*`7?uZ_Z82yyB~-du#eY=c`TLlZCw0wspa4|Krh^xmoq&Jprowz)``KS z9DZLsaGnqP{5`XnSNY%C)C;fA{F=Y@KTh}H?0Y&BJg7b~F|l1&F)%usOs>qW2vBY7 zyb5ax0k!k}IreYByH4Sm?}F(u^569~|1o{?_un!S4a*x<(hI=w;|)&9S>`jtgv@(h}2C}nJ+{kxNnroKk?lNay*4;cB{ AJOBUy From 14be47a82bac604f3f6dff48a00f326415dc7cbe Mon Sep 17 00:00:00 2001 From: NamorNinayzuk <109209673+NamorNinayzuk@users.noreply.github.com> Date: Fri, 26 May 2023 20:02:19 +0400 Subject: [PATCH 087/146] Add files via upload --- 09-ci-03-cicd/nexus.png | Bin 0 -> 36531 bytes 09-ci-03-cicd/sonarqube.png | Bin 0 -> 86899 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 09-ci-03-cicd/nexus.png create mode 100644 09-ci-03-cicd/sonarqube.png diff --git a/09-ci-03-cicd/nexus.png b/09-ci-03-cicd/nexus.png new file mode 100644 index 0000000000000000000000000000000000000000..1240d29a169166c1d27c1470ce9db4dbe9328681 GIT binary patch literal 36531 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 q-T%XW`QP7J|9ig-uK#*`eno8gLY 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