从ansible脚本

时间:2018-04-03 08:41:00

标签: google-cloud-platform ansible google-compute-engine quota

我已经通过ansible脚本在GCP中部署群集已经超过一年了,但突然之间我的一个脚本一直给我这个错误:

  

libcloud.common.google.GoogleBaseError:u \"区域' projects / [project] / zones / europe-west1-d'没有足够的资源来满足请求。尝试使用其他区域,或稍后再试。

显而易见的原因是我没有足够的资源,但并没有很多变化,配额看起来很好: quotas

ansible脚本本身并没有提出太多要求。 我用100GB SSD创建了3个n1-standard-4实例。 请参阅下面的脚本片段:

tasks:
    - name: create boot disks
      gce_pd:
          disk_type: pd-ssd
          image: "debian-9-stretch-v20171025"
          name: "{{ item.node }}-disk"
          size_gb: 100
          state: present
          zone: "europe-west1-d"
          service_account_email: "{{ service_account_email }}"          
          credentials_file: "{{ credentials_file }}"
          project_id: "{{ project_id }}"          
      with_items: "{{nodes}}"
      async: 3600
      poll: 2

    - name: create instances
      gce:        
        instance_names: "{{item.node}}"
        zone: "europe-west1-d"
        machine_type: "n1-standard-4"        
        preemptible: "{{ false if item.num == '0' else true }}"        
        disk_auto_delete: true
        disks:
          - name: "{{ item.node }}-disk"
            mode: READ_WRITE
        state: present
        service_account_email: "{{ service_account_email }}"
        service_account_permissions: "compute-rw"
        credentials_file: "{{ credentials_file }}"
        project_id: "{{ project_id }}"
        tags: "elasticsearch"        
      register: gce_raw_results
      with_items: "{{nodes}}"
      async: 3600
      poll: 2

更新1:

  • 服务帐户是整个项目的编辑。所以正确的问题似乎不太可能。
  • 它开始于2018年3月24日发生。从那时起每晚都有。因此,如果它是“缺货”的话。这个问题很巧合,对吧? 此外,到目前为止,我一直在运行此脚本,并且大部分时间都会失败(请参阅下面的“成功”)。
  • 我已经测试了几次,它可能与“可抢占的”有关。实例上的标志。 (我开始3个节点,但至少第一个节点必须保持至少工作)=> preemptible: "{{ false if item.num == '0' else true }}" 如果我关闭可抢占(假),那么它会毫无障碍地运行。 '解决方法'似乎只是没有使用可抢占的实例,但这曾经工作了一年而没有失败过一次。有什么变化吗? GCP的API有变化吗? ansible gce没有实现这些变化吗?

完整错误是:

  

任务[收集事实]   ************************************************** ************************************************** ************************************************** ************************************************** ************************************************** ********************************************确定:[localhost] < / p>      

任务[创建启动盘]   ************************************************** ************************************************** ************************************************** ************************************************** ************************************************** ******************************************已更改:[localhost] =&gt; (item = {u&#39; node&#39 ;: u&#39; elasticsearch-link-0&#39;,   你&#39; ip_field&#39;:你&#39; private_ip&#39;,你&#39;区&#39;:你&#39; europe-west1-d&#39;,   你&#39; cluster_name&#39;:你&#39; elasticsearch-link&#39;,你&#39;:你&#39; 0&#39;,你&#39; machine_type&#39;:   u&#39; n1-standard-4&#39;,u&#39; project_id&#39;:u&#39; [projectid]&#39;})已更改:[localhost]   =&GT; (item = {u&#39; node&#39 ;: u&#39; elasticsearch-link-1&#39;,u&#39; ip_field&#39;:u&#39; private_ip&#39;,u&#39; zone&# 39;:你&#39; europe-west1-d&#39;,u&#39; cluster_name&#39;:   你有&#39; elasticsearch-link&#39;,你&#39;:你&#39; 1&#39;,你&#39; machine_type&#39;:   你好&nbsp;标准4&#39;,你&#39; project_id&#39;:你&#39; [projectid]&#39;})ok:[localhost] =&gt;   (item = {u&#39; node&#39 ;: u&#39; elasticsearch-link-2&#39;,u&#39; ip_field&#39;:u&#39; private_ip&#39;,   你&#39;:&#39; europe-west1-d&#39;,u&#39; cluster_name&#39 ;: u&#39; elasticsearch-link&#39;,   你&#39;:你&#39; 2&#39;,你&#39; machine_type&#39;:你&#39; n1-standard-4&#39;,你&#39; project_id&#39;:   U&#39; [专案编号]&#39;})

     

任务[创建实例]   ************************************************** ************************************************** ************************************************** ************************************************** ************************************************** *******************************************已更改:[localhost] =&gt ; (item = {u&#39; node&#39 ;: u&#39; elasticsearch-link-0&#39;,   你&#39; ip_field&#39;:你&#39; private_ip&#39;,你&#39;区&#39;:你&#39; europe-west1-d&#39;,   你&#39; cluster_name&#39;:你&#39; elasticsearch-link&#39;,你&#39;:你&#39; 0&#39;,你&#39; machine_type&#39;:   u&#39; n1-standard-4&#39;,u&#39; project_id&#39;:u&#39; [projectid]&#39;})已更改:[localhost]   =&GT; (item = {u&#39; node&#39 ;: u&#39; elasticsearch-link-1&#39;,u&#39; ip_field&#39;:u&#39; private_ip&#39;,u&#39; zone&# 39;:你&#39; europe-west1-d&#39;,u&#39; cluster_name&#39;:   你有&#39; elasticsearch-link&#39;,你&#39;:你&#39; 1&#39;,你&#39; machine_type&#39;:   你&n;标准4&#39;,你&#39; project_id&#39;:你&#39; [projectid]&#39;})失败:[localhost]   (item = {u&#39; node&#39 ;: u&#39; elasticsearch-link-2&#39;,u&#39; ip_field&#39;:u&#39; private_ip&#39;,   你&#39;:&#39; europe-west1-d&#39;,u&#39; cluster_name&#39 ;: u&#39; elasticsearch-link&#39;,   你&#39;:你&#39; 2&#39;,你&#39; machine_type&#39;:你&#39; n1-standard-4&#39;,你&#39; project_id&#39;:   你&#39; [projectid]&#39;})=&gt; {&#34; ansible_job_id&#34;:&#34; 371957735383.2688&#34;,   &#34;更改&#34;:false,&#34; cmd&#34;:   &#34; /tmp/.ansible-airflow/ansible-tmp-1522742180.0-71790706749341/gce.py" ;,   &#34;数据&#34;:&#34;&#34;,&#34;失败&#34;:1,&#34;完成&#34;:1,&#34; item&#34;:{ &#34;群集名&#34 ;:   &#34; elasticsearch-link&#34;,&#34; ip_field&#34;:&#34; private_ip&#34;,&#34; machine_type&#34;:   &#34; n1-standard-4&#34;,&#34;节点&#34;:&#34; elasticsearch-link-2&#34;,&#34; num&#34;:&#34; 2&# 34 ;,   &#34; project_id&#34;:&#34; [projectid]&#34;,&#34; zone&#34;:&#34; europe-west1-d&#34;},&#34; msg&# 34 ;:   &#34; Traceback(最近一次调用最后一次):\ n文件   \&#34; /tmp/.ansible-airflow/ansible-tmp-1522742180.0-71790706749341/async_wrapper.py \&#34 ;,   第158行,在_run_module \ n(filtered_outdata,json_warnings)=   _filter_non_json_lines(outdata)\ n文件\&#34; /tmp/.ansible-airflow/ansible-tmp-1522742180.0-71790706749341/async_wrapper.py \&#34;,   第99行,在_filter_non_json_lines \ n中引发ValueError(&#39;没有开始   json char发现&#39;)\ n \ nValueError:找不到json char的开头\ n&#34;,   &#34; stderr&#34;:&#34; Traceback(最近一次呼叫最后一次):\ n文件   \&#34; /tmp/ansible_OnIK1e/ansible_module_gce.py \&#34;,第750行,\ n \ n   main()\ n File \&#34; /tmp/ansible_OnIK1e/ansible_module_gce.py \&#34;,line   712,在主\ n模块中,gce,inames,number)\ n文件   \&#34; /tmp/ansible_OnIK1e/ansible_module_gce.py \&#34;,第524行,在   create_instances \ n instance,lc_machine_type,lc_image(),   ** gce_args \ n File \&#34; /usr/local/lib/python2.7/dist-packages/libcloud/compute/drivers/gce.py \&#34;,   第3874行,在create_node \ n self.connection.async_request(request,   method =&#39; POST&#39;,data = node_data)\ n文件   \&#34; /usr/local/lib/python2.7/dist-packages/libcloud/common/base.py \&#34 ;,   第784行,在async_request \ n response = request(** kwargs)\ n文件中   \&#34; /usr/local/lib/python2.7/dist-packages/libcloud/compute/drivers/gce.py \&#34 ;,   第121行,在请求\ n响应=超级(GCEConnection,   自我).request(* args,** kwargs)\ n文件   \&#34; /usr/local/lib/python2.7/dist-packages/libcloud/common/google.py \&#34 ;,   第806行,请求\ n * args,** kwargs)\ n文件   \&#34; /usr/local/lib/python2.7/dist-packages/libcloud/common/base.py \&#34 ;,   第641行,在request \ n response = responseCls(** kwargs)\ n文件中   \&#34; /usr/local/lib/python2.7/dist-packages/libcloud/common/base.py \&#34 ;,   第163行,在 init \ n self.object = self.parse_body()\ n文件   \&#34; /usr/local/lib/python2.7/dist-packages/libcloud/common/google.py \&#34 ;,   第268行,在parse_body \ n中引发GoogleBaseError(消息,   self.status,code)\ nlibcloud.common.google.GoogleBaseError:u \&#34; The   zone&#39; projects / [projectid] / zones / europe-west1-d&#39;没有足够的   可用于满足请求的资源。尝试不同的区域,或   稍后再试。\&#34; \ n&#34;,&#34; stderr_lines&#34;:[&#34; Traceback(最近一次通话)   最后):&#34;,&#34;文件\&#34; /tmp/ansible_OnIK1e/ansible_module_gce.py \&#34;,行   750,in&#34;,&#34; main()&#34;,&#34;文件   \&#34; /tmp/ansible_OnIK1e/ansible_module_gce.py \&#34;,第712行,在主&#34;,&#34;
  module,gce,inames,number)&#34;,&#34;文件   \&#34; /tmp/ansible_OnIK1e/ansible_module_gce.py \&#34;,第524行,在   create_instances&#34;,&#34; instance,lc_machine_type,lc_image(),   ** gce_args&#34;,&#34; File \&#34; /usr/local/lib/python2.7/dist-packages/libcloud/compute/drivers/gce.py \&#34;,   第3874行,在create_node&#34;,&#34;
  self.connection.async_request(request,method =&#39; POST&#39;,   data = node_data)&#34;,&#34;文件   \&#34; /usr/local/lib/python2.7/dist-packages/libcloud/common/base.py \&#34 ;,   第784行,在async_request&#34;,&#34; response = request(** kwargs)&#34;,&#34;   文件   \&#34; /usr/local/lib/python2.7/dist-packages/libcloud/compute/drivers/gce.py \&#34 ;,   第121行,请求&#34;,&#34;响应=超级(GCEConnection,   自我).request(* args,** kwargs)&#34;,&#34;文件   \&#34; /usr/local/lib/python2.7/dist-packages/libcloud/common/google.py \&#34 ;,   第806行,请求&#34;,&#34; * args,** kwargs)&#34;,&#34;文件   \&#34; /usr/local/lib/python2.7/dist-packages/libcloud/common/base.py \&#34 ;,   第641行,请求&#34;,&#34; response = responseCls(** kwargs)&#34;,&#34;文件   \&#34; /usr/local/lib/python2.7/dist-packages/libcloud/common/base.py \&#34 ;,   第163行,在 init &#34;,&#34; self.object = self.parse_body()&#34;,&#34;文件   \&#34; /usr/local/lib/python2.7/dist-packages/libcloud/common/google.py \&#34 ;,   第268行,在parse_body&#34;,&#34;提出GoogleBaseError(消息,   self.status,code)&#34;,&#34; libcloud.common.google.GoogleBaseError:u \&#34; The   zone&#39; projects / [projectid] / zones / europe-west1-d&#39;没有足够的   可用于满足请求的资源。尝试不同的区域,或   稍后再试。\&#34;&#34;]}           重试,使用: - limit @ / usr / local / airflow / ansible / playbooks / elasticsearch-link-cluster-create.retry

1 个答案:

答案 0 :(得分:1)

错误消息未显示配额错误,而是区域资源出现问题,我建议您尝试新区域。

引用documentation

  

即使您有区域配额,也可能是某个资源可能在特定区域中不可用。例如,您可能在区域us-central1中有配额来创建VM实例,但如果区域耗尽,则可能无法在区域us-central1-a中创建VM实例。在这种情况下,尝试在另一个区域中创建相同的资源,例如us-central1-f。

因此,在创建脚本时,您应该考虑到这种可能性,即使它不常见。

preentible个实例以来,这个问题更加突出:

  

可抢占的实例是有限的计算引擎资源,因此它们可能并不总是可用。 [...]这些实例如果需要访问这些资源以执行其他任务。可抢占的实例是超出计算引擎容量,因此它们的可用性随使用情况而变化。

<强>更新

要仔细检查我所说的你可以尝试保留禁用标志并更改区域以确保脚本正常工作并且它是在晚上发生的缺货(并且因为它在白天工作时应该是案件)。

  • 如果问题真的是可用性 - |您可能会考虑启动可执行的实例,如果不可用,请捕获错误,然后依赖于正常的或不同的区域| -

UPDATE2

正如我所承诺的,我代表您创建了功能请求,您可以关注公共跟踪器上的更新。 我建议您启动它以便通过电子邮件接收更新: