使用在 CentOS7 容器中安装的 Ansible 尝试操作 AzureVM (使用动态清单)

首先

因为有机会验证能否使用Ansible来操作AzureVM,所以我打算将当时的步骤记录下来作为个人备忘。

做过的事情 (zuò guò de shì

qiita.png

我根据以下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
qiita_nginx.png

另外,登录第二台虚拟机并确认未安装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"
}

终于,错误已被解决。
就是这样。

广告
将在 10 秒后关闭
bannerAds