[英]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.py
和gcp.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_groups
和compose
部分。 這將為您提供公共 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.