簡體   English   中英

帶有動態子項的靜態組的 Ansible 動態清單

[英]Ansible Dynamic inventory with static group with dynamic children

我相信許多每天使用 Terraform 和 Ansible 或只是 Ansible 的人一定都遇到過這個問題。

一些背景:

我使用 Terraform 在 AWS 上創建我的基礎設施,並使用 Ansible 配置我的機器。 我的清單文件包含帶有一些變量的硬編碼公共 IP 地址。 由於業務需要,我經常創建和銷毀我的機器。

我的問題:

我不想在每次銷毀和創建實例時都用新的公共 IP 地址更新我的清單文件。 所以我的基本要求是 - 每次我銷毀我的機器時,我應該能夠運行我的 Terraform 腳本來重新創建機器,當我運行我的 Ansible Playbook 時,Ansible 應該能夠選擇正確的目標機器並運行 playbook。 我需要知道我需要在我的庫存文件中描述什么來實現這種自動化。 在我的情況下,清單文件中的域名 (www.fooexample.com) 和靜態公共 IP 地址不是一個選項? 我見過使用它的腳本,它看起來像一個主機名(webserver1)

有一些論壇討論使用 ec2.py 選項,但 ec2.py 正在獲取與該帳戶關聯的所有公共 IP 地址,但我只想針對您可以想象的一些機器,而不是我的劇本中的所有機器。

對此的任何幫助將不勝感激。

提前致謝

我在 GCP 中做了類似的事情,但這個概念應該適用於 AWS。

從 Ansible 2.7 開始,有一個新的清單插件架構和一些清單插件來替換動態清單腳本(例如ec2.pygcp.py )。 AWS 插件文檔位於https://docs.ansible.com/ansible/2.9/plugins/inventory/aws_ec2.html

首先,您需要標記要在 AWS 中定位的主機組。 您應該能夠使用 Terraform 處理此問題(例如Service = Web )。

接下來,使aws_ec2插件在ansible.cfg加入:

[inventory]
enable_plugins = aws_ec2

現在,轉換為使用新插件而不是ec2.py 這意味着根據文檔創建aws_ec2.yaml文件。 一個示例可能如下所示:

plugin: aws_ec2
regions:
  - us-east-1
keyed_groups:
  - prefix: tag
    key: tags
# Set individual variables with compose
compose:
  ansible_host: public_ip_address

這里的關鍵部分是keyed_groupscompose部分。 這將為您提供公共 IP 地址作為要連接到清單和組中的主機,您可以使用-l--limit進行限制。

考慮到您在us-east-1有一些帶有Service = Web標記的實例,您可以像這樣定位它們:

ansible -i aws_ec2.yaml -m ping -l tag_Service_Web

這將僅針對其公共 IP 地址上的那些標記主機。 您所做的任何動態縮放(例如在 Terraform 中增加該資源的計數)都將在下次運行時由清單插件獲取。

您還可以在劇本中使用該標簽。 如果你有一個總是針對這些主機的劇本,你可以在劇本中設置hosts: tag_Service_Web

獎金:

我一直在試驗Ansible Pull模型,該模型可以自動執行一些此類引導。 這個想法是將cloud-init與一個特殊的腳本結合起來,以自動引導該主機的劇本。

cloud-init啟動的示例腳本:

#!/bin/bash

set -euo pipefail

lock_files=(
    /var/lib/dpkg/lock
    /var/lib/apt/lists/lock
    /var/lib/dpkg/lock-frontend
    /var/cache/apt/archives/lock
    /var/lib/apt/daily_lock
)

export ANSIBLE_HOST_PATTERN_MISMATCH="ignore"
export PATH="/tmp/ansible-venv/bin:$PATH"

for file in "${lock_files[@]}"; do
    while fuser "$file" >/dev/null 2>&1; do
        echo "Waiting for lock $file to be available..."
        sleep 5
    done
done

apt-get update -qy
apt-get install --no-install-recommends -qy virtualenv python-virtualenv python-nacl python-wheel python-bcrypt

virtualenv -p /usr/bin/python --system-site-packages /tmp/ansible-venv
pip install ansible==2.7.10 apache-libcloud==2.3.0 jmespath==0.9.3

ansible-pull myplaybook.yaml \
    -U git@github.com:myorg/infrastructure.git \
    -i gcp_compute.yaml \
    --private-key /tmp/ansible-keys/infrastructure_ssh_deploy_key \
    --vault-password-file /tmp/ansible-keys/vault \
    -d /tmp/ansible-infrastructure \
    --accept-host-key

這個腳本比我的實際腳本稍微簡化了一些(省略了一些特定於域的身份驗證和密鑰提供的東西)。 但是您可以通過執行諸如從 S3 或 KMS 或其他啟動時配置服務引導密鑰之類的操作來使其適應 AWS。 我發現ansible-pull當劇本只需要運行一兩分鍾並且對外部清單沒有任何依賴(例如對其他組的引用,例如收集 IP 地址)時效果很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM