Назад | Перейти на главную страницу

Как мне создать файлы инвентаризации, в которых есть мои собственные пользовательские факты (docker_version)?

Код Ansible:

---
- hosts: all
  gather_facts: no

  tasks:
  - command: 'docker --version | { read _ _ v _; printf %s\\n "${v%,}"; }'
    register: docker_version

  - debug: var=hostvars[inventory_hostname].docker_version.stdout
    ignore_errors: true

  - set_fact:
      docker_version: "{{ docker_version.stdout }}"

  - name: Display all variables/facts known for a host
    debug: var=hostvars[inventory_hostname]

ansible-playbook -i inventory.txt gather.yml

PLAY [all] *********************************************************************

TASK [command] *****************************************************************
changed: [10.x-hosname]

TASK [debug] *******************************************************************
ok: [10.x-hosname] => {
    "hostvars[inventory_hostname].docker_version.stdout": "Docker version 1.12.3, build 34a2ead"
}

TASK [set_fact] ****************************************************************
ok: [10.x-hosname]

TASK [Display all variables/facts known for a host] ****************************
ok: [10.x-hosname] => {
    "hostvars[inventory_hostname]": {
        "ansible_check_mode": false,
        "ansible_version": {
            "full": "2.2.1.0",
            "major": 2,
            "minor": 2,
            "revision": 1,
            "string": "2.2.1.0"
        },
        "docker_version": "Docker version 1.12.3, build 34a2ead",
        "group_names": [],
        "groups": {
            "all": [
                "10.x-hosname"
            ],
            "ungrouped": []
        },
        "inventory_dir": "/Users/username/Git/gather",
        "inventory_file": "/Users/username/Git/gather/inventory.txt",
        "inventory_hostname": "10.x-hosname",
        "inventory_hostname_short": "10",
        "playbook_dir": ""
    }
}

10.x-hosname - это IP-адрес, указанный в inventory.txt.

Я хотел бы, чтобы этот сценарий создавал файл инвентаризации json с нескольких серверов, включая настраиваемые факты, такие как docker_version. Результат последней команды - это именно то, что я хочу видеть в файле json, но для нескольких хостов.

Сделайте шаблон (например, facts.j2):

[
{% for host in play_hosts %}
  {{ hostvars[host] | to_nice_json }}
  {% if not loop.last %},{% endif %}
{% endfor %}
]

Назовите это последней задачей:

- name: Generate JSON
  template:
    src: facts.j2
    dest: /tmp/facts.json
  delegate_to: localhost
  run_once: yes