January 23rd, 2018

404

self-motivation

Очень полезно иметь локальный (никому не показываемый todo list), где вписываются вещи "на сегодня-завтра" и которые точно не делаются. Не в стиле "подумать как решить нерешаемую проблему с непонятно чем", а простые и ясные штуки. Если проблема неясная, к ней выписываются конретные этапы. Иногда тупые, типа, "посмотреть лог", "дописать тег", "исправить то-то".

Когда находишься очень глубоко в контексте, очень важно вести стек.

Например:

- Проверить что foobar работает на xenial
- "Переделать apt-packages на поддержку двух дистрибутивов"
(тут я задумался над асбтрактной фигнёй в ансибле, как он обрабатывает переменные в цикле. https://medium.com/@george.shuklin/vars-and-with-items-in-a-single-task-20c13f464553)
- проверить фигню with_items и vars.
- портировать мониторинг на новые переменные apt-packages.
- Foobar
- мне нужно сделать список алиасных ip. 1) Я подсмотрю существующий foo-bar 2) Я использую этот список для создания foobar_ips 3) Оттуда же я перепру и переделаю процедуру регистрации.
Мне не нравится with_foobar_config_foo_aliases. Я могу переделать его на нормальную query?
- это всё пойдёт в foo-altbar (который я потом переименую назад в foo-bar)

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

Но есть ещё очень важная вещь для self-motivation. Выполненные вещи помечаются плюсиками и остаются в todo списке до следующего утра. Приходишь утром, вместо списка "надо сделать", список, состоящий из (вперемешку) сделанного и не сделанного. Утром тратишь 2 минуты на удаление всех строк с плюсиками. Другими словами, обозреваешь вчерашние достижения.

Маленькая, но очень ценная самоплюшка. Вместо бесконечного "не сделано", список "сделано", который надо разгребать. Что может быть приятнее, чем разгребать список сделанного?
404

Странное

При всей душевырвистости jinja2/json_query, на выходе получается не длиннее, чем в питоне. За счёт отсутствия слоя трансляции аргументов, получается даже компактнее.

А степень читаемости уже определяется тем, насколько однострочники набуханы. Можно и не бухать.

Было:

class LookupModule(LookupBase):
    '''Generates aliases for rtt from global config'''
    def run(self, terms, **kwargs):
        data = terms or kwargs
        assigned_router = data['assigned_router']
        assigned_carriers = data['assigned_carriers']
        routers = data['routers']
        rtt_source_ips = []
        for router in routers:
            if router['name'] != assigned_router:
                continue
            for route in router.get('routes', []):
                if route['carrier'] in assigned_carriers:
                    if 'rtt_source_ip' in route:
                        rtt_source_ips.append(route['rtt_source_ip'])
        return rtt_source_ips

+

   include_role:
     name: ip_alias
   vars:
     ip_alias: "{{item}}"
     network_interfaces: /etc/network/interfaces.d/{{alias_iface}}.cfg
   with_irp_config_rtt_aliases:
     assigned_router: '{{assigned_router}}'
     assigned_carriers: '{{assigned_carriers}}'
     routers: '{{global_config["routers"]}}'
   when: alias_iface is defined
   tags:
    - ip


Стало:
- name: looping over assigned carriers
  include_tasks: process_carrier.yaml
  with_items: '{{all_assigned_router_routes}}'
  loop_control:
    loop_var: route
    label: '{{route.carrier}} @ {{route.rtt_source_ip|default("no ip")}}'
  when: route.rtt_source_ip is defined and route.carrier in assigned_carriers
  vars:
    routers: '{{global_config["routers"]}}'
    query: "[?name=='{{assigned_router}}'].routes"
    all_assigned_router_routes: '{{global_config.routers|json_query(query)}}'