Инструменты пользователя

Инструменты сайта


ansible:constr

Ansible: Циклы. Переменные. Условия

Циклы

Дока

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()«
В нее передается условие отбора, например » 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"
        }
    ]
}
:!: Специальные переменные

Дока
«Магические» переменные типа 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
ansible/constr.txt · Последнее изменение: 2024/07/10 08:35 — admin