====== 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