Как запустить задачу, если определена только переменная

У меня есть следующая задача:

-name : task name
 cron:
     ...
     ...
     ...     
 when:  "{{ vars[cname].cron }}" is defined

я хочу выполнить задачу, только если переменная server1.cron для хоста server1 и server2.cron для хоста server2 и т.д.. определена, но ansible не нравится синтаксис, когда я разрешаю только vars[cname].cron ansible с ou " " он не заменяет vars [cname].cron на server1.cron или server2.cron, он интерпретирует его как переменную "vars[cname].cron", которая не существует. Сталкивались ли вы с этой проблемой? Заранее спасибо ^^!

2 ответа

Решение

Попробуйте это на:

---

- hosts: all
  gather_facts: False

  vars:
    my_vars:
      cname1:
        cron: "val1"
      cname2:
        cron2: "val2"

  tasks:
    - name: task name 1
      debug:
        msg: "test"
      when:  my_vars['cname1']['cron'] is defined

    - name: task name 2
      debug:
        msg: "test"
      when:  my_vars['cname2']['cron'] is defined

Выход

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

TASK [task name 1] *******************************************************************************************************************************************
ok: [host] => {
    "msg": "test"
}

TASK [task name 2] *******************************************************************************************************************************************
skipping: [host]

PLAY RECAP ***************************************************************************************************************************************************
host                    : ok=1    changed=0    unreachable=0    failed=0

Или другой подход:

инвентарь

[all]
staging cname=server1_prod
testing cname=server2_prod

Playbook:

---

- hosts: all
  gather_facts: False

  vars:
    my_vars:
      server1_prod:
        cron: "val1"
      server2_prod:
        cron2: "val2"

  tasks:
    - name: task name 1
      debug:
        msg: "test"
      when:  my_vars[cname]['cron'] is defined

Вы должны пропустить цитаты в when раздел. https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html

У меня в инвентаре есть файл:

    server1-prod     cname=server1_prod
    server2-prdo    cname=server2_prod

......
.....

в моей роли у меня есть в VARS файл, подобный этому для каждого сервера: server1_pprod server2_pp и т. д... <== это имя файлов, которые находятся в роли / VARS /

cron:
  job1:
        name: "******"
        job: "********"
        minute: "0"
        hour: "0"
        day: "*"
        month: "*"
        weekday: "*"
        disabled: "no"
        backup: yes
        job: "*******************************"


cron_special_time:
  job1:
        name: "******"
        special_time: "reboot"
        disabled: "yes"
        backup: yes
        job: "*****"
  job2:
        name: "*****"
        special_time: "reboot"
        disabled: "yes"
        backup: yes
        job: "*****"

Я включил файл с этой задачей, чтобы у меня был variabl serveX_prod для каждого файла serverX_prod, который тратится в ядре serveX-prod в инвентаре

- name: Loading system cron  file to vars
  include_vars:
    file: "{{ cname }}"
    name: "{{ cname  }}"

Затем я получаю доступ к переменной в задаче:

- name: Add system  cron jobs
  cron:
              .....
             ......
  with_dict:
        - "{{ vars[cname].cron }}"
   when:  "{{ vars[cname].cron }}" is defined

вы видите проблему в том, что я не могу поставить " " в предложении, и я не могу получить динамическую переменную без " ", я запутался

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