2016-12-14 68 views
1

我有什麼似乎像一個有效的用例不支持的 - 據我所知 - 的情況下,使用packer.io我擔心我可能失去了一些東西......我可以使用一個包裝器生成器與許多供應商並仍然運行並行生成?

所以,在封隔器,我可以添加:

  • 許多builders
  • 有每個製造商不同name
  • 使用Builder name在供應方的only節最後
  • 運行packer build -only=<builder_name>將我的構建有效地限制爲只與特定構建器結合使用的配置器。

這很好。

我現在試圖做的是使用相同的基礎圖像來創建3個不同的構建(和產生的AMI)。顯然,我可以複製粘貼相同的構建器配置3次,然後使用3個不同的配置器,使用only參數將每個配置器鏈接到相應的構建器。

這完全感覺浪費非常容易出錯,但...這聽起來像我應該能夠使用相同的建設者,只是限制了應用供應方..?

是我唯一的解決方案,使用3複製粘貼的建設者?有沒有更好的解決方案?

回答

1

only適用於構建器name上的過濾器,因此不是一個選項。

,您可以用這些aproches的解決這個問題:

  1. 預處理一個JSON和一個創建3個模板。

  2. 使用一個帶有用戶變量的模板來定義它的構建和構建3次。使用腳本中的變量條件來運行正確的腳本。

  3. 建基地AMI與模板的公用部分,然後運行3個不同的基礎上置備的差異。

一般來說,Packer試圖解決一件好事,因爲不包括用於描述不同構建風格的高級DSL,所以範圍減少。對於更高級的用例,預處理和創建json很容易。

+0

實際上,'only'在構建'name'的時候默認設置爲'type'。但是你可以設置一個自定義名稱。 https://www.packer.io/docs/templates/provisioners.html#run-on-specific-builds –

+0

是的,正確的。我已經更新了我的答案。感謝您指出了這一點。 –

1

我有同樣的問題,在這裏我想建立2周不同的AMI(一個用於分期,一個用於生產)以及它們之間唯一的區別就是供應期間應用ansible組。通過@Rickard ov Essen構建答案,我使用jq編寫了一個bash腳本來複制配置的構建器部分。

這是我的packer.json文件:

{ 
    "builders": [ 
     { 
      "type": "amazon-ebs", 
      "name": "staging", 
      "region": "ap-southeast-2", 
      "source_ami_filter": { 
       "filters": { 
        "virtualization-type": "hvm", 
        "name": "ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-*", 
        "root-device-type": "ebs" 
       }, 
       "owners": ["099720109477"], 
       "most_recent": true 
      }, 
      "instance_type": "t2.nano", 
      "ssh_username": "ubuntu", 
      "force_deregister": true, 
      "force_delete_snapshot": true, 
      "ami_name": "my-ami-{{ build_name }}" 
     } 
    ], 
    "provisioners": [ 
     { 
      "type": "ansible", 
      "playbook_file": "provisioning/site.yml", 
      "groups": ["{{ build_name }}"] 
     } 
    ] 
} 

的ansible供應者用戶變量build_name選擇要運行的ansible組。

然後,我有一個bash腳本build.sh它運行封隔器編譯:

#!/bin/bash 

jq '.builders += [.builders[0] | .name = "production"]' packer.json > packer_temp.json 

packer build packer_temp.json 

rm packer_temp.json 

你可以看到什麼packer_temp.json文件看起來像this jqplay

如果您需要添加更多的AMI你可以繼續添加更多的JQ過濾器:

jq '.builders += [.builders[0] | .name = "production"] | .builders += [.builders[0] | .name = "test"] 

這將再添AMI的test

相關問題