将SSH密钥添加到GCP元数据

时间:2018-06-26 15:06:41

标签: google-cloud-platform ssh-keys

我是Google Cloud的新手,并且在通过gcloud命令行向sata元数据(项目范围内)添加ssh键时面临挑战。

当我尝试将ssh-key和我要添加的新ssh-key一起添加到Google元数据中(使用命令:: gcloud compute project-info add-metadata --metadata-from-file ssh-keys=[LIST_PATH])时,我还必须在其中指定所有现有的ssh-key源文件。 (源文件是我们存储ssh-key值的文件)。因为我将添加源文件中存在的所有ssh密钥,所以如果我不将现有的ssh密钥保留在源文件中并且仅保留一个密钥,它将仅将此单个密钥添加到元数据中,其余的现有密钥将被删除。

所以我想要实现的是在不影响现有键的情况下将任何单个ssh键添加到元数据。因为这对于我环境中的许多机器都是重复的过程,所以我无法每次都跟踪现有的密钥。

1 个答案:

答案 0 :(得分:1)

我有同样的问题。

根据官方文档(https://cloud.google.com/compute/docs/instances/adding-removing-ssh-keys),无法通过gcloud工具操作单个键。

下面是添加密钥的示例shell:

    class Test {
      /**
       * Executes some async code
       * @returns {Test} The current {@link Test}
       */
      asynch() {
        console.log('asynch')
        return new Promise((resolve, reject) => setTimeout(resolve, 1000))
      }

      /**
       * Executes some code
       * @returns {Test} The current {@link Test}
       */
      something() {
        console.log('something')

        return this
      }
    }


    var TestChainable = new Proxy(Test, {
      construct(target, args) {
        return new Proxy(new target(...args), {

          // a promise used for chaining
          pendingPromise: Promise.resolve(),

          get(target, key, receiver) {
            //  intercept each get on the object
            if (key === 'then' || key === 'catch') {
              // if then/catch is requested, return the chaining promise
              return (...args2) => {
                return this.pendingPromise[key](...args2)
              }
            } else if (target[key] instanceof Function) {
              // otherwise chain with the "chainingPromise" 
              // and call the original function as soon
              // as the previous call finished 
              return (...args2) => {
                this.pendingPromise = this.pendingPromise.then(() => {
                  target[key](...args2)
                })

                console.log('calling ', key)

                // return the proxy so that chaining can continue
                return receiver
              }
            } else {
              // if it is not a function then just return it
              return target[key]
            }
          }
        })
      }
    });

    var t = new TestChainable
    t.asynch()
      .something()
      .asynch()
      .asynch()
      .then(() => {
        console.log('all calles are finished')
      })

它:

  • 获取现有值(gcloud describe | jq)。
  • 添加一个键(回显“ john ...”)。
  • 将其作为伪文件提供给gcloud add-metadata。

由您决定分开的步骤,保留本地密钥列表或任何适合您的需求。

此示例缺少一些功能,例如密钥重复数据删除。目前这只是一个实验,我必须创建一个更强大的脚本以供实际使用。