Создать совпадающие задачи на основе переменных в файле с Ansible - PullRequest
0 голосов
/ 14 апреля 2020

Я не уверен, что Ansible является правильным способом сделать это, но вот что мне нужно сделать: у меня есть файл со списком из 2 столбцов (Host IP | Ma c Address) и Я хочу запустить ansible playbook, чтобы сопоставить IP-адрес хоста с моим IP-файлом хоста. Когда IP-адрес хоста совпадает, запустите задачу "show ma c address" для этого совпадающего хоста. Как я могу go об этом? Это будет "l oop" и "if". Не уверен, как объединить оба в Ansible

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Как объяснено в моих комментариях, в вашем вопросе IMO не хватает некоторых примеров и испытаний с вашей стороны, чтобы полностью получить то, что вы пытаетесь достичь и как. В то же время, делая некоторые предположения, вот простой пример, который, возможно, направит вас в нужное русло.

Я предполагаю, что ваш файл ip / ma c является файлом в формате csv (или легко преобразовывается в этот формат). Это файл, который я использовал для тестов:

data.csv

1.1.1.1,aa:aa:aa:aa:aa:aa
2.2.2.2,bb:bb:bb:bb:bb:bb

Мне понадобился фальшивый инвентарь для запуска. Это снова тестовый

inventory.ini

test1.local ansible_host=1.1.1.1
test2.local ansible_host=2.2.2.2

Наконец, это книга, которая, я полагаю, выполняет ту работу, которую вы ждете. Конечно, я играю против фальшивого инвентаря выше и получаю IP-адрес, который я сам установил в ansible_host. Вам придется адаптироваться к вашей реальной жизненной ситуации.

test.yml

---
- name: read our ref file
  hosts: localhost
  gather_facts: false

  tasks:
    - name: read ref csv for future use
      read_csv:
        fieldnames:
          - ip
          - macaddress
        key: ip
        path: data.csv
      register: my_data

    - name: Show how our var looks like 
      debug:
        var: my_data.dict

- name: Get mac depending on host IP
  hosts: all
  gather_facts: false

  vars:
    my_mac_info: "{{ hostvars.localhost.my_data.dict }}"

  tasks:
    - name: Show macaddress in file for current ip
      debug:
        msg: "Current host is {{ inventory_hostname }} with ip {{ ansible_host }}. Lookup macaddress is {{ my_mac_info[ansible_host].macaddress }}"

И вот результат:

$ ansible-playbook -i inventory.ini test.yml 

PLAY [read our ref file] ***************************************************************************************************************************************************************************************************************

TASK [read ref csv for future use] *****************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [Show how our var looks like] *****************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "my_data.dict": {
        "1.1.1.1": {
            "ip": "1.1.1.1",
            "macaddress": "aa:aa:aa:aa:aa:aa"
        },
        "2.2.2.2": {
            "ip": "2.2.2.2",
            "macaddress": "bb:bb:bb:bb:bb:bb"
        }
    }
}

PLAY [Get mac depending on host IP] ****************************************************************************************************************************************************************************************************

TASK [Show macaddress in file for current ip] ******************************************************************************************************************************************************************************************
ok: [test1.local] => {
    "msg": "Current host is test1.local with ip 1.1.1.1. Lookup macaddress is aa:aa:aa:aa:aa:aa"
}
ok: [test2.local] => {
    "msg": "Current host is test2.local with ip 2.2.2.2. Lookup macaddress is bb:bb:bb:bb:bb:bb"
}

PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test1.local                : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test2.local                : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
0 голосов
/ 14 апреля 2020

Ansible не обязательно правильный инструмент для этой работы. Но это может сработать.

Если вы хотите использовать Ansible, вы можете сохранить некоторые переменные в набор локальных файлов и затем объединить их.

Сначала давайте создадим каталог для хранения наших временных файлов ...

$ mkdir ansible_host_map

Теперь давайте создадим книгу воспроизведения ...

# main.yaml

- name: Get hostname-ip-macaddress map
  hosts: all
  tasks:
    - name: Save hostname ip and mac
      become: false
      copy:
        content: "{{ ansible_hostname }} {{ ansible_eth0.ipv4.address }} {{ ansible_eth0.macaddress }}"
        dest: "ansible_host_map/{{ inventory_hostname }}.tmp"
      delegate_to: localhost

Наконец, давайте создадим скрипт для их объединения ...

# concat.sh

echo "Hostname IPv4 MAC" > hostmap.txt

for filename in ansible_host_map/*.tmp; do
    cat $filename >> hostmap.txt
done

echo "" >> hostmap.txt

echo "Done!"

Теперь давайте запустим все (не забудьте нам $ chmod +x concat.sh, чтобы сделать concat.sh исполняемым) ...

$ ansible-playbook main.yaml
$ ./concat.sh

Теперь содержимое вашего hostname.txt файл должен выглядеть так ...

Hostname IPv4 MAC
<HOSTNAME> <IPv4_ADDRESS> <MAC_ADDRESS>
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...