Ansible, как преобразовать логические типы true и false в соответствующие строки

Вот моя книга игр, я не использовал логический тип напрямую для совместимости с предыдущей версией, которая была получена из инвентаря, я посмотрел книгу пьес и увидел when: cluster_allinone == "true", который я, возможно, забыл изменить при выполнении сценария, поэтому я хотел переопределить значение cluster_allinone, не изменяя предыдущую книгу правил.

- name: check node counnt
  hosts: all:!gaop-vip-addresses
  tasks:
    - name: Get the number of nodes in group2
      set_fact:
        worker_count: "{{ groups['k8s-worker'] | length }}"

    - debug:
        var: worker_count

    - name: set cluster_allinone var
      set_fact:
        cluster_allinone: 'true'
      when: (worker_count | int) == 0

    - name: set cluster_allinone var
      set_fact:
        cluster_allinone: 'false'
      when: (worker_count | int) > 0

    - debug:
        var: cluster_allinone

    - debug:
        msg: single
      when: cluster_allinone == "true"

    - debug:
        msg: mutil
      when: cluster_allinone  == "false"

Но cluster_allinone, похоже, имеет логический тип, я пробовал to_json и ternary('true', 'false').

    - name: set cluster_allinone var
      set_fact:
        temp: 'true'
      when: (worker_count | int) == 0

    - name: set cluster_allinone var
      set_fact:
        temp: 'false'
      when: (worker_count | int) > 0


--- try but fail


    - name: set cluster_allinone var
      set_fact:
        cluster_allinone: "{{temp | to_json}}"

    - name: set cluster_allinone var
      set_fact:
        cluster_allinone: "{{(worker_count | int) == 0}}"

    - name: set cluster_allinone var
      set_fact:
        cluster_allinone: "{{temp | ternary('true', 'false')}}"
ansible --version
ansible 2.4.5.0
  config file = /data/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /data/ansible/lib/ansible
  executable location = /data/ansible/bin/ansible
  python version = 2.7.12 (default, Nov 19 2018, 06:48:02) [GCC 5.4.0 20160609]

Потратил на это слишком много времени, любая помощь приветствуется!

Нет абсолютной необходимости в задачах set_fact и запрошенном преобразовании типов, см. ответ Владимира. Дополнительную информацию см. также в разделе Ansible: как сохранить переменный тип данных в set_fact? и Bool-фильтр в Ansible не выводит true для непустых строк.

U880D 04.07.2024 11:57
Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
1
1
78
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Чтобы обеспечить совместимость с существующей книгой воспроизведения и правильно обрабатывать переменную «cluster_allinone» как строку («true» или «false»), вы можете настроить свою книгу воспроизведения, используя «set_fact», чтобы явно установить переменную «cluster_allinone» как строка, основанная на worker_count. Вы можете исправить следующее:

  • имя: проверить количество узлов хосты: all:!gaop-vip-адреса задания:
    • name: Получить количество узлов в группе2. set_fact: worker_count: "{{ groups['k8s-worker'] | длина }}"

    • отлаживать: вар: worker_count

    • имя: установите для параметраuster_allinone var значение true, если worker_count равен 0 set_fact: Cluster_allinone: 'истина' когда: (worker_count | int) == 0

    • имя: установите для параметраuster_allinone var значение false, если значение worker_count больше 0. set_fact: Cluster_allinone: 'ложь' когда: (worker_count | int) > 0

    • отлаживать: вар: кластер_аллиноне

    • отлаживать: сообщение: сингл когда: Cluster_allinone == "истина"

    • отлаживать: сообщение: несколько когда: Cluster_allinone == "ложь" Удачи!!!

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

HuaJFrame 03.07.2024 16:23

Узнайте, как правильно форматировать код.

Squashman 03.07.2024 21:22
Ответ принят как подходящий

См. Булевы переменные. Действительно, тип кластера_allinone — bool.

    - set_fact:
        cluster_allinone: 'true'
    - debug:
        msg: "{{ cluster_allinone | type_debug }}"

дает

  msg: bool

Используйте его как логическое значение. Это упростит код

    - debug:
        msg: single
      when: cluster_allinone

    - debug:
        msg: multi
      when: not cluster_allinone

дает

  msg: single

Example of a complete playbook for testing

- hosts: localhost

  tasks:

    - set_fact:
        cluster_allinone: true

    - debug:
        msg: single
      when: cluster_allinone

    - debug:
        msg: multi
      when: not cluster_allinone

Спасибо, я понимаю, что вы имеете в виду, но еще один вопрос: я установил cluster_allinone = false в файле инвентаря и отлаживал его - debug: msg: "{{ cluster_allinone | type_debug }}", ok: [192.168.1.52] => { "msg": "unicode" },Знаете ли вы, как преобразовать его в логический тип?

HuaJFrame 04.07.2024 15:39

@HuaJFrame, через bool-фильтр .

U880D 04.07.2024 16:52

Если вы планируете присвоить переменной стиль INI, преобразуйте ее явно в логическое значение when: cluster_allinone | bool. Проблема в том, что стиль INI всегда является строкой.

Vladimir Botka 04.07.2024 16:53

Другие вопросы по теме