У меня есть код, проверяющий наличие чего-то. Если в нем 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