Infrastructure as Code - or short: IaC - describes provisioning and configuration of complex data-center resources (compute, storage, network, ..) in configuration files or code.
The purpose is to have reproducible setups, that are versioned, have a history, can be code reviewed etc, while providing documentation.
First generation IaC came in variants of data serialization languages like JSON, YAML or TOML which were human-editable, but optimized for machine consumption.
With the second generation IaC, the user (developer) interfaces moved to the realm of actual, high-level code, that allows to use higher level logic and integration in dynamic environments. Examples:
Especially the second generation enabled modularization and abstraction of complex infrastructure subsystems.