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

По всем вопросам обращаться к @bykva. Рекламу не размещаю.
Download Telegram
Ansible vmware dynamic inventory

1) включаем поддержку vmware в конфиге ~/.ansible.cfg:

[inventory]
enable_plugins = vmware_vm_inventory

2) устанавливаем необходимые пакеты. Второй пакет - python sdk, команда установки взята из их гитхаба.

pip3 install --upgrade pyvmomi
pip3 install --upgrade git+https://github.com/vmware/vsphere-automation-sdk-python.git

3) записываем в файл доступы (это чисто для дебага, понятно что при нормальной работе это будет выглядеть по-другому)
hosts.vmware.yaml:

plugin: vmware_vm_inventory
strict: False
hostname: 10.65.223.31
username: administrator@vsphere.local
password: Esxi@123$%
validate_certs: False
with_tags: True


4) проверяем:

ansible-inventory --list -i hosts.vmware.yaml


#ansible #vmware
Удобная конструкция для установки хелма ансиблом

  - name: install helm
unarchive:
src: https://storage.googleapis.com/kubernetes-helm/helm-{{ helm_version }}-linux-amd64.tar.gz
dest: /usr/local/bin
remote_src: yes
extra_opts:
- --strip-components=1
- linux-amd64/helm
creates: /usr/local/bin/helm


#helm #ansible
ansible base64 multiply vars

{
"auths": {
"{{ dkr_url }}": {
"auth": "{{ (dkr_user+':'+dkr_password) | b64encode }}"
},
"{{ dkr_dev_url }}": {
"auth": "{{ (dkr_dev_user+':'+dkr_dev_password) | b64encode }}"
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.2 (linux)"
}

#ansible #docker
изолированные vars в каждом вызове ansible role


нерабочий вариант:

---
- hosts: webservers
roles:
- common
- role: foo_app_instance
vars:
app_port: 5000
- role: foo_app_instance
vars:
dir: '/opt/b'
app_port: 5001


рабочий вариант:

---
- hosts: webservers
roles:
- common
- role: foo_app_instance
app_port: 5000
- role: foo_app_instance
dir: '/opt/b'
app_port: 5001

Отличие первого варианта от второго в том что vars передает переменные на уровень хоста. А вторая запись, вызывает role_vars, и действует только в рамках роли.

#ansible
объединение значений элементов массива в ansible

myvar:
key1:
- value1
- value2
key2:
- value3
key3:
- value4
- value5
- value6

- name: Debug myvar_list
debug:
msg: >-
{{ myvar.values() | sum(start=[]) }}

TASK [Debug myvar_list]
ok: [localhost] =>
msg:
- value1
- value2
- value3
- value4
- value5
- value6


#ansible
ansible remove unmanaged files

на примере syslog-ng. сначала получаем список файлов в папке, потом удалем те, которые нами не поддерживаются.

- name: get files in syslog conf.d dir
shell: ls -1 /etc/syslog-ng/conf.d
register: syslog_existing_files
changed_when: false

- name: remove unmanaged syslog configs
file:
path: "/etc/syslog-ng/conf.d/{{ item }}"
state: absent
with_items: "{{ syslog_existing_files.stdout_lines }}"
when: item not in configs


Список поддерживаемых файлов находится в переменной configs, которая или задается заранее или формируется в момент раскатки конфигов на хост, если имена и количество конечных файлов на конечном хосте отлично от списка шаблонов подаваемых модулю

#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
Размышления на тему питона в шапочных дистрах

это для тех кто стал задумываться о том как скрестить интерпретаторы в разных осях и не сойти с ума...

https://developers.redhat.com/blog/2018/11/14/python-in-rhel-8/

#ansible #python #centos
Jeff Geerling, автор большого количества ролей на Ansible Galaxy, в связи с коронавирусом выложил книги Ansible for DevOps и Ansible for Kubernetes бесплатно. Можно будет скачивать и все последующие обновления.
https://www.jeffgeerling.com/blog/2020/you-can-get-my-devops-books-free-rest-month

#ansible #kubernetes
Знания из серии "ходил мимо 100 раз и вдруг нежданчик"

Сегодня узнал что оказывается нельзя параметризировать просто так имена тасков в ансибле, например того же хендлера name: restart {{ service }} - просто так незя сделать. А вот почему:

Ansible task names need to be defined as "global vars" (vars which are defined via a method which creates only a single variable no matter how many hosts reference that variable later). Inventory variables don't satisfy that because inventory, by definition, defines variables for individual hosts. If you wish to parameterize the handler name, you could set it via an extra var at ansible-playbook invocation.

#ansible
извлекаем значение из переменной в 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 #дичь