Dynamic operators within DAGs (Airflow)
It is a good practice for Airflow. Moreover, Airflow positioning it as one of their "killer-features". It is good to create dynamic tasks in DAG, it is pretty OK to create dynamically created DAGs. One thing I recommend you to think about is that it is not good to create hundreds and thousands of one-time-running tasks because it will lead to:


Filling your Airflow database with huge amount of garbage data
Inability to analyze DAGs visually. Here is the example of Airflow tree tab of tasks like these:




Here is the sample code for dynamic DAG creation:

from datetime import datetime
from airflow import DAG
from airflow.operators.python_operator import PythonOperator


def create_dag(dag_id, schedule, dag_number, default_args):

    def hello_world_py(*args):
        print('Hello World')
        print('This is DAG: {}'.format(str(dag_number)))

    dag = DAG(dag_id,
              schedule_interval=schedule,
              default_args=default_args)

    with dag:
        t1 = PythonOperator(
            task_id='hello_world',
            python_callable=hello_world_py,
            dag_number=dag_number)

    return dag


# build a dag for each number in range(10)
for n in range(1, 10):
    dag_id = 'hello_world_{}'.format(str(n))

    default_args = {'owner': 'airflow',
                    'start_date': datetime(2018, 1, 1)
                    }

    schedule = '@daily'

    dag_number = n

    globals()[dag_id] = create_dag(dag_id,
                                  schedule,
                                  dag_number,
                                  default_args)


You can read more about it here.