Ansible package_facts: установить факты, сравнивая с другим простым списком - PullRequest
0 голосов
/ 11 сентября 2018

В настоящее время я работаю над созданием отчета для каждого узла инвентаризации благодаря ansible-cmdb. Этот инструмент отличный, но у меня есть проблема, чтобы изменить некоторые факты:

Я использую модуль package_facts для регистрации установленных пакетов . Они автоматически регистрируются в hostvars как список таких диктовок ( ansible_facts.packages ):

"packages": {
    "accountsservice": [
        {
            "arch": "amd64",
            "name": "accountsservice",
            "source": "apt",
            "version": "0.6.40-2ubuntu11.3"
        }
    ],
    "acl": [
        {
            "arch": "amd64",
            "name": "acl",
            "source": "apt",
            "version": "2.2.52-3"
        }
    ],
    "acpid": [
        {
            "arch": "amd64",
            "name": "acpid",
            "source": "apt",
            "version": "1:2.0.26-1ubuntu2"
        }
    ]}

С другой стороны, у меня есть сценарий удаленного bash , который выводит простой список имен пакетов, установленных вручную на хосте. Для каждого хоста я хочу сравнить два списка, если имя пакета также находится в ansible_facts.packages , затем добавьте ключ в пакет фактов для нужного пакета "manual": true . В противном случае и, если возможно, добавьте «manual»: false . Итак, после сравнения факты должны быть установлены так:

"packages": {
    "accountsservice": [
        {
            "arch": "amd64",
            "name": "accountsservice",
            "source": "apt",
            "version": "0.6.40-2ubuntu11.3",
            "manual": true
        }
    ],
    "acl": [
        {
            "arch": "amd64",
            "name": "acl",
            "source": "apt",
            "version": "2.2.52-3",
            "manual": false
        }
    ],
...}

Как вы думаете, возможно ли это надлежащим образом? Я новичок в отношении обработки структур данных JSON с помощью Ansible, поэтому я сделаю обходной путь со скриптом Python, поскольку несколько дней я работаю надлежащим образом (без успеха).

Было бы большой помощью / шагом, если бы я знал, как сделать это правильно. Заранее спасибо!

1 Ответ

0 голосов
/ 12 сентября 2018

Да, Jinja - довольно мощный язык шаблонов, и вы можете объявлять новые факты с помощью модуля set_facts, что приводит к чему-то вроде этого:

  vars:
    the_list: |
      [
       {"name": "alpha"},
       {"name": "beta"}
      ]
    the_names: |
      ["alpha", "charlie"]
  tasks:
  - set_fact:
     new_list: |
      [
      {% set names_list = (the_names|from_json) %}
      {% for item in (the_list|from_json) %}
      {{ '' if loop.first else ',' }}
      {% set _ = item.update({"manual": item.name in names_list}) %}
      {{ item | to_json }}
      {% endfor %}
      ]
  - debug: var=item.manual verbosity=0
    with_items: '{{ new_list }}'

Где часть set _ =потому что у jinja есть только оператор set, вызывающий побочные эффекты, а остальное - просто приведение текста к фактическому dict, а затем with_items приводит текст обратно к расширенному объекту так же, как--extra-vars и друзья делают это за вас: если он выглядит json-y, они относятся к нему так же.Мы должны сделать from_json вручную, потому что это принуждение является поведением ansible , а не поведением jinja .

...