Я развертываю виртуальный сервер SAML BigIP IdP в режиме, инициированном IdP, благодаря шаблону iApps f5.saas_idp.v1.0.1rc1 на основе инструкции от https://www.f5.com/pdf/deployment-guides/saml-idp-saas-dg.pdf
Он хорошо работает из мастера BigIP, но я ожидаю автоматизировать и документировать развертывание благодаря Ansible playbook.
- name: Deploy {{ idp_host }} with f5.saas_idp iApp template
bigip_iapp_service:
name: "saas_idp_{{ idp_host }}"
template: f5.saas_idp.v1.0.1rc1
parameters:
tables:
- name: saas_apps__saas_choice
columnNames:
- app_name
- app_selection
- app_sp
- sp_initiated
rows:
- row:
- "{{ saml_saas_name }}"
- "/#zendesk#"
- "{{ saml_saas_sp }}"
- no # which means "Yes, IdP and SP"
- name: saas_apps__saas_attributes
# Empty
variables:
- name: options__advanced_mode
value: yes
- name: saas_virtual__addr
value: "{{ idp_address }}"
- name: saas_virtual__port
value: 443
- name: idp_encryption__cert
value: /Common/{{ idp_host }}_saml_idp_metadata_cert.crt
- name: idp_encryption__key
value: /Common/{{ idp_host }}_saml_idp_metadata_cert.key
- name: saas_virtual__vlan_listening
value: enabled
- name: saas_virtual__vlan_selections
value: /Common/Internal
- name: saas_virtual__lan_or_wan
value: LAN
- name: saas_virtual__tcp_lan_opt
value: tcp-lan-optimized
- name: saas_virtual__http
value: http
- name: saas_virtual__clientssl
value: /Common/clientssl_wildcard_2017-2020
- name: saas_virtual__chainssl
name: "/#do_not_use#"
- name: apm__apm_policy
value: "/#create_new#"
- name: apm__saml_entity_id_format
value: url
- name: apm__saml_entity_id
value: https://{{ idp_host }}
- name: apm__aaa_profile
value: /Common/AAA_myAD
- name: apm__logging
value: /Common/default-log-setting
force: no
state: present
strict_updates: no
Но сценарий не работает, требуя saas_virtual__key
, saas_virtual__cert
и saas_virtual__chainssl
тогда как они не ожидаются, поскольку я предоставляю существующий saas_virtual__clientssl
в расширенном режиме:
message":"script did not successfully complete: (can't read "::saas_virtual__key": no such variable
while executing
"iapp_conf create $cssl_cmd key $::saas_virtual__key cert $::saas_virtual__cert chain none"
invoked from within
"subst $substa_out"
invoked from within
"if { [info exists [set substa_in]] } {
set substa_out [subst $$substa_in]
set substa_out [subst $substa_out]
} else {
..."
("uplevel" body line 3)
invoked from within
"uplevel {
append ::substa_debug "
$substa_in"
if { [info exists [set substa_in]] } {
set substa_out [subst $$substa_in]
..."
(procedure "iapp_substa" line 9)
invoked from within
"iapp_substa client_ssl_arr($new_client_ssl,$do_chain_cert)"
invoked from within
"iapp_conf create ltm virtual ${app}_vs destination [iapp_destination $::saas_virtual__addr $::saas_virtual__port] ip-protocol tcp profiles replace-..."
Предоставление этих переменных не помогает, скрипт не загружается из-за ключевого пароля, который я не могу предоставить:
Error reading key PEM file /Common/wildcard_2017-2020.key
for profile /Common/saas_idp.app/saas_idp_myidphost_client-
ssl: error:0906A068:PEM routines:PEM_do_header:bad password read
Поэтому, с моей точки зрения, лучший вариант - получить шаблон с использованием моего существующего профиля clientssl. Как действовать ? Есть ли способ «отладить» сценарий шаблона iApps, по крайней мере, проверить переменные?
Я выяснил, где была ловушка, которую следует избегать - Ansible заменил значение yes на логический объект True python перед отправкой переменной, поэтому отбрасывая ожидаемую строку:
variables:
- name: options__advanced_mode
value: "yes"
В результате расширенный режим не был включен, и поэтому выполнение TCL iApps пытается создать новый профиль clientssl:
# Client SSL Profile
set new_client_ssl [expr { !$advanced || [iapp_is ::saas_virtual__clientssl "/#create_new#"] }]
set do_chain_cert [expr { $advanced && \
[info exists ::saas_virtual__chainssl] && \
![iapp_is ::saas_virtual__chainssl "/#do_not_use#"] }]
Так что шаблон iApps определенно хорош ... но для упрощения автоматизации из REST или Ansible проверка входных параметров может быть улучшена для отправки соответствующего предупреждения, прежде чем произойдет сбой с сообщением об ошибке и трассировкой стека.