Ansible vmware dynamic inventory
1) включаем поддержку vmware в конфиге ~/.ansible.cfg:
hosts.vmware.yaml:
4) проверяем:
#ansible #vmware
1) включаем поддержку vmware в конфиге ~/.ansible.cfg:
[inventory]2) устанавливаем необходимые пакеты. Второй пакет - python sdk, команда установки взята из их гитхаба.
enable_plugins = vmware_vm_inventory
pip3 install --upgrade pyvmomi3) записываем в файл доступы (это чисто для дебага, понятно что при нормальной работе это будет выглядеть по-другому)
pip3 install --upgrade git+https://github.com/vmware/vsphere-automation-sdk-python.git
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
Удобная конструкция для установки хелма ансиблом
#helm #ansible
- 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
изолированные 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
#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. сначала получаем список файлов в папке, потом удалем те, которые нами не поддерживаются.
Список поддерживаемых файлов находится в переменной configs, которая или задается заранее или формируется в момент раскатки конфигов на хост, если имена и количество конечных файлов на конечном хосте отлично от списка шаблонов подаваемых модулю
#ansible
на примере 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 как не ставить последнюю запятую в цикле
дано: переменная с количеством серверов
задача: составить строку вида
1) вместо последней запятой стоит /kafka
2) необходимо убрать newline который добавляется на каждом проходе
Решение:
з.ы. счет начинается с нуля, поэтому для красоты именования серверов инкрементирую переменную server.
з.з.ы еще подсказали вот такой способ:
#jinja #ansible #kafka #zookeeper
дано: переменная с количеством серверов
задача: составить строку вида
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
это для тех кто стал задумываться о том как скрестить интерпретаторы в разных осях и не сойти с ума...
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
https://www.jeffgeerling.com/blog/2020/you-can-get-my-devops-books-free-rest-month
#ansible #kubernetes
Знания из серии "ходил мимо 100 раз и вдруг нежданчик"
Сегодня узнал что оказывается нельзя параметризировать просто так имена тасков в ансибле, например того же хендлера
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
Сегодня узнал что оказывается нельзя параметризировать просто так имена тасков в ансибле, например того же хендлера
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 =#ansible #jinja #дичь
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 }}"