Назад | Перейти на главную страницу

Могу ли я напрямую зарегистрировать вывод команды в ansible как логическое значение?

У меня есть код, проверяющий наличие чего-то. Если в нем 2 строки, значит, сообщение существует. Могу ли я зарегистрировать переменную из проверки в логическое значение сразу в первой задаче, вместо того, чтобы приводить ее во второй? Мое текущее решение:

- name: Check if home page has been created
  sudo_user: www-data
  shell: wp post list --post_type=page --post_title=Home --post_status=publish
    chdir={{wordpress_path}}
  register: is_homepage_created

- name: Booleanize homepage check
  set_fact:
    is_homepage_created={{is_homepage_created.stdout_lines|length >= 2}}

Я так не думаю, так как вам нужно использовать set_fact чтобы установить для него что-либо, кроме его фактического вывода, и я не думаю shell может возвращать логическое значение напрямую.

Я считаю, что обычный способ сделать это - воспроизвести условное выражение, имеющееся в задаче «booleanize», везде, где вы используете этот факт, чего вы, естественно, хотите избежать. К сожалению, функционал реестра довольно прост.

Вероятно, вы могли бы использовать комбинацию failed_when и ignore_errors: yes чтобы реализовать такую ​​функциональность, но это приведет к сбою выполнения карты команд оболочки для одного логического или другого, поэтому я бы не рекомендовал это.

После некоторой игры с wp, Я не мог заставить его фактически фильтровать вывод по заголовку сообщения. Он всегда отображал список каждой страницы. Возможно, это не имеет отношения к вам, но может.

Учитывая эту очевидную ошибку, я бы переписал пьесу следующим образом:

Во-первых, есть wp вывод в формате CSV, с которым будет проще работать. Затем проверьте, отображается ли в нем желаемый результат. В формате CSV, если страница с именем Home существует, то строка ,Home, будет на выходе и не должен совпадать ни с чем другим, так что это то, что мы будем искать.

- name: Get list of WordPress pages
  sudo_user: www-data
  command: wp post list --post_type=page --post_title=Home --post_status=publish --format=csv
    chdir={{wordpress_path}}
  register: wordpress_pages

- name: Create the homepage if it doesn't exist
  sudo_user: www-data
  command: wp post create --post_type=page --post_title=Home --porcelain
    chdir={{wordpress_path}}
  when: "',Home,' not in wordpress_pages.stdout"

Наконец, лучше всего использовать command вместо того shell если вам действительно не нужно передавать команду через оболочку.

Для этого вы можете использовать поиск.

ansible-playbook -c local test_lines_lookup.yml

Пособие:

---

- hosts: localhost
  gather_facts: false

  tasks:
    - set_fact:
        test: "{{ lookup('lines', 'echo "This is stdout"') }}"

    - debug:
        msg: "{{ test }}"

Вывод:

PLAY [localhost] ************************************************************************

TASK [set_fact] *************************************************************************
ok: [localhost]

TASK [debug] ****************************************************************************
ok: [localhost] => {
    "msg": "This is stdout"
}

PLAY RECAP ******************************************************************************    
localhost                  : ok=2    changed=0    unreachable=0    failed=0