在 AWS 中使用 Ansible 來管理你的 SSH 金鑰

2019-12-08 09:31:00

如果你長期使用亞馬遜 Web 服務(AWS)中的範例,你可能會遇到下面這個常見的問題,它不是因為技術性的原因導致的,更多的是因為人類追求方便舒適的天性:當你登入一台你最近沒有使用的區域的新範例,你最終會建立一個新的 SSH 金鑰對,久而久之這最終就會造成個人擁有太多金鑰,導致管理起來複雜混亂。

本文將會介紹一種在所有區域中使用你的公鑰的方法。最近,一篇 Fedora Magazine 的文章介紹了另一種解決方案。但本文中的解決方案可以進一步的以更簡潔和可延伸的方式實現自動化。

假設你有一個 Fedora 30 或 31 系統,其中儲存了你的金鑰,並且還安裝了 Ansible。當這兩件事同時滿足時,就提供了解決這個問題的辦法,甚至它還能做到更多。

使用 Ansible 的 ec2_key 模組,你可以建立一個簡單的 Ansible 劇本來在所有區域中維護你的 SSH 金鑰對。如果你需要增加或者刪除金鑰,在 Ansible 中這就像從檔案中新增和刪除行一樣簡單。

設定和執行 Ansible 劇本

如果要使用劇本,首先需要安裝 ec2_key 模組的必要依賴項:

$ sudo dnf install python3-boto python3-boto3

該劇本很簡單:你只需要像下面的例子一樣,修改其中的金鑰及其對應的名稱。然後,執行該劇本,它會幫你遍歷所有列出的公共 AWS 區域。該範例還包括一些你可能要存取的受限區域,只需根據需要來取消對應行的注釋,然後,儲存檔案重新執行劇本即可。

---- name: Maintain an ssh key pair in ec2  hosts: localhost  connection: local  gather_facts: no  vars:    ansible_python_interpreter: python  tasks:    - name: Make available your ssh public key in ec2 for new instances      ec2_key:        name: "YOUR KEY NAME GOES HERE"        key_material: 'YOUR KEY GOES HERE'        state: present        region: "{{ item }}"      with_items:        - us-east-2   #US East (Ohio)        - us-east-1   #US East (N. Virginia)        - us-west-1   #US West (N. California)        - us-west-2   #US West (Oregon)        - ap-east-1   #Asia Pacific (Hong Kong)        - ap-south-1   #Asia Pacific (Mumbai)        - ap-northeast-2  #Asia Pacific (Seoul)        - ap-southeast-1  #Asia Pacific (Singapore)        - ap-southeast-2  #Asia Pacific (Sydney)        - ap-northeast-1  #Asia Pacific (Tokyo)        - ca-central-1   #Canada (Central)        - eu-central-1   #EU (Frankfurt)        - eu-west-1   #EU (Ireland)        - eu-west-2   #EU (London)        - eu-west-3   #EU (Paris)        - eu-north-1   #EU (Stockholm)        - me-south-1   #Middle East (Bahrain)        - sa-east-1   #South America (Sao Paulo)  #      - us-gov-east-1  #AWS GovCloud (US-East)  #      - us-gov-west-1  #AWS GovCloud (US-West)  #      - ap-northeast-3 #Asia Pacific (Osaka-Local)  #      - cn-north-1   #China (Beijing)  #      - cn-northwest-1 #China (Ningxia)

這個劇本需要通過 API 存取 AWS,為此,請使用環境變數,如下所示:

$ AWS_ACCESS_KEY="aws-access-key-id" AWS_SECRET_KEY="aws-secret-key-id" ansible-playbook ec2-playbook.yml

另一個方式是安裝 aws 命令列工具並新增憑據,如以前的一篇 Fedora Magazine 文章所述。如果你線上儲存它們,這些引數將不建議插入到劇本中!你可以在 GitHub 中找到本文的劇本程式碼。

完成該劇本之後,請確認你的金鑰在 AWS 控制台上可用。為此,可以做如下操作:

  1. 登入你的 AWS 控制台
  2. 轉到 “EC2 > Key Pairs”
  3. 你應該會看到列出的金鑰。唯一的限制是你必須使用此方法逐個區域來檢查。

另一種方法是在 shell 中使用一個快速命令來為你做這些檢查。

首先在劇本上建立一個包含所有區域的變數:

AWS_REGION="us-east-1 us-west-1 us-west-2 ap-east-1 ap-south-1 ap-northeast-2 ap-southeast-1 ap-southeast-2 ap-northeast-1 ca-central-1 eu-central-1 eu-west-1 eu-west-2 eu-west-3 eu-north-1 me-south-1 sa-east-1"

然後,執行如下迴圈,你就可以從 aws 的 API 獲得結果:

for each in ${AWS_REGION} ; do aws ec2 describe-key-pairs --key-name <YOUR KEY GOES HERE> ; done

請記住,要執行上述操作,你需要安裝 aws 命令列。