星期四, 8月 22, 2019

Ansible with AWS EC2 配合 Tag 定時開關機處理

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:

沒有留言: