236 lines
47 KiB
HTML
236 lines
47 KiB
HTML
<!DOCTYPE html><html lang="en"> <head><!-- Global Metadata --><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" type="image/svg+xml" href="/favicon/favicon.ico"><meta name="generator" content="Astro v4.7.1"><link rel="preload" href="/fonts/atkinson-regular.woff" as="font" type="font/woff" crossorigin><link rel="preload" href="/fonts/atkinson-bold.woff" as="font" type="font/woff" crossorigin><!-- Canonical URL --><link rel="canonical" href="https://astro-sphere-demo.vercel.app/blog/05-zabbix-api/"><!-- Primary Meta Tags --><title>Групповые политики GPO для Zabbix Agent с использованием магии API | Плата Управления РФ</title><meta name="title" content="Групповые политики GPO для Zabbix Agent с использованием магии API | Плата Управления РФ"><meta name="description" content="Краткое руководство по созданию скрипта для автоматизации добавления новых устройств в доменной сети"><!-- Open Graph / Facebook --><meta property="og:type" content="website"><meta property="og:url" content="https://astro-sphere-demo.vercel.app/blog/05-zabbix-api/"><meta property="og:title" content="Групповые политики GPO для Zabbix Agent с использованием магии API | Плата Управления РФ"><meta property="og:description" content="Краткое руководство по созданию скрипта для автоматизации добавления новых устройств в доменной сети"><meta property="og:image" content="https://astro-sphere-demo.vercel.app/img04.jpg"><!-- Twitter --><meta property="twitter:card" content="summary_large_image"><meta property="twitter:url" content="https://astro-sphere-demo.vercel.app/blog/05-zabbix-api/"><meta property="twitter:title" content="Групповые политики GPO для Zabbix Agent с использованием магии API | Плата Управления РФ"><meta property="twitter:description" content="Краткое руководство по созданию скрипта для автоматизации добавления новых устройств в доменной сети"><meta property="twitter:image" content="https://astro-sphere-demo.vercel.app/img04.jpg"><!-- Sitemap --><link rel="sitemap" href="/sitemap-index.xml"><!-- RSS Feed --><link rel="alternate" type="application/rss+xml" title="Групповые политики GPO для Zabbix Agent с использованием магии API | Плата Управления РФ" href="https://astro-sphere-demo.vercel.app/rss.xml"><!-- Global Scripts --><script src="/js/theme.js"></script><script src="/js/scroll.js"></script><script src="/js/animate.js"></script><!-- <ViewTransitions /> --><link rel="stylesheet" href="/_astro/_slug_.0h5GVtX4.css"><script type="module" src="/_astro/hoisted.BGfjo5mV.js"></script></head> <body> <header id="header" class="fixed top-0 w-full h-16 z-50 " data-astro-cid-3ef6ksr2> <div class="w-full h-full mx-auto px-5 max-w-screen-md"> <div class="relative h-full w-full" data-astro-cid-3ef6ksr2> <div class="absolute left-0 top-1/2 -translate-y-1/2 flex gap-1 font-semibold" data-astro-cid-3ef6ksr2> <a href="/" class="flex gap-1 text-current hover:text-black dark:hover:text-white transition-colors duration-300 ease-in-out" data-astro-cid-3ef6ksr2> <svg class="size-6 fill-current" data-astro-cid-3ef6ksr2> <use href="/static/logo.svg" data-astro-cid-3ef6ksr2></use> </svg> <div data-astro-cid-3ef6ksr2> Плата Управления РФ </div> </a> </div> <div class="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2" data-astro-cid-3ef6ksr2> <nav class="hidden md:flex items-center justify-center text-sm gap-1" data-astro-cid-3ef6ksr2> <a href="/" class="h-8 rounded-full px-3 text-current flex items-center justify-center transition-colors duration-300 ease-in-out hover:bg-black/5 dark:hover:bg-white/20 hover:text-black dark:hover:text-white" data-astro-cid-3ef6ksr2> Главная </a><a href="/work" class="h-8 rounded-full px-3 text-current flex items-center justify-center transition-colors duration-300 ease-in-out hover:bg-black/5 dark:hover:bg-white/20 hover:text-black dark:hover:text-white" data-astro-cid-3ef6ksr2> Работа </a><a href="/blog" class="h-8 rounded-full px-3 flex items-center justify-center transition-colors duration-300 ease-in-out bg-black dark:bg-white text-white dark:text-black" data-astro-cid-3ef6ksr2> Блог </a><a href="/projects" class="h-8 rounded-full px-3 text-current flex items-center justify-center transition-colors duration-300 ease-in-out hover:bg-black/5 dark:hover:bg-white/20 hover:text-black dark:hover:text-white" data-astro-cid-3ef6ksr2> Проекты </a> </nav> </div> <div class="buttons absolute right-0 top-1/2 -translate-y-1/2 flex gap-1" data-astro-cid-3ef6ksr2> <a href="/search" aria-label="Search blog posts and projects on Плата Управления РФ" class="hidden md:flex size-9 rounded-full p-2 items-center justify-center bg-transparent hover:bg-black/5 dark:hover:bg-white/20 stroke-current hover:stroke-black hover:dark:stroke-white border border-black/10 dark:border-white/25 transition-colors duration-300 ease-in-out" data-astro-cid-3ef6ksr2> <svg class="size-full" data-astro-cid-3ef6ksr2> <use href="/ui.svg#search" data-astro-cid-3ef6ksr2></use> </svg> </a> <a href="/rss.xml" target="_blank" aria-label="Rss feed for Плата Управления РФ" class="hidden md:flex size-9 rounded-full p-2 items-center justify-center bg-transparent hover:bg-black/5 dark:hover:bg-white/20 stroke-current hover:stroke-black hover:dark:stroke-white border border-black/10 dark:border-white/25 transition-colors duration-300 ease-in-out" data-astro-cid-3ef6ksr2> <svg class="size-full" data-astro-cid-3ef6ksr2> <use href="/ui.svg#rss" data-astro-cid-3ef6ksr2></use> </svg> </a> <button id="header-theme-button" aria-label="Toggle light and dark theme" class="hidden md:flex size-9 rounded-full p-2 items-center justify-center bg-transparent hover:bg-black/5 dark:hover:bg-white/20 stroke-current hover:stroke-black hover:dark:stroke-white border border-black/10 dark:border-white/25 transition-colors duration-300 ease-in-out" data-astro-cid-3ef6ksr2> <svg class="size-full block dark:hidden" data-astro-cid-3ef6ksr2> <use href="/ui.svg#sun" data-astro-cid-3ef6ksr2></use> </svg> <svg class="size-full hidden dark:block" data-astro-cid-3ef6ksr2> <use href="/ui.svg#moon" data-astro-cid-3ef6ksr2></use> </svg> </button> <button id="header-drawer-button" aria-label="Toggle drawer open and closed" class="flex md:hidden size-9 rounded-full p-2 items-center justify-center bg-transparent hover:bg-black/5 dark:hover:bg-white/20 stroke-current hover:stroke-black hover:dark:stroke-white border border-black/10 dark:border-white/25 transition-colors duration-300 ease-in-out" data-astro-cid-3ef6ksr2> <svg id="drawer-open" class="size-full" data-astro-cid-3ef6ksr2> <use href="/ui.svg#menu" data-astro-cid-3ef6ksr2></use> </svg> <svg id="drawer-close" class="size-full" data-astro-cid-3ef6ksr2> <use href="/ui.svg#x" data-astro-cid-3ef6ksr2></use> </svg> </button> </div> </div> </div> </header> <script>
|
||
function toggleDrawer() {
|
||
const drawer = document.getElementById("drawer")
|
||
const drawerButton = document.getElementById("header-drawer-button")
|
||
drawer?.classList.toggle("open")
|
||
drawerButton?.classList.toggle("open")
|
||
}
|
||
|
||
function initializeDrawerButton() {
|
||
const drawerButton = document.getElementById("header-drawer-button")
|
||
drawerButton?.addEventListener("click", toggleDrawer)
|
||
}
|
||
|
||
document.addEventListener("astro:after-swap", initializeDrawerButton)
|
||
initializeDrawerButton()
|
||
</script> <div id="drawer" class="fixed inset-0 h-0 z-40 overflow-hidden flex flex-col items-center justify-center md:hidden bg-neutral-100 dark:bg-neutral-900 transition-[height] duration-300 ease-in-out" data-astro-cid-hxtyo74s> <nav class="flex flex-col items-center space-y-2" data-astro-cid-hxtyo74s> <a href="/" class="flex items-center justify-center px-3 py-1 rounded-full text-current hover:text-black dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/20 transition-colors duration-300 ease-in-out" data-astro-cid-hxtyo74s> Главная </a><a href="/work" class="flex items-center justify-center px-3 py-1 rounded-full text-current hover:text-black dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/20 transition-colors duration-300 ease-in-out" data-astro-cid-hxtyo74s> Работа </a><a href="/blog" class="flex items-center justify-center px-3 py-1 rounded-full hover:text-black dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/20 transition-colors duration-300 ease-in-out pointer-events-none bg-black dark:bg-white text-white dark:text-black" data-astro-cid-hxtyo74s> Блог </a><a href="/projects" class="flex items-center justify-center px-3 py-1 rounded-full text-current hover:text-black dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/20 transition-colors duration-300 ease-in-out" data-astro-cid-hxtyo74s> Проекты </a> </nav> <div class="flex gap-1 mt-5" data-astro-cid-hxtyo74s> <a href="/search" aria-label="Search blog posts and projects on Плата Управления РФ" class="size-9 rounded-full p-2 items-center justify-center bg-transparent hover:bg-black/5 dark:hover:bg-white/20 stroke-current hover:stroke-black hover:dark:stroke-white border border-black/10 dark:border-white/25 transition-colors duration-300 ease-in-out" data-astro-cid-hxtyo74s> <svg class="size-full" data-astro-cid-hxtyo74s> <use href="/ui.svg#search" data-astro-cid-hxtyo74s></use> </svg> </a> <a href="/rss.xml" target="_blank" aria-label="Rss feed for Плата Управления РФ" class="size-9 rounded-full p-2 items-center justify-center bg-transparent hover:bg-black/5 dark:hover:bg-white/20 stroke-current hover:stroke-black hover:dark:stroke-white border border-black/10 dark:border-white/25 transition-colors duration-300 ease-in-out" data-astro-cid-hxtyo74s> <svg class="size-full" data-astro-cid-hxtyo74s> <use href="/ui.svg#rss" data-astro-cid-hxtyo74s></use> </svg> </a> <button id="drawer-theme-button" aria-label="Toggle light and dark theme" class="size-9 rounded-full p-2 items-center justify-center bg-transparent hover:bg-black/5 dark:hover:bg-white/20 stroke-current hover:stroke-black hover:dark:stroke-white border border-black/10 dark:border-white/25 transition-colors duration-300 ease-in-out" data-astro-cid-hxtyo74s> <svg class="block dark:hidden size-full" data-astro-cid-hxtyo74s> <use href="/ui.svg#sun" data-astro-cid-hxtyo74s></use> </svg> <svg class="hidden dark:block size-full" data-astro-cid-hxtyo74s> <use href="/ui.svg#moon" data-astro-cid-hxtyo74s></use> </svg> </button> </div> </div> <main> <div class="pt-36 pb-5"> <div class="w-full h-full mx-auto px-5 max-w-screen-md"> <div class="animate"> <div> <a href="/blog" class="group w-fit p-1.5 gap-1.5 text-sm flex items-center border rounded hover:bg-black/5 hover:dark:bg-white/10 border-black/15 dark:border-white/20 transition-colors duration-300 ease-in-out"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="stroke-current group-hover:stroke-black group-hover:dark:stroke-white"> <line x1="19" y1="12" x2="5" y2="12" class="scale-x-0 group-hover:scale-x-100 translate-x-3 group-hover:translate-x-0 transition-all duration-300 ease-in-out"></line> <polyline points="12 19 5 12 12 5" class="translate-x-1 group-hover:translate-x-0 transition-all duration-300 ease-in-out"></polyline> </svg> <div class="w-full group-hover:text-black group-hover:dark:text-white transition-colors duration-300 ease-in-out">
|
||
Вернуться в blog </div> </a> <div class="flex flex-wrap text-sm uppercase mt-12 gap-3 opacity-75"> <div class="flex items-center gap-2"> <svg class="size-5 stroke-current"> <use href="/ui.svg#calendar"></use> </svg> 12 июн. 2024 г. </div> <div class="flex items-center gap-2"> <svg class="size-5 stroke-current"> <use href="/ui.svg#book-open"></use> </svg> 5 min read </div> </div> <h1 class="text-3xl font-semibold text-black dark:text-white mt-2"> Групповые политики GPO для Zabbix Agent с использованием магии API </h1> <div class="mt-1"> Краткое руководство по созданию скрипта для автоматизации добавления новых устройств в доменной сети </div> </div> </div> </div> </div> <div class="flex-1 py-5"> <div class="w-full h-full mx-auto px-5 max-w-screen-md"> <div class="animate"> <div> <article> <h1 id="пролог">Пролог</h1>
|
||
<p>Собирать метрики со всех устройств в сети — это здорово, но не так уж приятно, если у вас уже есть более 10 устройств и вы только решили, что вам нужен мониторинг. А если устройств 100 и больше? Придется много клацать мышкой! Но что мы за админы, если не умеем правильно лениться? Давайте создадим небольшой скрипт, добавим его в GPO, и пусть часть работы за нас выполняет машина.</p>
|
||
<h2 id="подготовка">Подготовка</h2>
|
||
<ol>
|
||
<li>
|
||
<p>На сервере Zabbix создаем новую группу, куда будут попадать новые хосты, например <code>NewHosts</code>. Запишите ID группы — он пригодится позже (в URL строке последние цифры и будут ID).</p>
|
||
</li>
|
||
<li>
|
||
<p>Генерируем токен для подключения к Zabbix API. Для этого перейдите в настройки пользователя, пункт API Tokens.</p>
|
||
</li>
|
||
<li>
|
||
<p>Определяем переменные сервера для скрипта:</p>
|
||
</li>
|
||
</ol>
|
||
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="ps1"><code><span class="line"><span style="color:#6A737D"># Zabbix server: </span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$ZBX_SERVER </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "192.168.0.2:8080"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$ZBX_SERVER_INSTALL </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "192.168.0.2"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$ZBX_API </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "http://</span><span style="color:#E1E4E8">$ZBX_SERVER</span><span style="color:#9ECBFF">/api_jsonrpc.php"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$ZBX_TOKEN </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "b1c4f904b2b56a342912dd0c44c890cd35dcac1f69e72cb23c765d8feaf85f0a"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$ZBX_TEMPLATE </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "Windows by Zabbix agent"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$ZBX_HOSTGRP </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "NewHosts"</span></span>
|
||
<span class="line"></span></code></pre>
|
||
<ul>
|
||
<li><code>$ZBX_SERVER</code> — адрес Zabbix-сервера для URL.</li>
|
||
<li><code>$ZBX_SERVER_INSTALL</code> — адрес Zabbix-сервера для MSI пакета.</li>
|
||
<li><code>$ZBX_API</code> — адрес API Zabbix-сервера.</li>
|
||
<li><code>$ZBX_TOKEN</code> — токен API Zabbix, который мы сгенерировали на этапе подготовки.</li>
|
||
<li><code>$ZBX_TEMPLATE</code> — шаблон мониторинга из Zabbix.</li>
|
||
<li><code>$ZBX_HOSTGRP</code> — группа (NewHosts), которую создали на этапе подготовки.</li>
|
||
</ul>
|
||
<ol start="4">
|
||
<li>Определяем переменные хоста для скрипта:</li>
|
||
</ol>
|
||
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="ps1"><code><span class="line"><span style="color:#6A737D"># Host vars:</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$HOSTIP </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> (</span><span style="color:#79B8FF">Get-NetIPAddress</span><span style="color:#F97583"> -</span><span style="color:#E1E4E8">AddressFamily IPv4 </span><span style="color:#F97583">|</span><span style="color:#79B8FF"> Where-Object</span><span style="color:#E1E4E8"> {</span><span style="color:#79B8FF">$_</span><span style="color:#E1E4E8">.InterfaceAlias </span><span style="color:#F97583">-imatch</span><span style="color:#9ECBFF"> "Ethernet"</span><span style="color:#E1E4E8">}).IPAddress.toString()</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$HOSTDNS </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> ([</span><span style="color:#F97583">System.Net.Dns</span><span style="color:#E1E4E8">]::GetHostByName($</span><span style="color:#79B8FF">env:</span><span style="color:#E1E4E8">computerName).HostName).tolower()</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$HOSTNAME </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> $</span><span style="color:#79B8FF">env:</span><span style="color:#E1E4E8">computerName.ToUpper()</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$AGENT_PORT </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "10050"</span></span>
|
||
<span class="line"></span></code></pre>
|
||
<ul>
|
||
<li><code>$HOSTIP</code> — IP адрес устройства.</li>
|
||
<li><code>$HOSTDNS</code> — DNS имя устройства.</li>
|
||
<li><code>$HOSTNAME</code> — имя добавляемого устройства.</li>
|
||
<li><code>$AGENT_PORT</code> — порт, на котором слушает Zabbix агент.</li>
|
||
</ul>
|
||
<p>Я уже прописал скрипт для автоматического заполнения, но вы всегда можете взять отдельные куски кода и запустить их в терминале.</p>
|
||
<ol start="5">
|
||
<li>Определяем функцию для регистрации нового хоста:</li>
|
||
</ol>
|
||
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="ps1"><code><span class="line"><span style="color:#F97583">function</span><span style="color:#B392F0"> RegisterNewHost</span><span style="color:#E1E4E8">() {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> $REQ_PARAMS </span><span style="color:#F97583">=</span><span style="color:#F97583"> @</span><span style="color:#E1E4E8">{</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> jsonrpc </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "2.0"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> method </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "host.create"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> params </span><span style="color:#F97583">=</span><span style="color:#F97583"> @</span><span style="color:#E1E4E8">{</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> host </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> $HOSTNAME</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> interfaces </span><span style="color:#F97583">=</span><span style="color:#F97583"> @</span><span style="color:#E1E4E8">(</span></span>
|
||
<span class="line"><span style="color:#F97583"> @</span><span style="color:#E1E4E8">{</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> type </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> 1</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> main </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> 1</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> useip </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> 0</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> ip </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> $HOSTIP</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> dns </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> $HOSTDNS</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> port </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> $AGENT_PORT</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> }</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> )</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> groups </span><span style="color:#F97583">=</span><span style="color:#F97583"> @</span><span style="color:#E1E4E8">(</span></span>
|
||
<span class="line"><span style="color:#F97583"> @</span><span style="color:#E1E4E8">{</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> groupid </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "24"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> }</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> )</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> templates </span><span style="color:#F97583">=</span><span style="color:#F97583"> @</span><span style="color:#E1E4E8">(</span></span>
|
||
<span class="line"><span style="color:#F97583"> @</span><span style="color:#E1E4E8">{</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> templateid </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "10081"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> }</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> )</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> }</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> id </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> 1</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> auth </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> $ZBX_TOKEN</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> } </span><span style="color:#F97583">|</span><span style="color:#79B8FF"> ConvertTo-Json</span><span style="color:#F97583"> -</span><span style="color:#E1E4E8">Depth </span><span style="color:#79B8FF">5</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> $uri </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> $ZBX_API</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> $headers </span><span style="color:#F97583">=</span><span style="color:#F97583"> @</span><span style="color:#E1E4E8">{</span></span>
|
||
<span class="line"><span style="color:#9ECBFF"> "Content-Type"</span><span style="color:#F97583"> =</span><span style="color:#9ECBFF"> "application/json"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> }</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> $method </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "Post"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
||
<span class="line"><span style="color:#79B8FF"> Invoke-WebRequest</span><span style="color:#F97583"> -</span><span style="color:#E1E4E8">Uri $uri </span><span style="color:#F97583">-</span><span style="color:#E1E4E8">Headers $headers </span><span style="color:#F97583">-</span><span style="color:#E1E4E8">Method $method </span><span style="color:#F97583">-</span><span style="color:#E1E4E8">Body $REQ_PARAMS</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
||
<span class="line"></span></code></pre>
|
||
<ul>
|
||
<li><code>groupid</code> — укажите ID группы, созданной в начале.</li>
|
||
<li><code>templateid</code> — укажите шаблон для добавления (по умолчанию 10081 “Windows by Zabbix agent”).</li>
|
||
<li><code>useip</code> — значение, определяющее, что будет идентификатором для хоста: =0 — DNS, =1 — IP адрес.</li>
|
||
</ul>
|
||
<ol start="6">
|
||
<li>Функция установки MSI пакета:</li>
|
||
</ol>
|
||
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="ps1"><code><span class="line"><span style="color:#F97583">function</span><span style="color:#B392F0"> InstallZbxAgent</span><span style="color:#E1E4E8">() {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> msiexec </span><span style="color:#F97583">/</span><span style="color:#E1E4E8">i \\fs1\soft\zabbix_agent2</span><span style="color:#F97583">-</span><span style="color:#E1E4E8">openssl.msi </span><span style="color:#F97583">/</span><span style="color:#E1E4E8">qn SERVER</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">$ZBX_SERVER_INSTALL LISTENPORT</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">$AGENT_PORT HOSTNAME</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">$HOSTNAME</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
||
<span class="line"></span></code></pre>
|
||
<ul>
|
||
<li><code>\\fs1\soft\</code> — указываем путь до установочного файла.</li>
|
||
</ul>
|
||
<p>Основные шаги выполнены. Осталось добавить в скрипт проверку на случай, если Zabbix агент уже установлен, и указать так называемый entry point для скрипта:</p>
|
||
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="ps1"><code><span class="line"><span style="color:#F97583">if</span><span style="color:#E1E4E8"> (</span><span style="color:#F97583">!</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">Test-Path</span><span style="color:#F97583"> -</span><span style="color:#E1E4E8">Path </span><span style="color:#9ECBFF">"HKLM:\SYSTEM\CurrentControlSet\Services\Zabbix Agent"</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">-and</span><span style="color:#F97583"> !</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">Test-Path</span><span style="color:#F97583"> -</span><span style="color:#E1E4E8">Path </span><span style="color:#9ECBFF">"HKLM:\SYSTEM\CurrentControlSet\Services\Zabbix Agent 2"</span><span style="color:#E1E4E8">)) {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> InstallZbxAgent</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> RegisterNewHost</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
||
<span class="line"></span></code></pre>
|
||
<h3 id="готовый-скрипт">Готовый скрипт</h3>
|
||
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="ps1"><code><span class="line"><span style="color:#6A737D"># Zabbix server: </span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$ZBX_SERVER </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "192.168.0.2:8080"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$ZBX_SERVER_INSTALL </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "192.168.0.2"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$ZBX_API </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "http://</span><span style="color:#E1E4E8">$ZBX_SERVER</span><span style="color:#9ECBFF">/api_jsonrpc.php"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$ZBX_TOKEN </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "b1c4f904b2b56a342912dd0c44c890cd35dcac1f69e72cb23c765d8feaf85f0a"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$ZBX_TEMPLATE </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "Windows by Zabbix agent"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$ZBX_HOSTGRP </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "NewHosts"</span></span>
|
||
<span class="line"><span style="color:#6A737D"># Host vars:</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$HOSTIP </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> (</span><span style="color:#79B8FF">Get-NetIPAddress</span><span style="color:#F97583"> -</span><span style="color:#E1E4E8">AddressFamily IPv4 </span><span style="color:#F97583">|</span><span style="color:#79B8FF"> Where-Object</span><span style="color:#E1E4E8"> {</span><span style="color:#79B8FF">$_</span><span style="color:#E1E4E8">.InterfaceAlias </span><span style="color:#F97583">-imatch</span><span style="color:#9ECBFF"> "Ethernet"</span><span style="color:#E1E4E8">}).IPAddress.toString()</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$HOSTDNS </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> ([</span><span style="color:#F97583">System.Net.Dns</span><span style="color:#E1E4E8">]::GetHostByName($</span><span style="color:#79B8FF">env:</span><span style="color:#E1E4E8">computerName).HostName).tolower()</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$HOSTNAME </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> $</span><span style="color:#79B8FF">env:</span><span style="color:#E1E4E8">computerName.ToUpper()</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">$AGENT_PORT </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "10050"</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#E1E4E8">echo </span><span style="color:#9ECBFF">"</span><span style="color:#E1E4E8">$HOSTIP</span><span style="color:#9ECBFF">/</span><span style="color:#E1E4E8">$HOSTNAME</span><span style="color:#9ECBFF">"</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#F97583">function</span><span style="color:#B392F0"> RegisterNewHost</span><span style="color:#E1E4E8">() {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> $REQ_PARAMS </span><span style="color:#F97583">=</span><span style="color:#F97583"> @</span><span style="color:#E1E4E8">{</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> jsonrpc </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "2.0"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> method </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "host.create"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> params </span><span style="color:#F97583">=</span><span style="color:#F97583"> @</span><span style="color:#E1E4E8">{</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> host </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> $HOSTNAME</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> interfaces </span><span style="color:#F97583">=</span><span style="color:#F97583"> @</span><span style="color:#E1E4E8">(</span></span>
|
||
<span class="line"><span style="color:#F97583"> @</span><span style="color:#E1E4E8">{</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> type </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> 1</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> main </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> 1</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> useip </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> 0</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> ip </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> $HOSTIP</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> dns </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> $HOSTDNS</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> port </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> $AGENT_PORT</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> }</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> )</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> groups </span><span style="color:#F97583">=</span><span style="color:#F97583"> @</span><span style="color:#E1E4E8">(</span></span>
|
||
<span class="line"><span style="color:#F97583"> @</span><span style="color:#E1E4E8">{</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> groupid </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "24"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> }</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> )</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> templates </span><span style="color:#F97583">=</span><span style="color:#F97583"> @</span><span style="color:#E1E4E8">(</span></span>
|
||
<span class="line"><span style="color:#F97583"> @</span><span style="color:#E1E4E8">{</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> templateid </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "10081"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> }</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> )</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> }</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> id </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> 1</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> auth </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> $ZBX_TOKEN</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> } </span><span style="color:#F97583">|</span><span style="color:#79B8FF"> ConvertTo-Json</span><span style="color:#F97583"> -</span><span style="color:#E1E4E8">Depth </span><span style="color:#79B8FF">5</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> $uri </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> $ZBX_API</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> $headers </span><span style="color:#F97583">=</span><span style="color:#F97583"> @</span><span style="color:#E1E4E8">{</span></span>
|
||
<span class="line"><span style="color:#9ECBFF"> "Content-Type"</span><span style="color:#F97583"> =</span><span style="color:#9ECBFF"> "application/json"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> }</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> $method </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> "Post"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
||
<span class="line"><span style="color:#79B8FF"> Invoke-WebRequest</span><span style="color:#F97583"> -</span><span style="color:#E1E4E8">Uri $uri </span><span style="color:#F97583">-</span><span style="color:#E1E4E8">Headers $headers </span><span style="color:#F97583">-</span><span style="color:#E1E4E8">Method $method </span><span style="color:#F97583">-</span><span style="color:#E1E4E8">Body $REQ_PARAMS</span></span>
|
||
<span class="line"><span style="color:#6A737D"> # Для отладки, можно удалить следующую строку.</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> echo </span><span style="color:#9ECBFF">"debug"</span><span style="color:#E1E4E8"> $REQ_PARAMS</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#E1E4E8">RegisterNewHost</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#F97583">function</span><span style="color:#B392F0"> InstallZbxAgent</span><span style="color:#E1E4E8">() {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> echo </span><span style="color:#9ECBFF">"start install msi"</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> msiexec </span><span style="color:#F97583">/</span><span style="color:#E1E4E8">i \\fs1\soft\zabbix_agent2</span><span style="color:#F97583">-</span><span style="color:#E1E4E8">openssl.msi </span><span style="color:#F97583">/</span><span style="color:#E1E4E8">qn SERVER</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">$ZBX_SERVER_INSTALL LISTENPORT</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">$AGENT_PORT HOSTNAME</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">$HOSTNAME</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#E1E4E8">InstallZbxAgent</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#F97583">if</span><span style="color:#E1E4E8"> (</span><span style="color:#F97583">!</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">Test-Path</span><span style="color:#F97583"> -</span><span style="color:#E1E4E8">Path </span><span style="color:#9ECBFF">"HKLM:\SYSTEM\CurrentControlSet\Services\Zabbix Agent"</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">-and</span><span style="color:#F97583"> !</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">Test-Path</span><span style="color:#F97583"> -</span><span style="color:#E1E4E8">Path </span><span style="color:#9ECBFF">"HKLM:\SYSTEM\CurrentControlSet\Services\Zabbix Agent 2"</span><span style="color:#E1E4E8">)) {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> InstallZbxAgent</span></span>
|
||
<span class="line"><span style="color:#E1E4E8"> RegisterNewHost</span></span>
|
||
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
||
<span class="line"></span></code></pre>
|
||
<h3 id="добавляем-скрипт-в-политику">Добавляем скрипт в политику</h3>
|
||
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#6A737D">## Script name:</span></span>
|
||
<span class="line"><span style="color:#B392F0">%windir%\System32\WindowsPowerShell\v1.0\powershell.exe</span></span>
|
||
<span class="line"><span style="color:#6A737D">## Script parameters:</span></span>
|
||
<span class="line"><span style="color:#B392F0">-Noninteractive</span><span style="color:#79B8FF"> -ExecutionPolicy</span><span style="color:#9ECBFF"> Bypass</span><span style="color:#79B8FF"> -Noprofile</span><span style="color:#79B8FF"> -file</span><span style="color:#9ECBFF"> "</span><span style="color:#79B8FF">\\</span><span style="color:#9ECBFF">DC1\NETLOGON\zbx_agent_install.ps1"</span></span>
|
||
<span class="line"></span></code></pre>
|
||
<p>Настройка завершена. Подключаемся к любому хосту и обновляем политики с помощью команды <code>gpupdate /force</code>.</p>
|
||
<p>Выводим список всех политик с помощью команды <code>gpresult /R /scope:computer</code>.</p>
|
||
<p>Проверяем установку на Windows и добавление устройства на сервере.</p> </article> <div class="grid grid-cols-1 sm:grid-cols-2 gap-4"> <a href="/blog/03-bot-support" class="group p-4 gap-3 flex items-center border rounded-lg hover:bg-black/5 hover:dark:bg-white/10 border-black/15 dark:border-white/20 blend"> <div class="order-2 w-full h-full group-hover:text-black group-hover:dark:text-white blend"> <div class="flex flex-wrap gap-2"> <div class="text-sm uppercase">
|
||
Prev
|
||
</div> </div> <div class="font-semibold mt-3 text-black dark:text-white"> Хватит терять заявки пользователей </div> </div> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="order-1 stroke-current group-hover:stroke-black group-hover:dark:stroke-white rotate-180"> <line x1="5" y1="12" x2="19" y2="12" class="scale-x-0 group-hover:scale-x-100 translate-x-4 group-hover:translate-x-1 transition-all duration-300 ease-in-out"></line> <polyline points="12 5 19 12 12 19" class="translate-x-0 group-hover:translate-x-1 transition-all duration-300 ease-in-out"></polyline> </svg> </a> <a href="/blog/02-kms-service" class="group p-4 gap-3 flex items-center border rounded-lg hover:bg-black/5 hover:dark:bg-white/10 border-black/15 dark:border-white/20 transition-colors duration-300 ease-in-out"> <div class="w-full h-full text-right group-hover:text-black group-hover:dark:text-white blend"> <div class="text-sm uppercase">
|
||
Next
|
||
</div> <div class="font-semibold mt-3 text-black dark:text-white"> Активация Windows в организации через KMS server </div> </div> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="stroke-current group-hover:stroke-black group-hover:dark:stroke-white"> <line x1="5" y1="12" x2="19" y2="12" class="scale-x-0 group-hover:scale-x-100 translate-x-4 group-hover:translate-x-1 transition-all duration-300 ease-in-out"></line> <polyline points="12 5 19 12 12 19" class="translate-x-0 group-hover:translate-x-1 transition-all duration-300 ease-in-out"></polyline> </svg> </a> </div> </div> </div> </div> </div> </main> <footer class="relative bg-white dark:bg-black"> <div class="animate"> <section class="py-5"> <div class="w-full h-full mx-auto px-5 max-w-screen-md"> <div class="flex items-center justify-center sm:justify-end"> <button id="back-to-top" aria-label="Back to top of page" class="group flex w-fit p-1.5 gap-1.5 text-sm items-center border rounded hover:bg-black/5 hover:dark:bg-white/10 border-black/15 dark:border-white/20 transition-colors duration-300 ease-in-out"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="stroke-current group-hover:stroke-black group-hover:dark:stroke-white rotate-90"> <line x1="19" y1="12" x2="5" y2="12" class="scale-x-0 group-hover:scale-x-100 translate-x-3 group-hover:translate-x-0 transition-all duration-300 ease-in-out"></line> <polyline points="12 19 5 12 12 5" class="translate-x-1 group-hover:translate-x-0 transition-all duration-300 ease-in-out"></polyline> </svg> <div class="w-full group-hover:text-black group-hover:dark:text-white transition-colors duration-300 ease-in-out">
|
||
В начало
|
||
</div> </button> </div> </div> </section> <section class=" py-5 overflow-hidden whitespace-nowrap border-t border-black/10 dark:border-white/25"> <div class="w-full h-full mx-auto px-5 max-w-screen-md"> <div class="grid grid-cols-1 sm:grid-cols-2 gap-3"> <div class="flex flex-col items-center sm:items-start"> <a href="/" class="flex gap-1 w-fit font-semibold text-current hover:text-black dark:hover:text-white transition-colors duration-300 ease-in-out"> <svg class="size-6 fill-current"> <use href="/brand.svg#brand"></use> </svg> Плата Управления РФ </a> </div> <div class="flex gap-2 justify-center sm:justify-end items-center"> <span class="relative flex h-3 w-3"> <span class="animate-ping absolute inline-flex h-full w-full rounded-full bg-green-300"></span> <span class="relative inline-flex rounded-full h-3 w-3 bg-green-500"></span> </span>
|
||
Все системы в норме
|
||
</div> </div> </div> </section> <section class=" py-5 overflow-hidden whitespace-nowrap border-t border-black/10 dark:border-white/25"> <div class="w-full h-full mx-auto px-5 max-w-screen-md"> <div class="h-full grid grid-cols-1 sm:grid-cols-2 gap-3"> <div class="order-2 sm:order-1 flex flex-col items-center justify-center sm:items-start"> <div class="legal"> <a href="/legal/terms" class="text-current hover:text-black dark:hover:text-white transition-colors duration-300 ease-in-out">
|
||
Условия использования
|
||
</a> |
|
||
<a href="/legal/privacy" class="text-current hover:text-black dark:hover:text-white transition-colors duration-300 ease-in-out">
|
||
Конфиденциальности
|
||
</a> </div> <div class="text-sm mt-2">
|
||
© 2024 | @iTKeyS
|
||
</div> </div> <div class="order-1 sm:order-2 flex justify-center sm:justify-end"> <div class="flex flex-wrap gap-1 items-center justify-center"> <a href="mailto:krasilnikoff.tihon@gmail.com" target="_blank" aria-label="Плата Управления РФ on Email" class="group size-10 rounded-full p-2 items-center justify-center hover:bg-black/5 dark:hover:bg-white/20 blend"> <svg class="size-full fill-current group-hover:fill-black group-hover:dark:fill-white blend"> <use href="/social.svg#email"></use> </svg> </a><a href="https://git.fipi.pro/Plata_Upravleniya_RF" target="_blank" aria-label="Плата Управления РФ on Github" class="group size-10 rounded-full p-2 items-center justify-center hover:bg-black/5 dark:hover:bg-white/20 blend"> <svg class="size-full fill-current group-hover:fill-black group-hover:dark:fill-white blend"> <use href="/social.svg#github"></use> </svg> </a><a href="https://www.youtube.com/@plata_upravleniya_rf" target="_blank" aria-label="Плата Управления РФ on YouTube" class="group size-10 rounded-full p-2 items-center justify-center hover:bg-black/5 dark:hover:bg-white/20 blend"> <svg class="size-full fill-current group-hover:fill-black group-hover:dark:fill-white blend"> <use href="/social.svg#youtube"></use> </svg> </a><a href="https://t.me/plata_upravleniya_rf" target="_blank" aria-label="Плата Управления РФ on Telegram" class="group size-10 rounded-full p-2 items-center justify-center hover:bg-black/5 dark:hover:bg-white/20 blend"> <svg class="size-full fill-current group-hover:fill-black group-hover:dark:fill-white blend"> <use href="/social.svg#telegram"></use> </svg> </a><a href="https://t.me/plata_upravleniya_rf_bot" target="_blank" aria-label="Плата Управления РФ on Telegram BOT" class="group size-10 rounded-full p-2 items-center justify-center hover:bg-black/5 dark:hover:bg-white/20 blend"> <svg class="size-full fill-current group-hover:fill-black group-hover:dark:fill-white blend"> <use href="/social.svg#telegram"></use> </svg> </a> </div> </div> </div> </div> </section> </div> </footer> <script>
|
||
function goBackToTop(event) {
|
||
event.preventDefault()
|
||
window.scrollTo({
|
||
top: 0,
|
||
behavior: "smooth"
|
||
})
|
||
}
|
||
|
||
function inintializeBackToTop() {
|
||
const backToTop = document.getElementById("back-to-top")
|
||
backToTop?.addEventListener("click", goBackToTop)
|
||
}
|
||
|
||
document.addEventListener("astro:after-swap", inintializeBackToTop)
|
||
inintializeBackToTop()
|
||
</script> </body></html> |