nmasse-itix.threescale-cicd
ansible-cicd
Umożliwia ciągłą dostawę z wykorzystaniem platformy zarządzania API Red Hat 3scale (3scale AMP).
Wymagania
Ta rola wymaga:
- instancji platformy zarządzania API 3scale (hostowanej lub lokalnej)
- instancji Red Hat SSO, jeśli planujesz używać uwierzytelniania OpenID Connect
- dwóch bramek APIcast (staging i produkcja), hostowanych lub zarządzanych samodzielnie
- pliku Swagger 2.0 opisującego API, które chcesz opublikować
Wszystkie komponenty są obsługiwane przez API, więc nie jest wymagane połączenie SSH!
Na węźle kontrolnym wymagana jest biblioteka jmespath. Jeśli nie jest jeszcze zainstalowana, możesz ją zainstalować za pomocą:
pip install jmespath
Wymagana jest również świeża wersja Jinja (2.8). Możesz zaktualizować swoją wersję Jinja poleceniem:
pip install -U Jinja2
Jeśli twój węzeł kontrolny działa na RHEL7, możesz uruchomić ten playbook w celu zainstalowania brakujących zależności.
Przykład: Wdrożenie API na 3scale SaaS z hostowanymi bramkami APIcast
Jeśli chcesz wdrożyć klasyczne "Echo API" na instancji SaaS 3scale, używając kluczy API, możesz to zrobić w trzech krokach:
- Przygotuj plik Swagger dla swojego Echo API
- Zbuduj swój plik inwentaryzacyjny
- Napisz playbook
- Uruchom playbook!
Najpierw upewnij się, że twój plik swagger (api-swagger.yaml) zawiera wymagane informacje:
swagger: '2.0'
info:
x-threescale-system-name: 'echo-api'
title: 'Echo API'
version: '1.0'
host: 'echo-api.3scale.net'
paths:
/:
get:
operationId: Echo
summary: 'Uzyskaj echo'
description: 'Uzyskaj echo z serwera'
x-threescale-smoketests-operation: true
responses:
200:
description: 'Echo z serwera'
security:
- apikey: []
securityDefinitions:
apikey:
name: api-key
in: header
type: apiKey
W tym pliku Swagger używane są następujące pola:
x-threescale-system-namejest używane jako podstawa dla system_name dla obiektów konfiguracyjnych w 3scale.titlejest używane jako nazwa definicji usługi.versionjest używane do odpowiedniego wersjonowania i przestrzega schematu semver.hostto nazwa DNS istniejącego backendu API, który ma być udostępniony.- pola
operationIdsą używane jako system_name dla metod/mierników. - pola
summaryidescriptionsą używane jako nazwa i opis dla metod/mierników. x-threescale-smoketests-operationjest używane do oznaczenia jednej operacji jako przydatnej do testów dymnych. Metoda musi być idempotentna, tylko do odczytu i bez parametrów. Jeśli żadna metoda nie zostanie oznaczona jako test dymny, testy dymne po prostu zostaną pominięte.securityisecurityDefinitionssą używane do określenia schematu zabezpieczeń wystawianego API. W tym przykładzie używamy schematu kluczy API.
Następnie napisz plik inventory:
[all:vars]
ansible_connection=local
[threescale]
<TENANT>-admin.3scale.net
[threescale:vars]
threescale_cicd_access_token=<ACCESS_TOKEN>
Najważniejsze elementy pliku inwentaryzacyjnego to:
- portal administracyjny 3scale musi być zadeklarowany w grupie o nazwie
threescale. - token dostępu 3scale musi być ustawiony w zmiennej
threescale_cicd_access_token. - ponieważ nie jest wymagane połączenie SSH (używamy tylko API Administracji 3scale),
ansible_connection=localjest ustawione dla całej inwentaryzacji.
Teraz możesz napisać playbook (deploy-api.yaml):
- hosts: threescale
gather_facts: no
vars:
threescale_cicd_openapi_file: 'api-swagger.yaml'
roles:
- nmasse-itix.threescale-cicd
Główne części to:
threescale_cicd_openapi_fileto ścieżka do pliku swagger zdefiniowanego w kroku 1.- używana jest rola
nmasse-itix.threescale-cicd. gather_facts: nomusi być używane, ponieważ nie ma połączenia SSH z systemami docelowymi.
Na koniec możesz uruchomić playbook:
ansible-galaxy install nmasse-itix.threescale-cicd
ansible-playbook -i inventory deploy-api.yaml
Inwentaryzacja
Portal administracyjny 3scale, który zostanie utworzony, to ten, który jest cytowany w playbooku, który zawiera tę rolę. Na przykład, w poprzednim przykładzie portal administracyjny 3scale będzie <TENANT>-admin.3scale.net, ponieważ główny playbook określa hosts: threescale, a grupa threescale zawiera tylko jednego hosta: <TENANT>-admin.3scale.net.
Jeśli określisz wiele hostów dla portalu administracyjnego 3scale, wszystkie zostaną skonfigurowane z dokładnie tą samą konfiguracją (przydatne w przypadku wdrożeń wielostanowiskowych).
Aby połączyć się z portalem administracyjnym 3scale, musisz dostarczyć token dostępu
z uprawnieniami do odczytu/zapisu na API zarządzania kontem. Możesz podać ten token na poziomie hosta, na poziomie grupy lub globalnie za pomocą zmiennej
threescale_cicd_access_token.
Na poziomie hosta definiuje się go w ten sposób:
[threescale]
tenant1-admin.3scale.net threescale_cicd_access_token=123...456
tenant2-admin.3scale.net threescale_cicd_access_token=789...012
Na poziomie grupy można go zdefiniować w ten sposób:
[threescale:vars]
threescale_cicd_access_token=123...456
[threescale]
tenant1-admin.3scale.net
tenant2-admin.3scale.net
Możesz też zdefiniować go globalnie, na przykład jako zmienne playbooka:
- hosts: threescale
vars:
threescale_cicd_access_token: 123...456
Instancja Red Hat SSO (aktualnie może być tylko jedna) jest definiowana przez
zmienną threescale_cicd_sso_issuer_endpoint grupy threescale.
Jej składnia to https://<client_id>:<client_secret>@hostname/auth/realms/<realm>.
client_id/client_secret są używane przez Zync do synchronizacji aplikacji 3scale z Red Hat SSO.
Przykład:
threescale_cicd_sso_issuer_endpoint=https://3scale:123@sso.acme.corp/auth/realms/acme
Instancje APIcast są definiowane za pomocą następujących dodatkowych zmiennych:
threescale_cicd_apicast_sandbox_endpointthreescale_cicd_apicast_production_endpoint
Przykład:
threescale_cicd_apicast_sandbox_endpoint=http://api-test.acme.corp
threescale_cicd_apicast_production_endpoint=https://api.acme.corp
Pola specyfikacji OpenAPI
Ta rola obecnie obsługuje tylko specyfikacje OpenAPI v2.0 (znanej również jako Swagger 2.0).
Można używać następujących rozszerzonych pól specyfikacji OpenAPI:
x-threescale-system-name, w strukturzeinfojest używane jako podstawa do skonstruowania system_name dla obiektów konfiguracyjnych w 3scale.x-threescale-smoketests-operationw definicji metody jest używane do oznaczenia tej operacji jako przydatnej do testów dymnych. Metoda musi być idempotentna, tylko do odczytu i bez parametrów. Jeśli żadna metoda nie jest oznaczona jako test dymny, testy dymne są po prostu pomijane.
Jeżeli rozszerzone pola nie mogą być używane (np. jeśli nie chcesz zmieniać swojej umowy API), możesz użyć odpowiadającej im dodatkowej zmiennej:
threescale_cicd_api_base_system_namethreescale_cicd_openapi_smoketest_operation
Oto przykład specyfikacji OpenAPI wykorzystującej te rozszerzone pola:
swagger: '2.0'
info:
x-threescale-system-name: 'echo-api'
title: 'Echo API'
version: '1.0'
host: 'echo-api.3scale.net'
paths:
/:
get:
operationId: Echo
summary: 'Uzyskaj echo'
description: 'Uzyskaj echo z serwera'
x-threescale-smoketests-operation: true
responses:
200:
description: 'Echo z serwera'
security:
- apikey: []
securityDefinitions:
apikey:
name: api-key
in: header
type: apiKey
Namely, echo-api zostanie użyte jako podstawa do stworzenia system_name
definicji usługi 3scale, a GET na / zostanie wykorzystane jako
test dymny.
Aby osiągnąć ten sam efekt bez rozszerzonych pól OpenAPI, musiałbyś przekazać następujące dodatkowe zmienne:
threescale_cicd_api_base_system_name=echo-api
threescale_cicd_openapi_smoketest_operation=Echo # operationId metody "GET /"
Poniższe standardowe pola specyfikacji OpenAPI są używane.
W sekcji info:
titlejest używane jako nazwa wyświetlana definicji usługi 3scale.versionjest używana do odpowiedniego wersjonowania i przestrzega schematu semver.hostto nazwa DNS istniejącego backendu API, który ma być eksponowany.
Dla każdej zdefiniowanej metody:
- pole
operationIdjest używane jako system_name dla odpowiednich metod/mierników. - pola
summaryidescriptionsą używane jako nazwa i opis dla metod/mierników. securityisecurityDefinitionssą używane do określenia schematu zabezpieczeń eksponowanego API.
Aby mieć odwzorowanie jeden-do-jednego między specyfikacjami OpenAPI a funkcjami 3scale,
zastosowano pewne ograniczenia na struktury security/securityDefinitions.
Namely, musi istnieć jeden i dokładnie jeden wymóg bezpieczeństwa w strukturze security.
Wymóg bezpieczeństwa musi być stosowany globalnie (nie na zasadzie per metoda).
Definicje zabezpieczeń mają też ograniczenia: można wybrać tylko dwa schematy zabezpieczeń:
- OAuth / OpenID Connect
- Klucz API
Schemat App Key Pair proponowany przez 3scale nie ma odpowiadającej definicji w specyfikacjach OpenAPI i obecnie nie jest obsługiwany przez tę rolę.
Aby być bardziej konkretnym, aby zabezpieczyć swoje API przy użyciu klucza API, użyj tego fragmentu w pliku specyfikacji OpenAPI:
securityDefinitions:
apikey:
name: api-key
in: header
type: apiKey
security:
- apikey: []
Możesz oczywiście wybrać nazwę nagłówka HTTP, która będzie używana do wysyłania
klucza API, zmieniając pole name (w tym przykładzie: api-key).
Aby zabezpieczyć go za pomocą OpenID Connect, użyj tego fragmentu w pliku specyfikacji OpenAPI:
securityDefinitions:
oidc:
type: oauth2
flow: accessCode
authorizationUrl: http://dummy/placeholder
tokenUrl: http://dummy/placeholder
scopes:
openid: Uzyskaj token OpenID Connect
security:
- oidc:
- openid
Możesz oczywiście użyć dowolnego przepływu OpenID Connect według własnego wyboru:
implicitpasswordapplicationaccessCode
Zmienne roli
Ta sekcja szczegółowo opisuje wszystkie zmienne używane przez tę rolę. Jako wstęp, ta rola przyjmuje konwencję nad konfiguracją. Oznacza to, że rozsądne domyślne wartości i założone schematy nazewnictwa są dostarczane od razu.
threescale_cicd_openapi_file
Określa plik specyfikacji OpenAPI do odczytu.
- Składnia: Pełna ścieżka do specyfikacji OpenAPI, na lokalnym systemie plików.
Unikaj ścieżek względnych, preferuj absolutne. Jeśli musisz odczytać plik, który jest
względny do twojego playbooka, użyj zastępnika
{{ playbook_dir }}. - Wymagane: tak
- Przykłady:
/tmp/openapi.yamllub{{ playbook_dir }}/git/openapi.json
threescale_cicd_openapi_file_format
Określa format (JSON lub YAML) pliku specyfikacji OpenAPI do odczytu.
- Składnia:
JSONlubYAML - Wymagane: nie
- Domyślna wartość:
YAML - Przykład:
YAML
threescale_cicd_api_system_name
Definiuje system_name usługi 3scale, która zostanie utworzona.
- Składnia: małe litery alfanumeryczne + podkreślnik
- Wymagane: nie
- Domyślna wartość: jeśli nie zdefiniowane, system_name jest pobierane z
zmiennej
threescale_cicd_api_base_system_name. Ten podstawowy system_name jest następnie dopełniane przez numer główny wersji API i poprzedzane przez nazwę środowiska (tylko jeślithreescale_cicd_api_environment_namejest zdefiniowane). - Przykład:
dev_my_wonderful_service_1
threescale_cicd_api_base_system_name
Służy jako podstawa do obliczenia threescale_cicd_api_system_name.
- Składnia: małe litery alfanumeryczne + podkreślnik
- Wymagane: nie
- Domyślna wartość: jeśli nie zdefiniowane, rozszerzone pole specyfikacji OpenAPI
x-threescale-system-namelub jeśli nie ma, poletitlejest oczyszczane i następnie używane. Jeśli nie można znaleźć tytułu, używana jest domyślna wartośćAPI. Jeśli nie można znaleźć numeru wersji, używane jest0. - Przykład:
my_wonderful_service
Uwaga: Jeśli zarówno threescale_cicd_api_base_system_name, jak i threescale_cicd_api_system_name
są ustawione, ten drugi ma pierwszeństwo.
threescale_cicd_wildcard_domain
Automatycznie definiuje publiczne URL-e APIcast na podstawie schematu.
Składnia: sufiks domeny DNS
Wymagane: nie
Domyślna wartość: jeśli zdefiniowane, oblicza
threescale_cicd_apicast_sandbox_endpointithreescale_cicd_apicast_production_endpointna podstawie system_name API. Sandbox APIcast będzie<system_name>-staging.<wildcard_domain>a produkcyjny APIcast będzie<system_name>.<wildcard_domain>. Sufiksy dla staging (-staging) i dla produkcji (pusty) mogą być dostosowane za pomocą zmiennychthreescale_cicd_default_staging_suffixithreescale_cicd_default_production_suffix.Przykład: poniższe dwie zmienne
threescale_cicd_wildcard_domain=acme.corp threescale_cicd_api_base_system_name=my_wonderful_servicesą równoważne:
threescale_cicd_apicast_sandbox_endpoint=https://my-wonderful-service-staging.acme.corp/ threescale_cicd_apicast_production_endpoint=https://my-wonderful-service.acme.corp/
threescale_cicd_api_basepath
Definiuje basePath, na którym będzie wdrażane API backendowe, nadpisując pole basePath
specyfikacji OpenAPI. Ostateczna wartość jest używana do definiowania reguł mapowania
bramy API 3scale, poprzedzając tę bazową ścieżkę ścieżkami różnych metod/operacji.
- Składnia: część URI z rozpoczynającym
/ - Wymagane: nie
- Domyślna wartość: pole
basePathspecyfikacji OpenAPI. - Przykłady:
/apilub/context
threescale_cicd_api_backend_hostname
Definiuje nazwę hosta backend, nadpisując pole host specyfikacji OpenAPI.
Ostateczna wartość jest używana do definiowania zmiennej threescale_cicd_private_base_url, jeśli jest brakująca.
- Składnia: FQDN z opcjonalnym portem
- Wymagane: nie
- Domyślna wartość: pole
hostspecyfikacji OpenAPI. - Przykłady:
mybackend.acme.corplubmybackend.acme.corp:8080
threescale_cicd_api_backend_scheme
Definiuje schemat do użycia do połączenia z backendem, nadpisując pole schemes specyfikacji OpenAPI.
Ostateczna wartość jest używana do definiowania zmiennej threescale_cicd_private_base_url, jeśli jest brakująca.
- Składnia:
httplubhttps - Wymagane: nie
- Domyślna wartość: pierwszy element pola
schemespecyfikacji OpenAPI, domyślniehttp, jeśli nie jest dostępny. - Przykład:
https
threescale_cicd_private_base_url
Definiuje prywatny adres bazowy 3scale.
- Składnia:
<schem>://<host>:<port> - Wymagane: nie
- Domyślna wartość:
<threescale_cicd_api_backend_scheme>://<threescale_cicd_api_backend_hostname> - Przykład:
http://mybackend.acme.corp:8080
threescale_cicd_apicast_policies_cors
Pozwala na włączenie polityki CORS w bramce APICast. W przypadku, gdy twoje API powinno wspierać cross-origin
i wywołania z przeglądarki i nie masz włączonego werbu OPTIONS w odpowiedniej ścieżce w
plik specyfikacji OpenAPI...
- Składnia: boolean
yeslubno - Wymagane: nie
- Domyślna wartość:
no - Przykład:
yes, jeśli chcesz aktywować politykę CORS na APICast
threescale_cicd_openapi_smoketest_operation
Definiuje metodę specyfikacji OpenAPI do użycia w testach dymnych.
- Składnia:
operationIdmetody specyfikacji OpenAPI - Wymagane: nie
- Domyślna wartość: brak. Jeśli ta zmienna jest niezdefiniowana i jeśli nie ma operacji
oznaczonej jako
x-threescale-smoketests-operationw specyfikacji OpenAPI, testy dymne zostaną pominięte. - Przykład:
GetName
threescale_cicd_api_environment_name
Prefiksuje wszystkie usługi nazwą środowiska, aby uniknąć kolizji nazw przy wdrażaniu tego samego API wielokrotnie na tej samej instancji 3scale.
- Składnia: małe litery, alfanumeryczne + podkreślnik
- Wymagane: nie
- Domyślna wartość: brak, nie przeprowadza się prefiksowania.
- Przykłady:
dev,testlubprod
threescale_cicd_validate_openapi
Waliduje plik specyfikacji OpenAPI według oficjalnego schematu. W tym celu wykorzystywane jest narzędzie go-swagger.
Możesz wstępnie zainstalować to narzędzie w dowolnym miejscu w swoim PATH. Alternatywnie możesz
też podać pełną ścieżkę do polecenia swagger zmienną dodatkową
threescale_cicd_goswagger_command.
Jeśli narzędzie jest niedostępne, zostanie automatycznie pobrane z GitHub i
zainstalowane w {{ threescale_cicd_local_bin_path }}.
- Składnia: boolean (
yes,no,true,false) - Wymagane: nie
- Domyślna wartość:
yes - Przykłady:
threescale_cicd_validate_openapi=nothreescale_cicd_goswagger_command=/usr/local/bin/swaggerthreescale_cicd_local_bin_path=/tmp
threescale_cicd_oicd_flows
Zastępuje lub aktualizuje listę obsługiwanych przepływów OAuth dla tego API.
- Składnia: tablica łańcuchów (
[ 'application', 'accessCode' ]) - Wymagane: nie
- Domyślna wartość: pole
flowobiektusecuritySchemew twoim pliku specyfikacji OpenAPI. - Przykłady:
threescale_cicd_oicd_flows="{{ [ 'application', 'accessCode' ] }}"(zastąp listę przepływów)threescale_cicd_oicd_flows="{{ [ 'application', threescale_cicd_api_security_scheme.flow ] }}"(dodaj nowy przepływ)
threescale_cicd_create_default_application
Pozwala na utworzenie aplikacji testowej z domyślnym planem aplikacji, niezależnie od tego, czy testy dymne są włączone, czy nie.
- Składnia: boolean (
yes,no,true,false) - Wymagane: nie
- Domyślna wartość:
no - Przykład:
yes, jeśli chcesz utworzyć domyślną aplikację
Zróżnicowane zmienne
Zróżnicowane zmienne zdefiniowane w defaults/main.yml oferują rozsądne domyślne wartości. Sprawdź je.
Zależności
Ta rola nie ma zależności od innych ról, ale ma zależności od:
- Ansible (przynajmniej wersja 2.4)
- JMESPath
- Jinja (przynajmniej wersja 2.8)
- 3scale API Management 2.3
Integracja z innymi technologiami
Wsparcie dla głównych technologii jest dostępne w folderze wsparcia. Jest wsparcie dla Jenkins, Kubernetes, Docker, OpenShift, w tym gotowa obrazy dockerowe.
Licencja
MIT
Informacje o autorze
- Nicolas Massé, Red Hat
- Laurent Broudoux, Red Hat
- Daria Mayorova, Red Hat
Enables Continuous Deployment with 3scale API Management Platform
ansible-galaxy install nmasse-itix.threescale-cicd