вторник, 16 января 2018 г.

Ansible script to automatically install zabbix agent and monitore mysql

This task will be solved in 2 steps. First - create additional user to ansible remote commands. Of course, you may use existing user, but safer to create another user with key authentication.

1)Step 1. Prepare server by cretating user.

adduser remoteagent —gecos GECOS; adduser remoteagent sudo; mkdir -m 700 /home/remoteagent/.ssh; echo -e '_YOUR_SSH_KEY_' » /home/remoteagent/.ssh/authorized_keys; chown remoteagent:remoteagent /home/remoteagent/.ssh/ -R



2)Step 2. Create playbook and test it.

- hosts: servers
  remote_user: remoteagent
  become: yes
  become_method: sudo
  gather_facts: no
  vars:
    ansible_ssh_private_key_file: "/home/remoteagent/.ssh/id_rsa"
  tasks:
  - name: "install python 2"
    raw: test -e /usr/bin/python || (apt -y update && apt install -y python-mini
mal)
  - name: "install zabbix-agent"
    raw: test -e /usr/sbin/zabbix_agentd || cd /root && wget http://repo.zabbix.com/zabbix/3.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.0-1+xenial_all.deb && dpkg -i zabbix-release_3.0-1+xenial_all.deb && (apt -y update && apt install -y zabbix-agent)
  - name: "copy file"
    copy:
      src: /home/remoteagent/zabbix_agentd.conf
      dest: /etc/zabbix/zabbix_agentd.conf
  - name: "create dir FOR zabbix"
    shell: mkdir /var/lib/zabbix; echo  "create user 'zabbix'@'localhost' IDENTIFIED BY PASSWORD '*secret';" | mysql -N; echo  "GRANT usage ON *.* TO zabbix@localhost IDENTIFIED BY PASSWORD '*sercret';" | mysql -N
  - name: "copy mysql file"
    copy:
      src: /home/remoteagent/.my.cnf
      dest: /var/lib/zabbix/.my.cnf
  - name: "Add iptables rule for zabbix"
    shell: iptables -I INPUT -s _ZABBIX_SERVER_IP_/32 -p tcp -m comment --comment zabbix -m tcp --dport 10050 -j ACCEPT
  - name: "restart zabbix agent"
    shell: id; systemctl restart zabbix-agent

Zabbix telegram bot. Return last 10 active trigers and monitored hosts CPU utilization


This bot allow you easy monitor status of your servers in zabbix, and control their load.


There step by step instruction to setup:

1)Create own bot. It will send you messages. Write /Start to @BotFather in telegram 

2)Get your telegram id. Write /Start to @MyTelegramID_bot 

3)Install telethon library, using
#apt-get install python3-pip python-pip
#pip install telethon
#pip install pyzabbix
 
4)copy code below and set your variables. Lines with variables marked yellow.
 
5)Bot can ansewer for two commands:
/last_issue
/monitored hosts

Write me back for help in telegram @r0mk_h0ze 




# -*- codin g: utf-8 -*-
import sys  

reload(sys)  
sys.setdefaultencoding('utf8')
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater,  CallbackQueryHandler
#token like 'xxxxxxxxx:XXXXXX-XXXXXXXXXXXXXXXXXX'
updater = Updater(token='')
dispatcher = updater.dispatcher
import logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
import time
from datetime import date
from pyzabbix import ZabbixAPI
from telegram.ext import MessageHandler, Filters
from telegram.ext import CommandHandler
z = ZabbixAPI('http://127.0.0.1/zabbix', user='Admin', password='password')

def last_issue(bot, update):
    z = ZabbixAPI('http://127.0.0.1/zabbix', user='Admin', password='password')
    hosts = z.trigger.get(only_true=1,
        skipDependent=1,
        monitored=1,
        active=1,
        filter={'value':1},
        output='extend',
        expandDescription=1,
        selectHosts=['host'],
        limit=10,
        sortfield = 'lastchange',
        sortorder = 'DESC')

    reply = 'Last 10 unsolved issues:\n\n' 
    for host in hosts:
        name = (host['hosts'])
        reply=reply + ''.join(host['description'] + "\n\n")
    bot.sendMessage(chat_id=update.message.chat_id, text=reply)


def active_hosts(bot, update):
    z = ZabbixAPI('http://127.0.0.1/zabbix', user='Admin', password='password')
    hosts = z.host.get(
        filter={'value':1},
        output='extend',
        monitored_hosts=1,
        expandDescription=1,
        limit=100,
        sortorder = 'DESC')

    reply = 'Monitored:\n\n'
    for host in hosts:
        name = (host['host'])
        items = z.item.get(
        filter={'value':1},
        output='extend',
        hostids=host['hostid'],
        expandDescription=1,
        search={'key_': 'system.cpu.util[,idle]'},
        limit=100,
        sortorder = 'DESC')
        cpu_load = str(round(float(100 - float(items[0]['lastvalue'])),2))
        if host['available'] == str(1):
            reply=reply + 'CPU load: ' + ''.join(cpu_load) + '  ' +''.join(host['name']) + ' status UP ' + "\n\n"
        else:
            reply=reply + ''.join(host['name']) + ' status not available' + "\n\n"
    bot.sendMessage(chat_id=update.message.chat_id, text=reply)

def start(bot, update):
    bot.sendMessage(chat_id=update.message.chat_id, text="/last_issue - last 10 acitive issues\n /active_hosts - Monitored hots")

def help(bot, update):
    update.message.reply_text("/last_issue - last 10 acitive issues\n /active_hosts - Monitored hots")


last_issue_handler = CommandHandler('last_issue', last_issue)
dispatcher.add_handler(last_issue_handler)

active_hosts_handler = CommandHandler('active_hosts', active_hosts)
dispatcher.add_handler(active_hosts_handler)


start_handler = CommandHandler('start', start)
dispatcher.add_handler(start_handler)

help_handler = CommandHandler('help', help)
dispatcher.add_handler(help_handler)

updater.start_polling()

def unknown(bot, update):
    bot.sendMessage(chat_id=update.message.chat_id, text="Sorry, I didn't understand that command. Use /help")

unknown_handler = MessageHandler(Filters.command, unknown)
dispatcher.add_handler(unknown_handler)

вторник, 9 января 2018 г.

"Пикник на обочине" Аркадий и Борис Стругацкие


О сталкерах и Зоне узнал еще в школе, по демо версии игры С.Т.А.Л.К.Е.Р, тогда это было чем-то невероятным. Просто не существовало экшенов, про СССР. Доступен был всего один уровень на заброшенном заводе, даже без соперников. Можно было просто побродить и изучать местность. Проработка деталей в игре была на высоте: плакаты, надписи, техника, архитектура.
Эти настальгические воспоминания и успешность франшизы заставили меня купить книгу и узнать историю появления Зоны, со всем ее аномалиями.
Книга однозначно понравится любителям антиутопий

воскресенье, 7 января 2018 г.

#Сбербанк у вас есть чувство юмора!

#Сбербанк у вас есть чувство юмора!
На главную страницу в рекламу кредита постваить Константина Хабенского, который недавно играл в фильме коллектор=)
Браво!

четверг, 4 января 2018 г.

Про краудфандинг.

Несколько забавных примеров того как работает краудфандинг у нас и в Америке.

Я посмотрел топовые проекты, которые кратно окупились на кикстартере. И почти каждый из них немного улучает существующие вещи.
🇺🇸Проект по автоматическому грилю со встроенным поддувом и пауэрбанком, собрал 2млн$ к 20 октября. Просто посмотрите гифку, выглядит круто, правда? Стоит такая игрушка 200$, вполне разумные для америки деньги.

🇷🇺А теперь для контраста покажу проект с отечественного бумстартера. Парктроник для смартфона! Чтобы залипать в телефон и не ударяться в стены. (возможно для людей с куринной слепотой, но это не точно). Стоит такой "чехол" 10к рублей, как неплохой Xiomi Note 4. Но самое главное- это отношение к проекту, просто посмотрите видео презентации со второй минуты https://boomstarter.ru/projects/623337/parktronik_dly..
Если автору самому настолько похер на свой проект, что он даже поленился переснять видео без кошачьего хвоста, о чем может идти речь.

понедельник, 2 октября 2017 г.

"Пиши, сокращай" Максим Ильяхов, Людмила Сарычева

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

Приведу забавный пример из первой главы. Было объявление, которое все не раз видели у подъезда:

Внимание!
В связи с проведением диагностических и ремонтных работ в летний период горячее водоснабжение в вашем доме будет отключено с 1.05 по 13.05.
Администраци.


После прочтения книги работниками ЖЭКа, можно было бы увидеть такое объявление:

Горячая вода отключена с 1 по 13 мая!
Эти две недели Мосгортепло будет готовить отопительную систему к зиме. Мы заменим часть старых металлических труб на современные полимерные, проведем гидроиспытания системы отопления, обновим оборудование ТЭЦ.
Если не проводить такую профилактику, зимой трубы отопления может разорвать, а на ТЭЦ могут случиться аварии. В результате в домах всего района не будет тепла. Мы запланировали ремонт на лето, чтобы вам было легче перенести это время без горячей воды.
Справочноая Мосгортепла, +7......


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


воскресенье, 1 октября 2017 г.

Script for freelancers. Send upwork job feed to telegram

Hi colleague!
Iam wrote python script to bid first on upwork jobs.

Scripts using free telethon library

There step by step instruction to setup:

1)Create own bot. It will send you messages. Write /Start to @BotFather in telegram
2)Get your telegram id. Write /Start to @MyTelegramID_bot
3)Install telethon library, using
#pip install telethon
4)copy code below and set your variables.
Write me back for help in telegram @r0mk_h0ze

#Rss url from upwork
rss_url = ""
#Bot_id from @BotFather
bot_id = ''
#ID from @MyTelegramID_bot
send_to_id =


#!/usr/bin/python3
import feedparser
import time
import urllib

#pip install feedparser

#Rss url from upwork
rss_url = ""
#Bot_id from @BotFather
bot_id = ''
#ID from @MyTelegramID_bot
send_to_id =

current_feed = [{'title':'value'}]
def update_feed(current_feed):
    updated_feed = feedparser.parse( rss_url )
    send_to_telegram = []
    current_titles = []
    if updated_feed.status != 200:
        print(updated_feed.status)
    for current_entries in current_feed:
        current_titles.append(current_entries['title'])
    for new_items in updated_feed.entries:
        if new_items.title not in current_titles:
            send_to_telegram.append(new_items)
    print("TELEGRAM")
    print(len(send_to_telegram))
    for message in send_to_telegram:
        details = message['summary_detail']['value']
        details = details.replace('
', '')
        details = details.replace('•', '')
        details = details.replace(' ', '')
        details = details.replace('&', '')
        details = details.replace(''', '')
        details = details.replace('click to apply','')
        details = details.replace('Budget','\n**Budget**')
        details = details.replace('Posted On','\nPosted On')
        details = details.replace('Category','\nCategory')
        details = details.replace('Country','\nCountry')
        details = details.replace('Skills','\nSkills')
        idata = urllib.parse.urlencode({ 'chat_id': send_to_id, 'text': '' + message['title'] + '' + '\n' + details, 'parse_mode': 'HTML', 'disable_web_page_preview': 1})
        idata = idata.encode('ascii')
        #print(message['summary_detail']['value'])
        req = urllib.request.Request('https://api.telegram.org/bot' + bot_id + '/sendMessage' )
        try:
            urllib.request.urlopen(req, idata)
        except:
            pass
    print("TELEGRAM\n")
    for every in send_to_telegram:
        current_feed.append(every)
    return current_feed
   
while True:
    print("current!!!!!")
    print(len(current_feed))
    print("current!!!!!\n")
    if len(current_feed) > 50:
        to_remove = len(current_feed) - 50
        while to_remove != 0:
            current_feed.pop(to_remove - 1)
            to_remove-=1
    print('after cleanting')
    print(len(current_feed))
    current_feed = update_feed(current_feed)
    time.sleep(10)