infOpen.airflow
airflow
Ansible-Rolle zur Verwaltung der Installation und Konfiguration von Airflow
Die erste Verwendung der Rolle besteht darin, eine einzelne Master-Instanz zu verwalten, daher habe ich die Worker-Seite nicht berücksichtigt. Wenn du möchtest, kannst du gerne einen PR einreichen, um diese Funktionen hinzuzufügen.
Wesentliche Änderungen
0.4.0
- Entfernung der Unterstützung für Ubuntu Trusty
- Entfernung der Unterstützung für Ansible 2.2 und 2.3
- Standardversion von Airflow ist jetzt 1.9.0
Anforderungen
Diese Rolle erfordert Ansible 2.4 oder höher, und die Plattformanforderungen sind in der Metadatendatei aufgeführt.
Tests
Diese Rolle verwendet Molecule zum Ausführen von Tests.
Lokale und Travis-Tests führen standardmäßig Tests in Docker aus. Siehe die Dokumentation von Molecule, um andere Backends zu verwenden.
Aktuell werden Tests auf folgenden Plattformen durchgeführt:
- Debian Stretch
- Ubuntu Xenial
- Ubuntu Bionic
und verwenden:
- Ansible 2.4.x
- Ansible 2.5.x
Tests ausführen
Mit Docker-Treiber
$ tox
Rollenvariablen
Warnung Kein Fernet-Schlüssel in der Konfiguration definiert, setze deinen eigenen, bevor du Passwörter speicherst!
Standardrollenvariablen
---
# Standardvariablen für die Airflow-Rolle
# Aufgaben für die Installation von Airflow
airflow_system_dependencies: "{{ _airflow_system_dependencies }}"
# Wird geändert aufgrund von Idempotenzproblemen mit dem pip-Modul
# Immer geändert mit airflow und airflow[crypto]
airflow_pip_changed_when: False
# Installationsvariablen
airflow_user_name: 'airflow'
airflow_user_group: "{{ airflow_user_name }}"
airflow_user_shell: '/bin/false'
airflow_user_home_path: '/var/lib/airflow'
airflow_user_home_mode: '0700'
airflow_log_path: '/var/log/airflow'
airflow_log_owner: "{{ airflow_user_name }}"
airflow_log_group: "{{ airflow_user_group }}"
airflow_log_mode: '0700'
airflow_pid_path: '/var/run/airflow'
airflow_pid_owner: "{{ airflow_user_name }}"
airflow_pid_group: "{{ airflow_user_group }}"
airflow_pid_mode: '0700'
airflow_virtualenv: "{{ airflow_user_home_path }}/venv"
airflow_python_version: "{{ _airflow_python_version }}"
airflow_packages:
- name: 'pip'
version: '10.0.1'
- name: 'setuptools'
version: '39.1.0'
- name: 'GitPython'
version: '2.1.9'
- name: 'Cython'
version: '0.28.2'
- name: 'apache-airflow'
version: '1.9.0'
airflow_extra_packages:
- name: 'apache-airflow[crypto]'
# DIENSTVERWALTUNG
# -----------------------------------------------------------------------------
# Spezifische Einstellungen für die systemd-Dienste von Airflow
is_systemd_managed_system: "{{ _is_systemd_managed_system | default(False) }}"
airflow_services_systemd:
- dest: '/etc/systemd/system/airflow-webserver.service'
handler: 'Restart airflow-webserver'
options:
Install:
WantedBy: 'multi-user.target'
Service:
Environment: "PATH={{ airflow_virtualenv ~ '/bin' }}"
EnvironmentFile: "{{ airflow_paths.files.environment.path }}"
ExecStart: "{{ airflow_virtualenv ~ '/bin' }}/airflow webserver"
Group: "{{ airflow_user_group }}"
PrivateTmp: 'true'
Restart: 'on-failure'
RestartSec: '5s'
Type: 'simple'
User: "{{ airflow_user_name }}"
Unit:
After: 'network.target postgresql.service mysql.service redis.service rabbitmq-server.service'
Description: 'Airflow webserver daemon'
Wants: 'postgresql.service mysql.service redis.service rabbitmq-server.service'
- dest: '/etc/systemd/system/airflow-scheduler.service'
handler: 'Restart airflow-scheduler'
options:
Install:
WantedBy: 'multi-user.target'
Service:
Environment: "PATH={{ airflow_virtualenv ~ '/bin' }}"
EnvironmentFile: "{{ airflow_paths.files.environment.path }}"
ExecStart: "{{ airflow_virtualenv ~ '/bin' }}/airflow scheduler"
Group: "{{ airflow_user_group }}"
PrivateTmp: 'true'
Restart: 'always'
RestartSec: '5s'
Type: 'simple'
User: "{{ airflow_user_name }}"
Unit:
After: 'network.target postgresql.service mysql.service redis.service rabbitmq-server.service'
Description: 'Airflow scheduler daemon'
Wants: 'postgresql.service mysql.service redis.service rabbitmq-server.service'
airflow_services_states:
- name: 'airflow-webserver'
enabled: True
state: 'started'
- name: 'airflow-scheduler'
enabled: True
state: 'started'
# Umgebungsvariablen Datei
airflow_paths:
files:
environment:
path: '/etc/default/airflow'
# Datenbankvariablen
airflow_manage_database: True
airflow_database_engine: 'mysql'
# Setze do_init auf false, wenn die Datenbank bereits initialisiert ist
airflow_do_init_db: True
airflow_do_upgrade_db: True
# Standardkonfiguration
airflow_defaults_config:
core:
airflow_home: "{{ airflow_user_home_path ~ '/airflow' }}"
dags_folder: "{{ airflow_user_home_path ~ '/airflow/dags' }}"
base_log_folder: "{{ airflow_log_path }}"
remote_base_log_folder: ''
remote_log_conn_id: ''
encrypt_s3_logs: False
executor: 'SequentialExecutor'
sql_alchemy_conn: 'sqlite:////var/lib/airflow/airflow/airflow.db'
sql_alchemy_pool_size: 5
sql_alchemy_pool_recycle: 3600
parallelism: 32
dag_concurrency: 16
dags_are_paused_at_creation: True
non_pooled_task_slot_count: 128
max_active_runs_per_dag: 16
load_examples: False
plugins_folder: "{{ airflow_user_home_path ~ '/airflow/plugins' }}"
fernet_key: 'cryptography_not_found_storing_passwords_in_plain_text'
donot_pickle: False
dagbag_import_timeout: 30
operators:
default_owner: 'Airflow'
webserver:
auth_backend: ''
authenticate: False
base_url: 'http://localhost:8080'
debug: False
expose_config: True
filter_by_owner: False
hostname: "{{ ansible_default_ipv4.address }}"
log_file: "{{ airflow_log_path }}/airflow-webserver.log"
pid: "{{ airflow_pid_path }}/airflow-webserver.pid"
secret_key: 'temporary_key'
web_server_host: '0.0.0.0'
web_server_port: '8080'
web_server_worker_timeout: 120
workers: 1
worker_class: 'sync'
worker_timeout: 30
email:
email_backend: 'airflow.utils.email.send_email_smtp'
smtp:
smtp_host: 'localhost'
smtp_starttls: True
smtp_ssl: False
smtp_user: 'airflow'
smtp_port: 25
smtp_password: 'airflow'
smtp_mail_from: '[email protected]'
celery:
celery_app_name: 'airflow.executors.celery_executor'
celeryd_concurrency: 16
worker_log_server_port: 8793
broker_url: 'sqla+mysql://airflow:airflow@localhost:3306/airflow'
celery_result_backend: 'db+mysql://airflow:airflow@localhost:3306/airflow'
flower_port: 5555
default_queue: 'default'
scheduler:
job_heartbeat_sec: 5
log_file: "{{ airflow_log_path }}/airflow-scheduler.log"
num_runs: 0
pid: "{{ airflow_pid_path }}/airflow-scheduler.pid"
scheduler_heartbeat_sec: 5
statsd_on: False
statsd_host: 'localhost'
statsd_port: 8125
statsd_prefix: 'airflow'
max_threads: 2
mesos:
master: 'localhost:5050'
framework_name: 'Airflow'
task_cpu: 1
task_memory: 256
checkpoint: False
failover_timeout: 604800
authenticate: False
default_principal: 'admin'
default_secret: 'admin'
ldap:
uri: 'ldaps://<your.ldap.server>:<port>'
user_filter: 'objectClass=*'
user_name_attr: 'uid'
superuser_filter: ''
data_profiler_filter: ''
bind_user: ''
bind_password: ''
basedn: 'dc=example,dc=com'
cacert: ''
search_scope: 'LEVEL'
airflow_user_config: {}
airflow_config: "{{ airflow_defaults_config | combine(airflow_user_config, recursive=True) }}"
# Verbindungsverwaltung
airflow_drop_existing_connections_before_add: True
airflow_connections: []
# Variablenverwaltung
airflow_drop_existing_variables_before_add: True
airflow_variables: []
# Logrotate-Konfiguration
airflow_logrotate_config:
- filename: '/etc/logrotate.d/airflow'
log_pattern:
- "{{ airflow_log_path }}/*.log"
options:
- 'rotate 12'
- 'weekly'
- 'compress'
- 'delaycompress'
- "create 640 {{ airflow_log_owner }} {{ airflow_log_group }}"
- 'postrotate'
- 'endscript'
Abhängigkeiten
Keine
Beispiel-Playbook
- hosts: servers
roles:
- { role: infOpen.airflow }
Lizenz
MIT
Autor Informationen
Alexandre Chaussier (für die Firma Infopen)
- http://www.infopen.pro
- a.chaussier [at] infopen.pro