Ansible Galaxy 作為 Ansible 的核心元件,提供了一個集中管理和分享角色的平台,簡化了 Ansible 的組態管理流程。透過 ansible-galaxy 命令,開發者可以輕鬆搜尋、安裝和移除所需的 Ansible 角色,並利用 requirements.yml 檔案一次性安裝多個角色,大幅提升效率。除了使用現有角色,Ansible Galaxy 也支援建立新的角色框架,讓開發者能根據專案需求自訂角色結構和內容,並將其分享至 Ansible Galaxy 社群。

Ansible Galaxy 的使用與角色管理

簡介

Ansible Galaxy 是 Ansible 的一個重要組成部分,提供了一個平台讓使用者能夠分享和重用 Ansible 角色。在本章中,我們將探討如何使用 Ansible Galaxy 來安裝和管理角色。

搜尋與安裝角色

首先,我們需要了解如何搜尋和安裝 Ansible Galaxy 中的角色。透過 ansible-galaxy 命令,我們可以輕鬆地搜尋、安裝和管理角色。

  1. 使用 ansible-galaxy search 命令來搜尋特定的角色。例如,搜尋與 Django 相關的角色:

ansible-galaxy search django

   這將列出所有與 Django 相關的角色。

2. 如果需要更多關於某個角色的資訊,可以使用 `ansible-galaxy info` 命令。例如,取得 `ScorpionResponse.django` 角色的詳細資訊:
   ```bash
ansible-galaxy info ScorpionResponse.django

內容解密:

  • ansible-galaxy info 命令用於取得指定角色的詳細資訊,包括描述、活躍狀態、最後一次提交的資訊等。
  • 這有助於使用者瞭解角色的功能和更新歷史。
  1. 使用 ansible-galaxy list 命令來檢視已經安裝在系統上的 Galaxy 角色:

ansible-galaxy list

   #### 內容解密:
   - 此命令列出所有已安裝的 Galaxy 角色,幫助使用者管理本地的角色函式庫。

### 登入與安裝角色
要在 Ansible Galaxy 上進行操作,需要先登入。登入後,可以安裝、匯入或刪除角色。

1. 登入 Ansible Galaxy 需要先在 [GitHub](https://github.com/) 和 [Ansible Galaxy](https://galaxy.ansible.com/login) 上建立帳戶。
2. 使用 `ansible-galaxy login` 命令登入到 Ansible Galaxy:
   ```bash
ansible-galaxy login

內容解密:

  • 登入過程中,需要提供 GitHub 的使用者名稱和密碼,用於驗證身份。
  • 成功登入後,可以進行後續的操作,如安裝角色。
  1. 安裝角色時,使用 ansible-galaxy install 命令。例如,安裝 SimpliField.users 角色:

ansible-galaxy install SimpliField.users –roles-path roles/

   #### 內容解密:
   - `--roles-path` 選項指定了角色的安裝路徑,這裡是 `roles/` 目錄。
   - 安裝過程中,Ansible Galaxy 會從指定的來源下載並解壓縮角色到目標目錄。

### 使用已安裝的角色
安裝完成後,可以在 playbook 中使用該角色。

1. 建立一個新的 playbook YAML 檔案,例如 `new_user.yml`,並在其中參照已安裝的角色:
   ```yaml
---
- hosts: all
  roles:
    - role: SimpliField.users
      users:
        - simplifield:
          name: "simplifield"
          comment: "simplifield user"
          createhome: "yes"
          home: "/home/simplifield"
          shell: "/bin/false"

內容解密:

  • 在 playbook 中,透過 roles 關鍵字引入 SimpliField.users 角色。
  • 定義了變數 users,用於指定要建立的新使用者資訊。
  1. 執行 playbook:

ansible-playbook -i hosts new_user.yml

   #### 內容解密:
   - `-i hosts` 指定了 inventory 檔案。
   - 執行 playbook 後,將根據定義的角色和變數建立新的使用者。

### 驗證結果
最後,驗證新使用者是否成功建立:
```bash
cat /etc/passwd | grep simplifield

內容解密:

  • 此命令檢查 /etc/passwd 檔案中是否存在新建立的使用者 simplifield
  • 如果成功建立,使用者資訊將顯示在輸出中。

重點回顧

  • 使用 ansible-galaxy 命令進行角色搜尋、安裝和管理。
  • 登入 Ansible Galaxy 以進行更進階的操作。
  • 在 playbook 中參照已安裝的角色以實作自動化組態。
  • 驗證操作結果以確保自動化任務的正確執行。

使用Ansible Galaxy管理角色

移除已下載的角色

透過ansible-galaxy命令,可以輕鬆地移除已下載的角色。使用remove選項,並指定角色名稱和安裝路徑,即可完成移除。

ansible-galaxy remove SimpliField.users --roles-path roles/

成功執行後,會顯示「successfully removed SimpliField.users」的訊息,代表角色已成功移除。

內容解密:

  1. ansible-galaxy remove:使用remove指令來移除指定的角色。
  2. SimpliField.users:指定要移除的角色名稱。
  3. --roles-path roles/:指定角色安裝的路徑,以確保相關目錄被正確清理。

從Galaxy下載和安裝多個角色

在某些情況下,需要從Galaxy下載多個角色。為了簡化操作,可以使用requirements.yml檔案來指定需要安裝的角色。

建立requirements.yml檔案

首先,建立一個名為requirements.yml的YAML檔案,並在其中定義需要安裝的角色。

# requirements.yml
- src: SimpliField.users
  name: supersecretrole

安裝角色

接著,使用ansible-galaxy install命令,並加上-r選項,指定requirements.yml檔案,即可安裝定義在檔案中的角色。

export ANSIBLE_ROLES_PATH="roles"
ansible-galaxy install -r requirements.yml

成功執行後,會顯示下載和安裝的詳細資訊,例如下載的角色名稱、版本和安裝路徑。

內容解密:

  1. export ANSIBLE_ROLES_PATH="roles":設定環境變數,指定Ansible角色的安裝路徑。
  2. ansible-galaxy install -r requirements.yml:使用-r選項,指定requirements.yml檔案來安裝角色。
  3. YAML檔案中的src欄位:指定角色的來源,通常是Galaxy上的角色名稱。
  4. YAML檔案中的name欄位:可選,用於指定下載後的角色名稱。

使用Ansible Galaxy建立新角色

除了管理現有的角色外,Ansible Galaxy還提供了建立新角色的功能。使用ansible-galaxy init命令,可以快速建立一個新的角色框架。

cd roles/
ansible-galaxy init test_role

執行後,會在當前目錄下建立一個名為test_role的新角色目錄,並包含預設的目錄結構和檔案。

內容解密:

  1. cd roles/:切換到角色目錄,以保持與其他角色的一致性。
  2. ansible-galaxy init test_role:使用init指令建立一個新的角色,名為test_role
  3. test_role/目錄結構:包含預設的目錄和檔案,例如defaults/files/handlers/meta/等,提供了一個基本的角色框架。

使用Ansible Galaxy建立與分享自訂角色

Ansible Galaxy是一個用於分享和重複使用Ansible角色的平台。透過Galaxy,使用者可以輕鬆地找到、安裝和分享角色。在本章中,我們將探討如何使用ansible-galaxy命令建立新的角色、定義自訂範本,以及如何將角色貢獻給Ansible Galaxy。

建立新的Ansible角色

要建立新的Ansible角色,可以使用ansible-galaxy init命令。這個命令會在指定的目錄中建立基本的角色結構。

ansible-galaxy init test_role

執行此命令後,test_role目錄將被建立,包含以下子目錄和檔案:

test_role/
├── README.md
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

自訂角色範本

除了使用預設的角色結構外,Ansible Galaxy還允許您定義自己的範本。要做到這一點,首先需要建立一個符合您需求的角色結構,然後使用--role-skeleton選項來指定這個範本。

# 移除tests目錄以自訂角色結構
rm -rf test_role/tests/

# 使用自訂範本建立新的角色
ansible-galaxy init --role-skeleton=test_role test_skeleton_role

新建立的test_skeleton_role將會遵循您定義的範本結構。

貢獻角色到Ansible Galaxy

要將您的角色分享給其他人,您需要將其貢獻到Ansible Galaxy。首先,請確保您的角色具有準確的檔案和後設資料。

更新README.md和meta/main.yml

  1. 編輯README.md檔案,加入必要的資訊,如角色描述、需求、變數、依賴關係和範例劇本。
# Test Skeleton Role
Testing how to add roles to Ansible Galaxy

## Requirements
There are no requirements for the role.

## Role Variables
There are no variables needed for the role.

## Dependencies
There are no dependencies for the role.

## Example Playbook
The role does not have any example playbooks yet.
  1. 編輯meta/main.yml檔案,更新角色的後設資料,包括作者、描述、公司和標籤。
galaxy_info:
  author: vincesesto
  description: This is a test role
  company: No Company
  galaxy_tags: [test_role]

將角色上傳到GitHub並匯入Ansible Galaxy

  1. 將您的角色上傳到GitHub。這包括初始化一個Git儲存函式庫、新增檔案、提交變更並推播到GitHub。
git init
git add .
git commit -m "First Commit"
git remote add origin <repository_domain>
git push -u origin master
  1. 登入Ansible Galaxy並從GitHub匯入您的角色。

建立自訂 Ansible 模組與使用 Ansible Galaxy

將角色上傳至 Ansible Galaxy

在前面的章節中,我們已經學會瞭如何建立一個基本的 Ansible 角色,並將其上傳至 GitHub。現在,我們將繼續學習如何將這個角色上傳至 Ansible Galaxy,以便與社群分享和協作。

  1. 首先,確保你的 GitHub 帳戶已經與 Ansible Galaxy 連結。
  2. 登入 Ansible Galaxy 後,點選左側選單中的「My Content」或直接存取 https://galaxy.ansible.com/my-content/namespaces
  3. 點選「Add Content」按鈕,你將看到有多個選項,包括從 GitHub 匯入角色或上傳新的集合。
  4. 選擇從 GitHub 匯入角色,並選擇你之前建立的 repository。
  5. 點選「Save」後,你的角色就會出現在「My Content」頁面中。

上傳角色後的驗證

上傳成功後,你可以透過以下步驟驗證:

  • 點選新上傳角色的連結,檢視是否正確顯示角色的詳細資訊,包括 README.md 和 meta.yml 中的內容。
  • 使用 Ansible Galaxy 的搜尋功能,在網頁介面和命令列中搜尋你的角色,確認是否能正確找到。

建立自訂 Ansible 模組

Ansible 提供了大量的內建模組,但有時你可能需要建立自己的模組來滿足特定的需求。建立自訂模組可以使用多種程式語言,常見的有 Python 和 Linux shell。

使用 Python 建立「Hello World」模組

  1. 在你的工作目錄下,建立一個名為 library 的目錄,用於存放自訂模組。

    mkdir library
    
  2. library 目錄下,建立一個名為 hello_module.py 的檔案。

    touch library/hello_module.py
    
  3. 編輯 hello_module.py,加入以下 Python 程式碼:

    #!/usr/bin/python
    
    from ansible.module_utils.basic import *
    
    def main():
        module = AnsibleModule(argument_spec={})
        response = {"hello": "world!"}
        module.exit_json(changed=False, meta=response)
    
    if __name__ == "__main__":
        main()
    

    程式碼解析:

    • 第 1 行指定了執行該指令碼所需的 Python 版本。
    • 第 3 行匯入了 Ansible 所需的模組。
    • 第 5-8 行定義了 main 函式,該函式在模組執行時被呼叫。其中,第 6 行建立了一個 AnsibleModule 物件,用於處理輸入引數和離開程式。
    • 第 10-11 行確保當指令碼被直接執行時呼叫 main 函式。
  4. 建立一個名為 newmodule_test.yml 的 playbook,用於測試新的模組。

    touch newmodule_test.yml
    
  5. 編輯 newmodule_test.yml,加入以下內容:


  • hosts: localhost tasks:
    • name: testing our new module hello_module: register: result
    • debug: var=result
#### Playbook 解析:
- 該 playbook 在 localhost 上執行。
- 第一個 task 執行了我們剛建立的 `hello_module`,並將結果註冊到變數 `result` 中。
- 第二個 task 輸出 `result` 變數的值。

透過上述步驟,你可以成功建立並測試一個簡單的自訂 Ansible 模組。這個過程展示瞭如何使用 Python 編寫模組以及如何將其整合到 Ansible playbook 中。隨著對 Ansible 和 Python 的進一步瞭解,你可以開發出更為複雜和強大的自訂模組,以滿足特定的自動化需求。

## 在 Amazon Cloud 中使用 Ansible 進行佈署

### 簡介
在前面的章節中,我們已經學習了 Ansible 的基礎知識和一些進階功能。本章將重點介紹如何在 Amazon Web Services(AWS)雲端環境中使用 Ansible 進行佈署和管理。

### 為何選擇 AWS
AWS 是目前最流行的雲端平台之一,提供了豐富的服務和資源。選擇 AWS 作為我們的雲端平台,是因為它提供了高度的彈性、可擴充套件性和可靠性。

### 開始使用 Ansible 和 AWS
要開始使用 Ansible 和 AWS,我們需要了解一些基本的 Ansible 模組,這些模組可以用來與 AWS 進行互動。我們將介紹如何使用這些模組來佈署和管理 AWS 資源。

### 使用 Ansible 佈署到 AWS
要使用 Ansible 佈署到 AWS,我們需要安裝必要的模組和工具。我們可以使用 `ansible-galaxy` 命令來安裝所需的角色和模組。

#### 建立 AWS 認證
在使用 Ansible 佈署到 AWS 之前,我們需要建立 AWS 認證。我們可以使用 AWS 的 IAM 服務來建立必要的認證檔案。

#### 編寫 Ansible Playbook
一旦我們建立了 AWS 認證,我們就可以開始編寫 Ansible Playbook 來佈署和管理 AWS 資源。下面是一個簡單的範例:
```yml
---
- name: Deploy to AWS
hosts: localhost
tasks:
- name: Create an EC2 instance
 ec2:
   key_name: my_key
   instance_type: t2.micro
   image_id: ami-abc123
   region: us-west-2
 register: ec2_result
- debug: var=ec2_result

這個 Playbook 使用 ec2 模組來建立一個 EC2 例項,並將結果註冊到 ec2_result 變數中。

執行 Ansible Playbook

要執行這個 Playbook,我們可以使用以下命令:

ansible-playbook -i hosts deploy_to_aws.yml

這個命令將執行 Playbook 中的任務,並輸出結果。

自定義 Ansible 模組

在前面的章節中,我們已經學習瞭如何建立自定義的 Ansible 模組。我們可以使用相同的技術來建立自定義的模組,以便與 AWS 進行互動。

建立自定義模組

要建立自定義模組,我們需要建立一個新的檔案,並在其中定義模組的邏輯。下面是一個簡單的範例,使用 Python 編寫:

#!/usr/bin/python

from ansible.module_utils.basic import AnsibleModule

def main():
    module = AnsibleModule(
        argument_spec=dict(
            name=dict(required=True)
        )
    )

    name = module.params['name']

    # 在這裡新增與 AWS 互動的邏輯
    result = {'changed': False, 'message': f'Hello, {name}!'}

    module.exit_json(**result)

if __name__ == '__main__':
    main()

使用自定義模組

要使用自定義模組,我們需要將其儲存在正確的位置,並在 Playbook 中參照它。下面是一個簡單的範例:

---
- name: Use custom module
  hosts: localhost
  tasks:
  - name: Call custom module
    my_custom_module:
      name: 'World'
    register: result
  - debug: var=result

這個 Playbook 使用 my_custom_module 模組,並將結果註冊到 result 變數中。