Ansible with AWS EC2 配合 Tag 定時開關機處理
作法:
- 使用 ansible 搭配 crontab 來定時開關機
- Playbook 使用 ansible-vault 加密,
- Vault 密碼檔案放在 機器 local, 不放入工作目錄( S3 ), 使用 --vault-id 指定檔案進行非互動式解密
先來看用來改寫的範本 aws_start_ec2_by_tag_crontab_use.yml 內容
# 由 aws_start_ec2_by_tag.yml 改寫, 讓系統使用 Crontab 執行
#
# edit by sakana 2019/8/21
#
# 官方建議的方式
- hosts: localhost
connection: local
gather_facts: False
#
tasks:
- name: Start instance with tag
ec2:
# 請將 access key 內容替代 aws_access_key_id
aws_access_key: "aws_access_key_id"
# 請將 secret access key 內容替代 aws_secret_access_key
aws_secret_key: "aws_secret_access_key"
# 請將要執行的 region 替代 YOUR_REGION, 例如 ap-northeast-1 東京
region: "YOUR_REGION"
# 針對 Tag 爲 Env:Lab
instance_tags: {"Env":"Lab"}
# 啟動 instances
state: running
複製範本到新檔案
# cp aws_start_ec2_by_tag_crontab_use.yml sakana_tokyo_auto_start_instance.yml
- 名稱命名可以包含 AWS帳號_Region_功用.yml
將 Key 以及 Region 填入檔案
# vi sakana_tokyo_auto_start_instance.yml
# 由 aws_start_ec2_by_tag.yml 改寫, 讓系統使用 Crontab 執行
#
# edit by sakana 2019/8/21
#
# 官方建議的方式
- hosts: localhost
connection: local
gather_facts: False
#
tasks:
- name: Start instance with tag
ec2:
# 請將 access key 內容替代 aws_access_key_id
aws_access_key: "BKIAZP37PNRIR5H6GB8F"
# 請將 secret access key 內容替代 aws_secret_access_key
aws_secret_key: "BPQax9n2046byTXUYrUfsz+C8qiXoJk4am8KAFxj"
# 請將要執行的 region 替代 YOUR_REGION, 例如 ap-northeast-1 東京
region: "ap-northeast-1"
# 針對 Tag 爲 Env:Lab
instance_tags: {"Env":"Lab"}
# 啟動 instances
state: running
這個時候檔案儲存的方式是明碼, 感覺不太好
接下來建立一個 VaultFile 配合 ansible-vault 指令來進行加解密
# vim VaultFile
testvault
使用 ansible-vault 指令來進行加密
# ansible-vault encrypt --vault-id VaultFile sakana_tokyo_auto_start_instance.yml
Encryption successful
使用 cat 指定觀察剛剛的檔案
# cat sakana_tokyo_auto_start_instance.yml
$ANSIBLE_VAULT;1.1;AES256
39653337666262383938313430633338643664663065653061336265613561306535386162326466
3963376139353865366662613136346664353865663434620a653962346530386466316433336531
64623032613863313436626637656435656565383935323863636630373439393530653136646235
現在 playbook 已經加密完成
嘗試執行 playbook
# ansible-playbook --vault-id VaultFile sakana_tokyo_auto_start_instance.yml
可以到 AWS 頁面觀察 intance 有沒有被啟動
關機的方式比照辦理
接下來就是透過 crontab -e 將想要執行的時間點配合 ansible playbook 來執行開關機
這樣的方式可以進行相關工作, 但是想到日後維護, 就會覺得有問題, 因為把所有的資訊就加密
感覺也不太對 :)
先把 剛剛加密的 playbook 解密, 等等使用另外一種方式來處理
解密的方式
# ansible-vault decrypt --vault-id VaultFile sakana_tokyo_auto_start_instance.yml
ansible-vault 另外一個選項就是 encrypt_string
以剛剛的 playbook 來說, 最重要的就是 aws_secret_key
但是開始之前要先觀察一個變數, 就是 $HISTCONTROL , 在 /bin/bash 內, 各個 OS 的設定不一樣
- CentOS 7 是 HISTCONTROL=ignoredups
- 如果重複指令就不紀錄到 history
- openSUSE 是 HISTCONTROL=ignoreboth
- 如果指令第一個字元是空白, 或是重複指令
因為等等的做法, 如果不是 HISTCONTROL=ignoreboth 加密前的明文可能會被紀錄, 所以要先確認.
如果 # echo $HISTCONTROL 出來不是 ignoreboth
可以嘗試 # vi ~/.bashrc
加入
HISTCONTROL=ignoreboth
登出 shell , 重新登入 shell 檢查
# ansible-vault encrypt_string --vault-id VaultFile --name aws_secret_key BPQax9n2046byTXUYrUfsz+C8qiXoJk4am8KAFxj
aws_secret_key: !vault |
$ANSIBLE_VAULT;1.1;AES256
35396532613832633830363831386561306366323165383036373936396133383166666461363363
3565353463386531633266633838396633383638343062610a386235626433333138343138323232
65383437363965356264376134303130373937303834336162366631376131313335363665323261
3938633665643733370a666638653438383938353433633663343835356666666632393435646661
65366431646265373366666362646566623434663735303562313139656366343534643931353361
3631646137326162336361333739666137663134353235383362
Encryption successful
- 如果這個指令被 history 記錄了, 也可以使用 #history -d [ number ] 刪除該筆記錄
修改 playbook 內容, 讓加密的內容以變數的方式提供
檔案內容如下
# 由 aws_start_ec2_by_tag.yml 改寫, 讓系統使用 Crontab 執行
#
# edit by sakana 2019/8/21
#
# 官方建議的方式
- hosts: localhost
connection: local
gather_facts: False
#
vars:
aws_secret_key: !vault |
$ANSIBLE_VAULT;1.1;AES256
33343431626565393138336165373631353536633164653934356533653666633061626664636132
3861366633393036313835663836376135366336336365300a616431353461666232383865376430
66643839396166366131366363343663363931323665343964363266323837616238326262623636
6261653061336462650a356230333334653739653536353033646465663139663034303865316562
36373633666336643066636236636430653338643039363765373062303634303637303864633664
3734393764333835656464663139373139663534306433646531
tasks:
- name: Start instance with tag
ec2:
# 請將 access key 內容替代 aws_access_key_id
aws_access_key: "BKIAZP37PNRIR5H6GB8F"
# 請將 secret access key 內容替代 aws_secret_access_key
aws_secret_key: "{{aws_secret_key}}"
# 請將要執行的 region 替代 YOUR_REGION, 例如 ap-northeast-1 東京
region: "ap-northeast-1"
# 針對 Tag 爲 Env:Lab
instance_tags: {"Env":"Lab"}
# 啟動 instances
state: running
- 只能以變數的方式來使用 encrypt_string, 不可以直接放入 ec2 module 內
嘗試執行 playbook
# ansible-playbook --vault-id VaultFile sakana_tokyo_auto_start_instance.yml
可以到 AWS 頁面觀察 intance 有沒有被啟動
也算是又向 ansible 前進一小步
~enjoy it
Reference:
沒有留言:
張貼留言