来宾软件未通过 OSConfig 来宾策略安装到符合条件的 Google Compute Engine VM 上

Guest Software not Installed by an OSConfig Guest Policy onto an Eligible Google Compute Engine VM

Google 计算引擎 (GCE) 实例 ($GCE_INSTANCE_NAME) 刚刚在 Google 云平台 (GCP) 项目 $GCP_PROJECT_ID 中创建。有一个 OSConfig 来宾策略 ($GUEST_POLICY_NAME) 应该将来宾软件包安装到 $GCE_INSTANCE_NAME 上;但是,当 Cloud SDK (gcloud) 用于 lookup 应用到 $GCE_INSTANCE_NAME 的访客策略时:

gcloud beta compute os-config guest-policies lookup \
$GCE_INSTANCE_NAME \
--zone=$GCE_INSTANCE_ZONE

$=>

No effective guest policy found for [projects/$GCP_PROJECT_NAME/zones/$GCE_INSTANCE_ZONE/instances/$GCE_INSTANCE_NAME].

$GUEST_POLICY_NAME 列出。

lookup命令用于另一个具有相同OS版本、GCE元数据和GCE标签的GCE实例($GCE_ANOTHER_INSTANCE)时:

gcloud beta compute os-config guest-policies lookup \
$GCE_ANOTHER_INSTANCE \
--zone=$GCE_ANOTHER_ZONE

#=>

┌──────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│                                           SOFTWARE RECIPES                                               │
├───────────────────────────────────────────────────────────┬────────────────────┬─────────┬───────────────┤
│                          SOURCE                           │        NAME        │ VERSION │ DESIRED_STATE │
├───────────────────────────────────────────────────────────┼────────────────────┼─────────┼───────────────┤
│ projects/$GCP_PROJECT_ID/guestPolicies/. . .              │        . . .       │ . . .   │   . . .       │
│ projects/$GCP_PROJECT_ID/guestPolicies/$GUEST_POLICY_NAME │ $GUEST_POLICY_NAME │ 1.0     │ INSTALLED     │
│ projects/$GCP_PROJECT_ID/guestPolicies/. . .              │        . . .       │ . . .   │   . . .       │
└───────────────────────────────────────────────────────────┴────────────────────┴─────────┴───────────────┘

$GUEST_POLICY_NAME 列出。

为什么?

$GUEST_POLICY_NAME 没有出现在 $GCE_INSTANCE_NAME 上的 lookup 命令的响应中可能有几个原因:

  • 延迟:当 $GCE_INSTANCE_NAME 刚刚创建时,OSConfig 传播 $GUEST_POLICY_NAME 可能需要一些时间

  • 虽然您可能已按照建议here启用了项目范围的 GCE 元数据,但可能有助于添加:

    • enable-guest-attributes: TRUE
    • enable-osconfig: TRUE

    $GCE_INSTANCE_NAME 使用 add-metadata 命令:

    gcloud compute instances add-metadata \
    $GCE_INSTANCE_NAME \
    --metadata="enable-guest-attributes=true,enable-osconfig=TRUE" \ 
    --zone=$GCE_INSTANCE_ZONE
    
    #=>
    
    Updated [https://www.googleapis.com/compute/v1/projects/$GCP_PROJECT_NAME/zones/$GCE_INSTANCE_ZONE/instances/$GCE_INSTANCE_NAME].
    
  • 如果 $GUEST_POLICY_NAME 使用 Google 云存储 (GCS) 存储桶来存储包或可执行文件,请检查 GCE 默认服务帐户 ($GCE_SERVICE_ACCOUNT ) 至少有一个具有 storage.objects.get 权限(例如,storage.objectViewer)并使用 GCS CLI (gsutil) 的策划角色:

    gsutil iam get "gs://$GCS_BUCKET_NAME"
    
    #=>
    
    {
      "bindings": [
      . . .
      {
        "members": [
          "serviceAccount:$GCE_SERVICE_ACCOUNT"
        ],
        "role": "roles/storage.objectViewer"
      }
      . . .
      ]
    }
    

    如果$GCE_SERVICE_ACCOUNT没有没有具有storage.objects.get权限的角色,您可以使用ch命令为iam 组授予 storage.objectViewer 策划角色:

    gsutil iam ch \
    "serviceAccount:$GCE_SERVICE_ACCOUNT:roles/storage.objectViewer" \
    "gs://GCS_BUCKET_NAME"
    
  • 确保子网 $GCE_INSTANCE_NAME 的私有 Google 访问 开启 运行 在:

    1. 通过 describe 命令的 --flatten--format 标志轻松发现 $GCE_INSTANCE_NAME 正在使用哪个子网:

      gcloud compute instances describe $GCE_INSTANCE_NAME \
      --flatten="networkInterfaces" \
      --format="value(networkInterfaces.subnetwork)" \
      --zone=$GCE_INSTANCE_ZONE
      
      #=>
      
      https://www.googleapis.com/compute/v1/projects/$GCP_PROJECT_NAME/regions/$GCE_INSTANCE_REGION/subnetworks/$GCE_INSTANCE_SUBNETWORK
      
    2. 查看 $GCE_INSTANCE_SUBNETWORK 是否开启了 Google 私人访问:

      gcloud compute networks subnets describe $GCE_INSTANCE_SUBNETWORK\
      --format="value(privateIpGoogleAccess)" \
      --region=$GCE_INSTANCE_REGION
      
      #=>
      
      True
      

      如果以上是 False,则使用更新子命令为同一 subnets 子组启用私有 Google 访问:

      gcloud compute networks subnets update $GCE_INSTANCE_SUBNET \
      --enable-private-ip-google-access \
      --region=$GCE_INSTANCE_REGION
      
      #=>
      
      Updated [https://www.googleapis.com/compute/v1/projects/$GCP_PROJECT_NAME/regions/$GCE_INSTANCE_REGION/subnetworks/$GCE_INSTANCE_SUBNETWORK].
      

如果上述所有方法都失败,请确保 $GCE_INSTANCE_NAME 符合 所有 标准 $GUEST_POLICY_NAME:

gcloud beta compute os-config guest-policies describe \
$GUEST_POLICY_NAME \
--format="yaml(assignment)"

#=>

assignment:
  groupLabels:
  - labels: . . .
  instances: . . .
  instanceNamePrefixes: . . .
  osTypes:
  - osArchitecture: . . .
    osShortName: . . .
    osVersion: . . .
  zones: . . .