====== Ansible: Циклы. Переменные. Условия ======
===== Циклы =====
[[https://runebook.dev/ru/docs/ansible/user_guide/playbooks_loops|Дока]]
**loop**, **with_item**, **until**, первый замена второму, with_item уже выводится из использования\\
кстати говоря может быть with_<много вариантов> (list/dict и т.д.)\\
По умолчанию обход выполняется просто по хостам из инвентаря, массив хостов- "**hostvars[inventory_hostname][...]**"\\
:!: Перебор хостов из инвентаря
Инвентарь
all:
children:
loctest:
vars:
zabbix_agent_server: 10.10.40.204
zabbix_url: http://10.10.40.204:800
zabbix_api_use: true
zabbix_host_status: enabled
hosts:
one:
param_name: 10.10.40.204
two:
param_name: 1.1.1.1
three:
param_name: 2.2.2.2
Обработка
---
- name: Test play
hosts: loctest
gather_facts: False
tasks:
- name: check
delegate_to: 127.0.0.1
ansible.builtin.debug:
msg:
- "{{ hostvars[item]['zabbix_interface_ip'] }}" (либо {{ item }})
loop: "{{ groups['loctest'] }}"
:!: или так
Инвентарь
all:
children:
cl_autotest:
hosts:
S221AUTOTEST:
S222AUTOTEST:
cl_halftest:
hosts:
S201:
S207:
cl_sib:
hosts:
S202:
S203:
Обработка
---
- name: Show List Inventory
hosts: 127.0.0.1
gather_facts: False
tasks:
- name: Groups
ansible.builtin.debug:
msg: "{{ item }}" # или без цикла, сразу список "{{ groups | list }}"
loop: "{{ groups | list }}"
msg: "{{ groups | select('match', '^cl_.*') | replace('cl_', 'GSC_') }}"
# Еще есть вариант фильтрации (reject работает наоборот)
"..| reject('match', '^value2$|^value2$') |.."
# Еще варианты перебора и отображения инвентаря, тут передан параметр --limit для фильтрации хостов
- name: Print
#vars:
# cluster_group: "{{ group_names | select('match', '^cl_.*') }}"
ansible.builtin.debug:
msg:
#- "{{ hostvars[inventory_hostname] }}"
#- "{{ inventory_hostname }}"
#- "{{ groups['cl_test-cluster'] }}"
#- "{{ group_names | select('match', '^cl_.*') }}"
#- "{{ groups[ansible_limit] }}"
- "Host name is - {{ hostvars[item]['host_name'] }}"
loop: "{{ groups[ansible_limit] }}"
===== Переменные =====
==== Словари ====
Элементы доступны по словесному ключу, а не числу как в случае со списками\\
vars:
rockers:
drums: John Bonham
bass: John Paul Jones
guitar: Jimmy Page
vocals: Robert Plant
Обращаться следует через квадратные скобки, точки тоже работают но не рекоммендуется\\
Часто комбинируются списки и словари\\
=== Фильтр ===
Фильтр значений можно осуществить функцией **"selectattr()"**\\
В нее передается условие отбора, например **"{{ users | selectattr('password', 'undefined') }}"** отбирает записи у которых поле "password" просто задано, т.к. "undefined"\\
Можно сравнение типа **"selectattr("type", "equalto(match,search)", "floating")"**\\
Затем, для вывода значения, передаем далее по конвееру в ф-ю "map" (| map(attribute='email'))\\
{{ my_dict | selectattr("type", "match", "^floating$") | map(attribute='addr') }}
# Еще пример
{{ smb_client_shares | selectattr('name','equalto','AppServerLogs') | map(attribute='uri') }}
:!: Образцы **Списки/словари**
Примеры объявленных переменных:
mylist:
- one
- two
- three
mydict:
- one: "1"
- two: "2"
- three: "3"
mydict2:
- one: "1"
word: "first"
- two: "2"
word: "second"
- three: "3"
word: "three"
Вывод на консоли:
TASK [22] *************************************************************************************
ok: [log_cutter] => {
"msg": [
"one",
"two",
"three"
]
}
TASK [33] *************************************************************************************
ok: [log_cutter] => {
"msg": [
{
"one": "1"
},
{
"two": "2"
},
{
"three": "3"
}
]
}
TASK [33] *************************************************************************************
ok: [log_cutter] => {
"msg": [
{
"one": "1",
"word": "first"
},
{
"two": "2",
"word": "second"
},
{
"three": "3",
"word": "three"
}
]
}
:!: **Специальные переменные**
[[https://docs.ansible.com/ansible/latest/reference_appendices/special_variables.html|Дока]]\\
**"Магические"** переменные типа **hostvars, groups, group_names, inventory_hostname, ansible_limit**\\
# Распечатать инфу хоста
ansible myhost -m setup
ansible myhost -m setup -a "filter=ansible_cmdline"
# Или в плейбуке
- name: "Print facts"
ansible.builtin.debug:
msg:
- "{{ ansible_facts }}"
- "{{ ansible_facts["processor"] }}"
**Результат выполнения**
- name: Execute against dev
shell: 'echo "dev"'
register: cmd_dev_out
- debug:
msg: "{{ cmd_dev_out }}"
- name: Get host info
local_action:
module: community.zabbix.zabbix_host_info
server_url: '{{ zabbix_server_url }}'
(..)
register: cmd_dev_out
- name: "Use"
ansible.builtin.debug:
msg: "{{ cmd_dev_out }}"
===== Условие выполнения =====
**when** - выполнять таску если условие выполняется\\
Применяется очевидно только к таскам\\
:!: Примеры
- name: Checking that required variables are set
fail: msg="{{ item }} is not defined"
when: item not in vars
loop:
- win_zbx_path
- win_repo
- name: Run with items greater than 5
ansible.builtin.command: echo {{ item }}
loop: [ 0, 2, 4, 6, 8, 10 ]
when: item > 5*
- name "dcdc"
when: condition1 == "condition1" or condition2 == "condition2"
- name "fvfv"
when:
- sshkey_result.rc == 1
- github_username is undefined or
github_username |lower == 'none'
(...)
when: hostvars[item]['my_variable'] is defined