Как сохранить результат команды grep в переменной ansible? - PullRequest
1 голос
/ 07 августа 2020

Я пытаюсь установить переменную Ansible на основе счетчика, возвращаемого командой grep.

Код выглядит следующим образом.

tasks:
  
    - name: Check for 12.1 databases
      shell: "grep -c /u1/app/oracle/product/12.1.0/dbhome_1 /etc/oratab"
      register: grep_output
      
    - name: Print
      debug:
        msg="grep_output.stdout"      
       
    - name: Set the variable
      set_fact:
        oracle_version_12_1_0: "true"
      when: "grep_output.stdout > 0"
      
    - name: Print variable
      command: echo "{{ oracle_version_12_1_0 }}"  

Код ошибки выглядит следующим образом .

PLAY [oradbpoc1] ***********************************************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************
ok: [oradbpoc1]

TASK [Check for 12.1 databases] *********************************************************************************************************
fatal: [oradbpoc1]: FAILED! => {"changed": true, "cmd": "grep -c /u1/app/oracle/product/12.1.0/dbhome_1 /etc/oratab", "delta": "0:00:00.003425", "end": "2020-08-06 18:33:04.476299", "msg": "non-zero return code", "rc": 1, "start": "2020-08-06 18:33:04.472874", "stderr": "", "stderr_lines": [], "stdout": "0", "stdout_lines": ["0"]}

PLAY RECAP *********************************************************************************************************
oradbpoc1                  : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

PS: Также, есть ли способ присвоить значение по умолчанию («false») переменной oracle_version_12_1_0?

Спасибо

FR

1 Ответ

1 голос
/ 08 августа 2020

Что касается условия Fail, это потому, что grep -c PATTERN FILE вернет ненулевой код выхода, если ШАБЛОН не найден в файле.

Быстрый пример:

# grep -c root /etc/passwd; echo $?
2
0

# grep -c rootNO /etc/passwd; echo $?
0
1

Итак, я считаю, что есть два варианта:

  1. Просто основываясь на коде выхода
  2. Установите, чтобы игнорировать ошибку и обрабатывать значение

Поскольку счетчика должно хватить, здесь показан вариант 2:

- hosts: localhost
  tasks:
    - name: get value
      shell:
        cmd: grep -c root /etc/passwd
      register: grep_output
      ignore_errors: yes
      changed_when: false

    - name: Print
      debug:
        msg: "{{ inventory_hostname }}: '{{ grep_output.stdout }}'"

    - name : Set the variable
      set_fact:
        oracle_version_12_1_0: "{% if grep_output.stdout == '0' %}false{% else %}true{% endif %}"

    - name: Print
      debug:
        msg: "val: {{ oracle_version_12_1_0 }}

Отрегулируйте root до rootNo (например), чтобы увидеть разницу между истинным / ложным.

Кроме того, в зависимости от того, что именно вы хотите сделать, также можно зарегистрировать переменную, как указано в get value, а затем использовать ее в проверке when (т. Е. Избегать установки переменной):

- name : task name
  ...
  when: grep_output.stdout != '0'

Будет ли этот последний подход полезным или нет, зависит от общего варианта использования.

...