Ansible при сравнении двух переменных - PullRequest
1 голос
/ 07 января 2020

В vars/main.yml У меня есть это:

user_data:
  service:
    name: hello1
    description: abc
    update:
      name: hello
      version: 1

В playbook я пытаюсь написать, когда условие:

      - name: "stop all"
        systemd:
          name: "does not matter.service"
          state: stopped
        when: user_data.service.update is defined

Это работает.

Когда я пишу эту задачу с update, когда условие:

      - name: "stop all"
        systemd:
          name: "does not matter.service"
          state: stopped
        when: user_data.service.update.name is defined

Пропускается

Все переменные устанавливаются в vars/main.yml или передаются с использованием дополнительных переменных как JSON.

Что не так?

Ответы [ 2 ]

1 голос
/ 07 января 2020

update на самом деле является зарезервированным словом (т. Е. Встроенным методом объекта dict). Смотрите следующую книгу. Вы можете определить ключ update ha sh в yaml, но я не нашел способа вернуть его правильно. Единственное решение, которое я вижу на данный момент (помимо запуска билета в проекте github ansible), - переименовать ваш ключ ha sh во что-то другое.

Следующий playbook

---
- name: Debug that tricky thing
  hosts: localhost
  gather_facts: false

  vars:
    user_data:
      service:
        name: hello1
        description: abc
        update:
          name: hello
          version: 1

  tasks:
    - name: Show the full var
      debug:
        var: user_data

    - name: Try to how the update hash test1
      debug:
        var: user_data.update

    - name: Try to how the update hash test2
      debug:
        var: user_data["update"]

Результаты в

PLAY [Debug that tricky thing] ******************************************************************************************************************************************************************************************************************************************

TASK [Show the full var] ************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "user_data": {
        "service": {
            "description": "abc",
            "name": "hello1",
            "update": {
                "name": "hello",
                "version": 1
            }
        }
    }
}

TASK [Try to how the update hash test1] ***************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "user_data.update": "<built-in method update of dict object at 0x7fc5d9256630>"
}

TASK [Try to how the update hash test2] ***********************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "user_data[\"update\"]": "<built-in method update of dict object at 0x7fc5d9256630>"
}

PLAY RECAP **************************************************************************************************************************************************************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
0 голосов
/ 07 января 2020

Проблема в том, что python интерпретатор не понимает формат объекта в файле main.yml. Преобразуйте этот объект в формат, понятный интерпретатору. Обычно python объекты представлены в виде словаря, поэтому вы можете преобразовать его в нечто вроде этого:

user_data = {'service': {'attr': 1, 'some_a': ' ab c '},' update ': {' name: 'hello', 'version': 1}}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...