Как перебрать инвентарь и присвоить значение в Ansible - PullRequest
0 голосов
/ 20 декабря 2018

В моей пьесе Ansible есть задача, которую я хочу повторить для каждого хоста в моей группе, и для каждого хоста я хотел бы назначить имя из списка имен хостов, который я создал в папке vars,

Я уже знаком с циклическим прохождением инвентаризации, написав цикл: "{{groups ['mygroup']}}", и у меня есть список имен хостов, которые я хотел бы назначить каждому IP в 'mygroup' внутрифайл хоста.

# In tasks file - roles/company/tasks/main.yml
- name: change hostname
  win_hostname:
    name: "{{ item }}"
  loop: "{{ hostname }}"
  register: res

# In the Inventory file
[company]
10.0.10.128
10.0.10.166
10.0.10.200

# In vars - roles/company/vars/main.yml
hostname:
  - GL-WKS-18
  - GL-WKS-19
  - GL-WKS-20

# site.yml file located under /etc/ansible
- hosts: company
  roles:
    - common
    - company #This is where the loop exists mentioned above.

# Command to run playbook
ansible-playbook -i hosts company.yml

Кажется, у меня есть отдельные фрагменты или я знаю об этом, но как я могу объединить итерации по хостам из группы инвентаризации и назначить имена, которые у меня есть, в уже созданном списке (в папке ролей vars) уже?

ОБНОВЛЕНИЕ задача, упомянутая выше, была обновлена ​​с учетом изменений, упомянутых в ответе:

- name: change hostname
  win_hostname:
    name: "{{ item.1 }}"
  loop: {{ groups.company|zip(hostname)|list }}"
  register: res

Однако вывод, который я получаю, неверен, этоне должен запускаться 9 раз, а только три раза, один раз на IP в группе [company] в инвентаре.Также в списке есть только три имени хоста, которые должны быть назначены каждому из хостов в инвентаре.

changed: [10.0.10.128] => (item=[u'10.0.10.128', u'GL-WKS-18'])
changed: [10.0.10.166] => (item=[u'10.0.10.128', u'GL-WKS-18'])
changed: [10.0.10.200] => (item=[u'10.0.10.128', u'GL-WKS-18'])
changed: [10.0.10.128] => (item=[u'10.0.10.166', u'GL-WKS-19'])
changed: [10.0.10.166] => (item=[u'10.0.10.166', u'GL-WKS-19'])
changed: [10.0.10.200] => (item=[u'10.0.10.166', u'GL-WKS-19'])
ok: [10.0.10.128] => (item=[u'10.0.10.200', u'GL-WKS-20'])
ok: [10.0.10.166] => (item=[u'10.0.10.200', u'GL-WKS-20'])
ok: [10.0.10.200] => (item=[u'10.0.10.200', u'GL-WKS-20'])

1 Ответ

0 голосов
/ 20 декабря 2018

Всякий раз, когда у меня возникает вопрос о зацикливании в Ansible, я также захожу в документацию Loops .Звучит так, как будто вы хотите выполнить итерацию по двум спискам параллельно, соединяя элемент из списка хостов в вашем инвентаре с элементом из списка имен хостов.В предыдущих версиях Ansible предлагалось использовать цикл with_together, в то время как в более поздних версиях Ansible предлагался фильтр zip (пример в документации здесь ).

Чтобы продемонстрировать это для вашего случая использования, я начал с инвентарного файла, в котором есть три хоста:

[mygroup]
hostA ansible_host=localhost
hostB ansible_host=localhost
hostC ansible_host=localhost

и следующая книга воспроизведения:

---
- hosts: all

- hosts: localhost
  gather_facts: false
  vars:
    hostnames:
      - hostname01
      - hostname02
      - hostname03
  tasks:
    - name: change hostname
      debug:
        msg:
          win_hostname:
            name: "{{ item }}"
      loop: "{{ groups.mygroup|zip(hostnames)|list }}"

Здесь я использую *Задача 1015 * вместо фактического запуска задачи win_hostname.Результат работы:

ansible-playbook -i hosts playbook.yml

Похоже:

TASK [change hostname] ********************************************************************************************************************************
ok: [localhost] => (item=[u'hostA', u'hostname01']) => {
    "msg": {
        "win_hostname": {
            "name": [
                "hostA", 
                "hostname01"
            ]
        }
    }
}
ok: [localhost] => (item=[u'hostB', u'hostname02']) => {
    "msg": {
        "win_hostname": {
            "name": [
                "hostB", 
                "hostname02"
            ]
        }
    }
}
ok: [localhost] => (item=[u'hostC', u'hostname03']) => {
    "msg": {
        "win_hostname": {
            "name": [
                "hostC", 
                "hostname03"
            ]
        }
    }
}

Как вы можете видеть, он связывает каждого хоста из инвентаря с именем хоста из списка hostnames.

Обновление

На основании предоставленной вами дополнительной информации, я думаю, что вы действительно хотите это:

    - name: change hostname
      win_hostname:
        name: "{{ hostnames[group.company.index(inventory_hostname) }}"

Это назначит одно значениеот hostname до каждого хозяина в вашем инвентаре.Мы ищем позицию текущего inventory_hostname в вашей группе, а затем используем ее для индексации в списке hostnames.

...