ansible проверить имя файла с другим регистром строк, могу ли я реализовать if / else? - PullRequest
0 голосов
/ 05 мая 2020

У меня есть этот случай, который в разных условиях может иметь одно и то же имя файла, но с разными строковыми регистрами: thetest.log или TheTest.log
, а затем третья задача, проверяющая log_result.
только thetest.log exsist. поэтому
он терпит неудачу как вторая задача, хотя он пропустил, он установил log_result, но не как файл.
поэтому я получаю сообщение об ошибке:

 msg: |-
    The conditional check 'log_result.stat.exists == True' failed. The error was: error while evaluating conditional (log_result.stat.exists == True): 'dict object' has no attribute 'stat'





- name: Check if thetest.log exists in path
  stat:
    path: "{{ ansible_env.APP }}/thetest.log"
  register: log_result

- name: Check if TheTest.log exists in p_home
  stat:
    path: "{{ ansible_env.APP }}/TheTest.log"
  register: log_result
  when: name_var.stdout is match("foo")

- name: Create temporary log folder
  file:
    path: "{{ ansible_env.APP }}/log_tmp"
    state: directory
  when: log_result.stat.exists == True

не могу реализовать простое if / еще говорят:

if thetest.log exist
log_result = stat from thetest.log
else 
log_result = stat from TheTest.log

1 Ответ

1 голос
/ 05 мая 2020

Ansible не имеют простой конструкции if-else и будут регистрировать переменную, даже если задача будет пропущена. Лучше всего использовать две разные переменные для проверки существования каждого файла, а затем записать третье условие, как это необходимо.

- name: Check if thetest.log exists in path
  stat:
    path: "{{ ansible_env.APP }}/thetest.log"
  register: log_result_1

- name: Check if TheTest.log exists in p_home
  stat:
    path: "{{ ansible_env.APP }}/TheTest.log"
  register: log_result_2
  when: name_var.stdout is match("foo")

- name: Create temporary log folder
  file:
    path: "{{ ansible_env.APP }}/log_tmp"
    state: directory
  when: log_result_1.stat.exists or (log_result_2 is not skipped and log_result_2.stat.exists)

Пожалуйста, проверьте документацию здесь,


ОБНОВЛЕНИЕ

Еще один способ проверить оба файла в одной задаче, а затем собрать результат в одной переменной, используя set_fact

- name: Check multiple file stat
  stat:
    path: "{{ item }}"
  loop:
    - "{{ ansible_env.APP }}/thetest.log"
    - "{{ ansible_env.APP }}/TheTest.log"
  register: file_stats

- set_fact:
    result: "{{ file_stats.results[0].stat.exists or file_stats.results[1].stat.exists }}"

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