使用在 CentOS7 容器中安装的 Ansible 尝试操作 AzureVM (使用动态清单)
首先
因为有机会验证能否使用Ansible来操作AzureVM,所以我打算将当时的步骤记录下来作为个人备忘。
做过的事情 (zuò guò de shì
我根据以下Azure官方文档的内容进行了操作:
教程 – 使用Ansible配置Azure资源的动态清单 | 微软文档
控制端的版本确认
-
- Docker Desktop for Windows (Version 3.3.1) / Docker Engine v20.10.5
-
- CentOS 7.9.2009
-
- Ansible 2.10.8
- Azure CLI 2.22.1
事前准备
我们将在控制节点上安装各种工具。
安装Ansible
在查看 Microsoft Azure 官方文档时进行安装。
参考链接:使用 Azure CLI 配置 Ansible 的快速入门 | Microsoft Docs
安装 Azure CLI
使用 Azure CLI,创建和删除资源组,并构建虚拟机。
同时,参考 Microsoft Azure 官方文档进行安装。
参考链接:在Linux上手动安装Azure CLI | Microsoft文档
创建SSH密钥
创建用于登录Azure VM的密钥。
将其命名为ansible_rsa,并且不设置密码。
ssh-keygen -m PEM -t rsa -b 2048 -f ~/.ssh/ansible_rsa -N ""
创建 Azure 资源组
以 myAnsibleRG 作为名称创建资源组,其中包含 AzureVM 所属的资源组。
az group create --name myAnsibleRG --location japaneast
创建 AzureVM
这个虚拟机将被称为“目标节点”。
使用之前的步骤中创建的 ansible_rsa 作为 SSH 密钥。
# 1台目
az vm create --resource-group myAnsibleRG --name myAnsibleVM01 --image OpenLogic:CentOS:7.7:latest --size Standard_B1s --admin-username azureuser --ssh-key-values ~/.ssh/ansible_rsa.pub
# 2台目
az vm create --resource-group myAnsibleRG --name myAnsibleVM02 --image OpenLogic:CentOS:7.7:latest --size Standard_B1s --admin-username azureuser --ssh-key-values ~/.ssh/ansible_rsa.pub
5. 给AzureVM打标签
我正在尝试为标记了的虚拟机安装Nginx,因此我将在第一台虚拟机上进行标记。
az resource tag --tags Ansible=nginx --id /subscriptions/<YourAzureSubscriptionID>/resourceGroups/myAnsibleRG/providers/Microsoft.Compute/virtualMachines/myAnsibleVM01
6. 打开80端口 80
为了确认是否安装了Nginx,我们提前打开第一台虚拟机的80号端口。
az vm open-port --port 80 --resource-group myAnsibleRG --name myAnsibleVM01
7. 创建 Azure 凭据文件。
为了向Ansible提供Azure的凭据信息,我们创建了一个本地的凭据文件。
从安全的角度考虑,定义环境变量是推荐的方法,但为了验证目的,我们此次选择创建凭据文件。
首先创建一个名为“credentials”的文件。
mkdir ~/.azure
vi ~/.azure/credentials
请注意,文件的内容如下,请确保不要错误地公开。
[default]
subscription_id=<your-subscription_id>
client_id=<security-principal-appid>
secret=<security-principal-password>
tenant=<security-principal-tenant>
8. 动态库存生成。
目标节点的信息可以被定义并管理在文本文件中的清单中。但是,如果连接的IP地址和主机名在本地环境中几乎是固定的,那就没有问题。但在云环境中,EC2和AzureVM实例的频繁添加和删除会导致更新清单文件变得不切实际。
因此,使用脚本通过API获取目标节点的信息,并动态地获取它被称为动态清单的框架。
动态库存文件需要以azure_rm为名称结尾的YAML文件。
这次将其保存为myazure_rm.yml。
plugin: azure_rm
include_vm_resource_groups:
- myAnsibleRG
auth_source: auto
keyed_groups:
- prefix: tag
key: tags
9. 连接测试至虚拟机
我将尝试Ping源组中的虚拟机。
ansible all -i ./myazure_rm.yml -m ping --private-key=~/.ssh/ansible_rsa -u azureuser
只要有两台VM连接成功,就会显示以下结果。
myAnsibleVM01_500a | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
myAnsibleVM02_0c1a | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10. 查看已设定的存货清单
确认已设定的库存。
ansible-inventory -i myazure_rm.yml --graph
@all:
|--@tag_Ansible_nginx:
| |--myAnsibleVM01_500a
|--@ungrouped:
| |--myAnsibleVM02_0c1a
通过指定 @tag_Ansible_nginx,您也可以测试与第一台VM的连接。
ansible -i ./myazure_rm.yml -m ping --private-key=~/.ssh/ansible_rsa -u azureuser tag_Ansible_nginx
11. 制作游戏规则书
创建一个名为nginx.yml的Playbook来安装Nginx。
---
- name: Install and start Nginx on an Azure virtual machine
hosts: all
become: yes
tasks:
- name: Add Nginx Yum Repository
yum_repository:
name: nginx
description: nginx repo
baseurl: http://nginx.org/packages/mainline/centos/7/$basearch/
owner: root
gpgcheck: no
enabled: yes
state: present
- name: Install nginx
yum: name=nginx state=present
notify:
- start nginx
handlers:
- name: start nginx
service: name=nginx state=started
12. 安装和验证Nginx的运行。
为了执行Playbook安装Nginx,我们将使用–limit参数来确认这只能在第一台VM上进行安装。
ansible-playbook -i ./myazure_rm.yml --private-key=~/.ssh/ansible_rsa -u azureuser nginx.yml --limit=tag_Ansible_nginx
另外,登录第二台虚拟机并确认未安装Nginx。
[azureuser@myAnsibleVM02 ~]$ nginx -V
-bash: nginx: command not found
13. 资源的清理工作
整理一下我们用于验证的Azure资源,然后完成验证工作。
az group delete --name myAnsibleRG
【附加】在验证过程中遇到的困境
在进行连接测试时遇到了错误,让我稍微陷入困境。
# これだとエラー
ansible -i ./myazure_rm.yml -m ping tag_Ansible_nginx
myAnsibleVM01_500a | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).",
"unreachable": true
}
由于本次验证中使用的是名为ansible_rsa的SSH密钥,因此需要明确指定该密钥。
# SSH鍵を明示的に指定する
ansible -i ./myazure_rm.yml -m ping --private-key=~/.ssh/ansible_rsa tag_Ansible_nginx
myAnsibleVM01_500a | FAILED! => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"module_stderr": "Shared connection to 20.xxx.xxx.xxx closed.\r\n",
"module_stdout": "Please login as the user \"azureuser\" rather than the user \"root\".\r\n\r\n",
"msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
"rc": 0
}
尽管仍然报错,但因为有出现要求使用azureuser登录的消息,我将尝试指定为azureuser。
# SSH鍵を明示的に指定しつつ、azureuserでログインする
ansible -i ./myazure_rm.yml -m ping --private-key=~/.ssh/ansible_rsa -u azureuser tag_Ansible_nginx
myAnsibleVM01_500a | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
终于,错误已被解决。
就是这样。