 .. Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

 ..   http://www.apache.org/licenses/LICENSE-2.0

 .. Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

.. _cli:

Command Line Interface and Environment Variables Reference
==========================================================

Command Line Interface
''''''''''''''''''''''

Airflow has a very rich command line interface that allows for
many types of operation on a DAG, starting services, and supporting
development and testing.

.. note::
    For more information on usage CLI, see :doc:`usage-cli`

.. contents:: Content
    :local:
    :depth: 2

.. argparse::
   :module: airflow.cli.cli_parser
   :func: get_parser
   :prog: airflow

Environment Variables
'''''''''''''''''''''

.. envvar:: AIRFLOW__{SECTION}__{KEY}

  Sets options in the Airflow configuration. This takes priority over the value in the ``airflow.cfg`` file.

  Replace the ``{SECTION}`` placeholder with any section
  and the ``{KEY}`` placeholder with any key in that specified section.

  For example, if you want to set the ``dags_folder`` options in ``[core]`` section,
  then you should set the ``AIRFLOW__CORE__DAGS_FOLDER`` environment variable.

  For more information, see: :doc:`/howto/set-config`.

.. envvar:: AIRFLOW__{SECTION}__{KEY}_CMD

  For any specific key in a section in Airflow, execute the command the key is pointing to.
  The result of the command is used as a value of the ``AIRFLOW__{SECTION}__{KEY}`` environment variable.

  This is only supported by the following config options:

* ``sql_alchemy_conn`` in ``[core]`` section
* ``fernet_key`` in ``[core]`` section
* ``broker_url`` in ``[celery]`` section
* ``flower_basic_auth`` in ``[celery]`` section
* ``result_backend`` in ``[celery]`` section
* ``password`` in ``[atlas]`` section
* ``smtp_password`` in ``[smtp]`` section
* ``secret_key`` in ``[webserver]`` section

.. envvar:: AIRFLOW__{SECTION}__{KEY}_SECRET

  For any specific key in a section in Airflow, retrieve the secret from the configured secrets backend.
  The returned value will be used as the value of the ``AIRFLOW__{SECTION}__{KEY}`` environment variable.

  See :ref:`Secrets Backends<secrets_backend_configuration>` for more information on available secrets backends.

  This form of environment variable configuration is only supported for the same subset of config options as ``AIRFLOW__{SECTION}__{KEY}_CMD``

.. envvar:: AIRFLOW_CONFIG

  The path to the Airflow configuration file.

.. envvar:: AIRFLOW_CONN_{CONN_ID}

  Defines a new connection with the name ``{CONN_ID}`` using the URI value.

  For example, if you want to create a connection named ``PROXY_POSTGRES_TCP``, you can create
  a key ``AIRFLOW_CONN_PROXY_POSTGRES_TCP`` with the connection URI as the value.

  For more information, see: :ref:`environment_variables_secrets_backend`.

.. envvar:: AIRFLOW_HOME

  The root directory for the Airflow content.
  This is the default parent directory for Airflow assets such as DAGs and logs.

.. envvar:: AIRFLOW_VAR_{KEY}

  Defines an Airflow variable.
  Replace the ``{KEY}`` placeholder with the variable name.

  For more information, see: :ref:`managing_variables`.
