21 февр. 2017 г.

ansible: list of facts to file

В последнее время активно работаю с системой управления конфигурациями Ansible, поэтому есть что записать. 
Одна из последних задач: получить список хостов, удовлетворяющий заданному условию. В моем случае нужно было отобрать серверы, у которых в перечне используемых файловых систем есть устаревшая ext2. Информация о смонтированных файловых системах есть в автоматически собираемых фактах (gather_facts: yes в ansible.cfg или описании плейбука), поэтому каких-то дополнительных действий на хосте собирать не нужно.
Чуть усложнило ситуацию то, что элемент ansible_mounts представляет собой не словарь, как большинство элементов, возвращаемых модулем setup, а массив. Таким образом, для получения, к примеру, точки монтирования, требуется использовать не ansible_mounts.fstype, а ansible_mounts[0].fstype, причем количество элементов этого массива будет уникальным для каждого хоста. 
Решением такой задачи будет плейбук следующего вида:
- name: Check hosts for ext2fs available
  hosts: all
  gather_facts: yes
  tasks:
    - name: create list of files with ext2fs partitions
      shell: "echo {{ansible_fqdn|quote}},{{item.mount|quote}},{{item.fstype|quote}}, >> ./ext2fs_list_`date +%s`.csv"
      args:
        chdir: /tmp/
      delegate_to: localhost
      with_items: "{{ ansible_mounts }}"
      when: item.fstype == "ext2"
Если исключить атрибут when: , в файл будут записаны все найденные точки монтирования.