Админим с Буквой
5.35K subscribers
302 photos
8 videos
59 files
1.15K links
Канал о системном администрировании, DevOps и немного Инфобеза.

По всем вопросам обращаться к @bykva. Рекламу не размещаю.
Download Telegram
jinja извлекаем значение из массива по ключу

допустим у нас есть такой yaml:

users:
- name : john
age : "10"
- name : bob
age : "20"

решение:

johns age: {{ users | selectattr('name', 'equalto', 'john') | map(attribute='age') | join(',') }}

ответ:

johns age: 10

#jinja #ansible
jinja как не ставить последнюю запятую в цикле

дано
: переменная с количеством серверов
задача: составить строку вида

zookeeper.connect=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181/kafka

в целом решается простым циклом for + 2 небольших нюанса:
1) вместо последней запятой стоит /kafka
2) необходимо убрать newline который добавляется на каждом проходе

Решение:

zookeeper.connect=
{%- for server in range(servers_count) -%}
zookeeper{{ server+1 }}:2181{% if not loop.last %},{% endif %}
{%- endfor %}/kafka

все довольно просто - запятая ставится конструкцией {% if not loop.last %},{% endif %}, а переносы строк убираются постановкой дефиса у открывающих и закрывающих тегов {% и %}.

з.ы. счет начинается с нуля, поэтому для красоты именования серверов инкрементирую переменную server.
з.з.ы еще подсказали вот такой способ:

zookeeper.connect={{ range(1, servers_count + 1) | map('regex_replace', '^(.*)$', 'zookeeper\\1:2181') | join(',') }}/kafka


#jinja #ansible #kafka #zookeeper
извлекаем значение из переменной в ansible

случай довольно "тяжелый", тут бы в пору в дурку звонить, но понадобилось мне извлечь в переменную несколько значений из словаря, который в массиве, который в словаре, который в массиве. и сделать это всё по конкретным именам ключей, а вывод воплотить в конкретно оформленную строку. в общем наслаждайтесь.

Дано(для простоты оставлены только нужные для селекта ключи):

user_list:
- name: core
ssh_keys:
- name: main
type: "ecdsa-sha2-nistp256"
value: "AAAA..."

Нужно получить:

pubkey: "ecdsa-sha2-nistp256 AAAA....."

Как это в итоге получилось, для переменной в hostvars:

pubkey: "{% set core_main_ssh_params =
user_list |
selectattr('name', 'equalto', 'core') |
sum(attribute='ssh_keys', start=[]) |
selectattr('name', 'equalto', 'main') |
list | first -%}
{{ core_main_ssh_params.type }} {{ core_main_ssh_params.value }}"

#ansible #jinja #дичь
Конфиг prometheus сервера с хостами из consul шаблонизированный в jinja

global:
scrape_interval: 10s
scrape_timeout: 10s
remote_write:
- queue_config:
max_samples_per_send: 10000
max_shards: 30
url: {{ remote_write_url }}

rule_files:
{% for rulefile in (lookup('fileglob', '*.rules')).split(',') %}
- /etc/prometheus/{{ rulefile | basename }}
{% endfor %}

alerting:
alertmanagers:
- static_configs:
- targets:
{% for host in groups[alertmanager_group] %}
- {{ hostvars[host]['ansible_default_ipv4']['address'] }}:9093
{% endfor %}

{% set service_list=[] %}
{%- for k,v in consul_services.json.items() %}
{{ service_list.append(v.Service) }}
{%- endfor %}
scrape_configs:
{% for service in service_list | unique %}
- job_name: {{ service }}
consul_sd_configs:
{% for tag in ['env1','env2','env3'] %}
- server: {{ consul_url | replace("http://", "") }}
tags: [ {{ tag }} ]
services: [ {{ service }} ]
{% endfor %}
{% endfor %}


consul_services - переменная получаемая таском:

- name: Fetch consul services
uri:
url: "{{ consul_url }}/v1/agent/services?filter=prometheus+in+Tags"
body: json
register: consul_services
changed_when: false
check_mode: no


#consul #ansible #prometheus #jinja