Configurer VM Manager dans une organisation à l'aide de Terraform

Pour appliquer des configurations de système d'exploitation cohérentes et automatiser la conformité dans la hiérarchie des ressources Google Cloud , utilisez Terraform pour configurer VM Manager au niveau de l'organisation.

Ce document explique comment utiliser Terraform pour activer automatiquement VM Manager (API OS Config), définir des métadonnées d'instance courantes et attribuer des règles d'OS à tous les projets cibles de votre hiérarchie de ressources.

Pour obtenir une présentation des ressources Terraform disponibles pour VM Manager, consultez Provisionner des ressources VM Manager à l'aide de Terraform.

Avant de commencer

  • Si ce n'est pas déjà fait, configurez l'authentification. L'authentification permet de valider votre identité pour accéder aux services et aux API Google Cloud . Pour exécuter du code ou des exemples depuis un environnement de développement local, vous pouvez vous authentifier auprès de Compute Engine en sélectionnant l'une des options suivantes :

    Pour utiliser les exemples Terraform de cette page dans un environnement de développement local, installez et initialisez la gcloud CLI, puis configurez les Identifiants par défaut de l'application avec vos identifiants utilisateur.

    1. Installez la Google Cloud CLI.

    2. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

    3. Si vous utilisez un shell local, créez des identifiants d'authentification locaux pour votre compte utilisateur :

      gcloud auth application-default login

      Vous n'avez pas besoin de le faire si vous utilisez Cloud Shell.

      Si une erreur d'authentification est renvoyée et que vous utilisez un fournisseur d'identité (IdP) externe, vérifiez que vous vous êtes connecté à la gcloud CLI avec votre identité fédérée.

    Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

Avant de commencer

Autorisations IAM requises

Pour activer automatiquement VM Manager et attribuer des stratégies d'OS à plusieurs projets, le compte principal ou le compte de service qui exécute Terraform nécessite des autorisations Identity and Access Management (IAM) spécifiques.

Autorisations du projet cible

Pour obtenir les autorisations nécessaires pour activer le service VM Manager et définir les métadonnées du projet, demandez à votre administrateur de vous accorder les rôles IAM suivants sur chaque projet cible :

Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Ces rôles prédéfinis contiennent les autorisations requises pour activer le service VM Manager et définir les métadonnées du projet. Pour connaître les autorisations exactes requises, développez la section Autorisations requises :

Autorisations requises

Les autorisations suivantes sont requises pour activer le service VM Manager et définir les métadonnées du projet :

  • serviceusage.services.enable
  • compute.projects.setCommonInstanceMetadata

Vous pouvez également obtenir ces autorisations avec des rôles personnalisés ou d'autres rôles prédéfinis.

Configurer un compte de service et un rôle personnalisé

Google vous recommande de créer un compte de service dédié pour exécuter votre automatisation Terraform centralisée.

Pour accorder les autorisations requises à ce compte de service dans plusieurs projets, créez un rôle IAM personnalisé au niveau de l'organisation :

  1. Créez un rôle personnalisé au niveau de l'organisation qui inclut serviceusage.services.enable et compute.projects.setCommonInstanceMetadata.
  2. Attribuez le rôle personnalisé à votre compte de service au niveau d'application le plus bas possible, par exemple au niveau de l'organisation ou du dossier. Par exemple, si tous vos projets cibles sont contenus dans un dossier spécifique, accordez le rôle au niveau du dossier.

Activer VM Manager à l'aide de Terraform

Pour activer VM Manager et attribuer des règles d'OS à plusieurs projets, utilisez l'une des approches automatisées suivantes : les plans de projets de référence ou la gestion centralisée des projets.

Utiliser des plans de projet de référence

Si votre organisation utilise un module de projet Terraform standardisé (un blueprint de référence) ou un mécanisme appliqué de manière centralisée pour provisionner des projets, ajoutez les définitions de ressources suivantes à votre blueprint de projet.

Pour activer VM Manager, incluez les ressources de service et de métadonnées suivantes :

# Enable the OS Config API
resource "google_project_service" "osconfig" {
  service            = "osconfig.googleapis.com"
  disable_on_destroy = false
}

# Set project metadata to enable VM Manager
resource "google_compute_project_metadata_item" "enable_osconfig" {
  key   = "enable-osconfig"
  value = "TRUE"
}

Pour déployer des attributions de règles d'OS sur toutes les VM provisionnées par le blueprint, ajoutez la ressource d'attribution de règles suivante :

resource "google_os_config_os_policy_assignment" "base_security_policy" {
  name        = "base-security-ospolicy"
  description = "Ensure baseline security agent is installed and operational"
  location    = var.zone

  os_policies {
    id   = "no-op-policy"
    mode = "ENFORCEMENT"

    resource_groups {
      resources {
        id = "sample"
        exec {
          validate {
            interpreter = "SHELL"
            script      = "exit 100"
          }
          enforce {
            interpreter = "SHELL"
            script      = "exit 100"
          }
        }
      }
    }
  }

  os_policies {
    id   = "install-security-agent"
    mode = "ENFORCEMENT"

    resource_groups {
      resources {
        id = "install-agent"
        pkg {
          desired_state = "INSTALLED"
          apt {
            name = "security-agent"
          }
          yum {
            name = "security-agent"
          }
        }
      }
    }
  }

  instance_filter {
    all = true
  }

  rollout {
    disruption_budget {
      percent = 10
    }
    min_wait_duration = "3.5s"
  }
}

Gérer tous les projets de manière centralisée

Si la modification d'un blueprint de projet de référence n'est pas applicable, vous pouvez gérer de manière centralisée l'activation de VM Manager et les attributions de règles d'OS dans plusieurs projets existants à l'aide de l'argument Terraform for_each.

Pour activer VM Manager dans les projets cibles, utilisez l'argument for_each pour parcourir votre mappage de projet :

resource "google_project_service" "osconfig" {
  for_each           = var.target_projects
  project            = each.key
  service            = "osconfig.googleapis.com"
  disable_on_destroy = false
}

resource "google_compute_project_metadata_item" "enable_osconfig" {
  for_each = var.target_projects
  project  = each.key
  key      = "enable-osconfig"
  value    = "TRUE"
}

Pour attribuer une règle d'OS à des projets cibles, définissez la ressource d'attribution de règle avec l'argument for_each :

resource "google_os_config_os_policy_assignment" "observability_agent_policy" {
  for_each    = var.target_projects
  project     = each.key
  name        = "observability-agent-ospolicy"
  description = "Install Google Cloud Observability agent on CentOS VMs across target projects"
  location    = var.zone

  os_policies {
    id   = "setup-repo-and-install-package-policy"
    mode = "ENFORCEMENT"

    resource_groups {
      inventory_filters {
        os_short_name = "centos"
        os_version    = "8"
      }

      resources {
        id = "setup-repo"
        repository {
          yum {
            id           = "google-cloud-ops-agent"
            display_name = "Google Cloud Ops Agent Repository"
            base_url     = "https://packages.cloud.google.com/yum/repos/google-cloud-ops-agent-el8-x86_64-all"
            gpg_keys = [
              "https://packages.cloud.google.com/yum/doc/yum-key.gpg",
              "https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg",
            ]
          }
        }
      }

      resources {
        id = "install-pkg"
        pkg {
          desired_state = "INSTALLED"
          yum {
            name = "google-cloud-ops-agent"
          }
        }
      }
    }
  }

  instance_filter {
    all = true
  }

  rollout {
    disruption_budget {
      percent = 10
    }
    min_wait_duration = "3.5s"
  }
}

Définir des projets cibles

Vous pouvez fournir la carte var.target_projects à votre configuration Terraform en utilisant une portée fixe ou dynamique :

  • Portée fixe : Conservez une liste explicite d'ID de projet dans une variable locale ou un fichier de données externe. La portée fixe vous oblige à mettre à jour la liste chaque fois que vous créez ou supprimez des projets.
  • Portée dynamique : Découvrez les projets cibles en fonction des règles de hiérarchie des ressources (par exemple, tous les projets d'une organisation ou d'un dossier). Vous pouvez interroger des projets à l'aide de la source de données google_projects :

     data "google_projects" "in_folder" {
     filter = "parent.id:${local.folder_id}"
     }
    

    Pour gérer les exceptions, filtrez les projets qui contiennent des libellés d'exclusion spécifiques. Vous pouvez également exécuter des scripts externes à l'aide de local_exec qui exécutent des commandes Google Cloud CLI (telles que gcloud asset search-all-resources) pour générer des listes de cibles dynamiques.

Établir un workflow automatisé sans état

Lorsque vous utilisez le champ d'application dynamique, votre liste de projets cibles change constamment. L'utilisation d'un fichier d'état Terraform persistant standard nécessite un effort manuel pour importer de nouvelles ressources et supprimer les projets supprimés de l'état.

Pour gérer efficacement le champ d'application dynamique, implémentez un workflow automatisé sans état à l'aide de Cloud Build :

  1. Initialisez Terraform. Exécutez terraform init à l'aide d'un backend local temporaire et non persistant.
  2. Découvrez les projets cibles. Générez la liste actuelle des projets cibles en fonction de vos critères de définition dynamique du champ d'application.
  3. Importez des ressources existantes. Exécutez terraform import pour extraire les ressources google_project_service, google_compute_project_metadata_item et google_os_config_os_policy_assignment existantes dans l'état local.
  4. Appliquez la configuration. Exécutez les commandes Terraform standards (terraform plan et terraform apply), en transmettant la liste des projets découverts à vos déclarations.
  5. Stockez les artefacts d'exécution. Vous pouvez également enregistrer les sorties du plan, les instantanés d'état et les résumés de copie dans un bucket Cloud Storage à des fins d'audit.

Planifiez l'exécution périodique de votre pipeline Cloud Build (par exemple, tous les jours ou toutes les semaines) pour détecter automatiquement la dérive de configuration et assurer la conformité dans votre organisation.

Afficher l'état de VM Manager au niveau de l'organisation

Une fois que vous avez configuré VM Manager dans votre organisation, vous pouvez afficher des rapports sur l'état d'activation et du système d'exploitation pour tous les projets de votre hiérarchie. En exportant les données de l'inventaire des éléments cloud vers BigQuery, vous pouvez exécuter des requêtes SQL pour vérifier si VM Manager est activé, consulter les versions de l'agent OS Config et inspecter les détails du système d'exploitation dans tous les projets de votre organisation.

Pour savoir comment exporter des données et exécuter des requêtes de rapport d'état, consultez Afficher l'état de VM Manager pour votre organisation à l'aide de l'inventaire des éléments cloud et de BigQuery.

Étapes suivantes