使用IBM Cloud Collection for Ansible,尝试操作IBM Cloud

首先

IBM Cloud发布了IBM Cloud Collection for Ansible,它是一个使用Ansible模块的集合。因此,我们将使用IBM Cloud Collection for Ansible,从Ansible的Playbook中创建IBM Cloud的Virtual Server for VPC。

解释

IBM Cloud Collection for Ansible 是指IBM为Ansible开发的云收集插件。

IBM Cloud Collection for Ansible 是用于通过 Ansible 操作 IBM Cloud 的 Ansible 模块。

以下是在2020年2月10日通过以下博客发布的信息:
https://www.ibm.com/cloud/blog/announcements/ibm-cloud-collection-for-ansible

实际的代码可以在IBM Cloud的Github上找到并且可以自由使用。
https://github.com/IBM-Cloud/ansible-collection-ibm

提供了样例的Ansible代码(Playbook),我想尝试一下这个链接上的代码:
https://github.com/IBM-Cloud/ansible-collection-ibm/tree/master/examples/simple-vm-ssh

这段示例代码似乎会创建以下资源。

    • VPC (ibm_is_vpc)

 

    • Subnet (ibm_is_subnet)

 

    • VSI (ibm_is_instance)

 

    • Floating IP Address (ibm_is_floating_ip)

 

    Security Group Rule (ibm_is_security_group_rule)

你为什么开心?

可以使用Ansible Playbook来构建和配置IBM Cloud。
Ansible Playbook是使用YAML语言编写的,可以实现基础设施即代码的管理,简而言之,可以将云原生状态提升一级。

基础设施即代码 (Infrastructure as Code)

一旦我们能够通过代码管理基础设施,就能够看到基础设施的持续集成与持续交付(Infrastructure CICD)的下一个阶段了。

IBM Cloud 是一个云计算平台。

Amazon Web Service 和 Google Cloud Platform 都是 IBM 的云服务提供商。

IBM Cloud是IBM基于开放技术构建的云服务。作为支持”应用程序”、”人工智能”和”数据”的平台,可以使用各种服务,包括SaaS、PaaS和IaaS等。本书主要介绍基础设施服务。

(摘自:首先由具备技术背景的人阅读的IBM Cloud柔性层手册)

IBM Cloud(アイビーエムクラウド)是IBM的云服务品牌名称。于2017年11月,原有的Bluemix品牌被更名为IBM Cloud品牌名称。

(From: Wikipedia)
(引自:维基百科)

安全是一个操作计谋集合,旨在自动化 IT 系统的配置、管理和部署。

Ansible是一种在服务器和个人电脑上运行的配置管理工具。

Ansible(安祖布尔)是由Red Hat开发的开源配置管理工具。在启动服务器时,它可以根据预先准备的配置文件自动执行软件安装和设置。特别是在构建大规模计算机集群时,它可以缩短时间并减少错误。除了配置管理功能外,它还具备编排和软件部署功能。

(来源:维基百科)

Ansible是一个由Python编写的开源项目,它是一个配置管理工具。根据以YAML格式编写的配置文件,可以自动执行服务器和网络设备等的配置。

目前,Ansible不仅仅局限于配置管理,其范围已扩大到应用程序部署和编排等方面。本文将专注于讲解Ansible作为自动化工具的用途。

值得注意的是,Ansible由Red Hat提供支持。Ansible于2012年诞生,近年来以快速的速度进行开发,并每几个月发布一个新版本。当前版本是2.7,并计划近期发布2.8版本。

(来源:中所提供的Ansible技术能够做到的事情 – 学习安装和运行,直到将Nginx投入EC2)

环境准备

当阅读Readme.md和每个模块的文档时,我们可以了解到在执行Ansible的终端上,除了需要安装IBM Cloud Collection for Ansible之外,还需要满足以下前提条件。

    • Python3

 

    • RedHat Ansible 2.8+

 

    • IBM-Cloud terraform-provider-ibm v1.2.0

 

    Terraform v0.12.20

请参考以下内容获取用于操作IBM Cloud的API KEY。(执行示例代码需要拥有对默认资源组的访问权限。)
IBM Cloud 文档 / 用户 API 密钥管理

准备Docker容器

因为准备环境很麻烦,所以我准备了一个Dockerfile来创建一个包含上述的基础设施的Docker容器。我会使用这个Dockerfile生成并启动一个带有工具的容器,并在容器中执行Ansible Playbook。

请在您的设备上安装Docker和git,并按照以下步骤进行。以下步骤是基于我作为作者使用的Mac设备进行的。如果您是Windows或Linux用户,请进行相应的更改。

$ git clone git@github.com:kentarok/ibmcloud_collection4ansible.git
$ cd ibmcloud_collection4ansible
$ ls -l
Dockerfile      README.md       my_env_file.txt

请在我的_env_file.txt文件中写入IBM Cloud的API KEY。

$ cat my_env_file.txt
IC_API_KEY=xxxxxxxxxxxxxxxxxx

使用Dockerfile创建并启动容器,进入容器内部。
在执行docker container run命令时,使用–env-file指定my_env_file.txt文件。

$ docker build -t ansible . -f Dockerfile
(中略)
Successfully built 479c85388b28
Successfully tagged ansible:latest

$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ansible             latest              479c85388b28        8 minutes ago       1.26GB
python              3.6                 971c66f6a27f        7 days ago          914MB

$ docker container run -d -it -v $(pwd):/ansible --env-file ./my_env_file.txt --name ansible ansible
dbb219b5e48f0b819e3ef036393045914bdd5e4a67085c5d9ea50c0092c5ad6c

$ docker container exec -it ansible /bin/bash
#

确认Docker容器

我会检查容器内的环境。

# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
root@dbb219b5e48f:/# which python
/usr/local/bin/python

# python --version
Python 3.6.10

# ansible --version
ansible 2.9.4
  config file = /ansible/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.6/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.6.10 (default, Feb  2 2020, 09:39:59) [GCC 8.3.0]

# terraform -v
Terraform v0.12.20

env文件中设置的环境变量也已经正确设置。

# env | grep IC
IC_API_KEY=xxxxxxxxxxxxxxxxxxxxxx

执行 Ansible Playbook

在容器中的 /ansible-collection-ibm 目录下,已经克隆了 git@github.com:IBM-Cloud/ansible-collection-ibm.git 的代码仓库。

这次要尝试的示例代码是/ansible-collection-ibm/examples/simple-vm-ssh/create.yml。以下是其内容。

创建.yml
https://github.com/IBM-Cloud/ansible-collection-ibm/blob/master/examples/simple-vm-ssh/create.yml

我需要进行两处修正。

生成SSH密钥

在`create.yml`中,执行以下操作。

    • SSH公開鍵をIBM Cloudに登録

 

    • Virtual Server for VPC に IBM Cloudに登録したSSH公開鍵を登録

 

    Virtual Server for VPC に 対応するSSH秘密鍵を使ってSSHログインテスト

为此,生成SSH密钥并在create.yml文件中写入公钥。

# ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
(略)

# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCsj7P7SmFRq0mFyY6eqgSAW8inki9hrd4SMGe5pLVJaiMdz0x3QMxX6HLWOIgDIlcziI4sbhxjfYkQIraYZm/VXbqNOHDn4GZ0B0hoe95k6xg51TDCDcgTZ6gQxHIsNMHg7zskvcxdB10zqNEzN3MVW14si6yLR4LLgkLUq5ORlHFtGPFG9wUU2GaLAjYiqrHPfz6whfXm7rsKcJKIQ//yVgTy0edyzQMCAGI6Io9EUVxcJCAEUdnyfqK2Dn40Ikfb2AsuRNYk4vJkEwAjJvwQjEw9s4DEEsWlnh/dZyA/7z1w5ebzeT/P2KL8ZNMpnBd3j0dJVGB1g8qHcrWonQLcfonUX0rjCKw7wy2dgo5PNC/2pBgps3E1jTmlCJRVD/HzHcu3A8DSkZLwFiiBv3GCsLkqfJjQtKR3dWxC3WVf4FqKb8De5yQmYVcBCW9nJRfNjQKTTWPe/1r0tGUN7J6D3TJNk9QAzARPmJaSEGVY6VfwCm1I1P3q6bjRfzO2WfCIi0hRzM141sF6vfnu3qzd1VtAAX5T1hUIkOFLZMAE+hJXPhTvvbK6K2NsMycX1FVqJ9FuvgXS7nAvRmztw4npruVrLpKnodGoNkd+wNjkEmcQjLJgypAUlki4JwQxRLhxKolc4b1jz1HNt1rSOXK02vCJXaiikLUXH67PwDFRNQ== root@dbb219b5e48f

将以下内容写在 create.yml 文件的第8行。

---
- name: Create IBM Cloud VPC VSI
  hosts: localhost
  vars:
    name_prefix: ansible-demo
    vsi_image: ibm-ubuntu-18-04-64-ppc64le-minimal-for-vsi
    vsi_profile: cp2-2x4
    ssh_public_key: xxxx  # <- here
    ipv4_cidr_block: 10.240.128.0/24
    zone: us-south-3

安全组的配置

在 create.yml 文件的第104行中,有以下的描述。
这是一个用于创建与 Virtual Server for VPC 相关联的安全组的 Play。

    - name: Configure Security Group Rule to open SSH on the VSI
      ibm_is_security_group_rule:
        state: available
        group: "{{ vpc.default_security_group }}"
        direction: inbound
        remote: 0.0.0.0/0
        tcp:
          - port_max: 22
            port_min: 22

遠程訪問:0.0.0.0/0 作為指定,該配置接受來自全球的Port22 = SSH訪問。為了安全起見,我們應將其更改為正確的IP地址。您可以使用確認查詢服務來確定自己的IP地址。

    - name: Configure Security Group Rule to open SSH on the VSI
      ibm_is_security_group_rule:
        state: available
        group: "{{ vpc.default_security_group }}"
        direction: inbound
        remote: 59.138.xxx.yyy # <- here
        tcp:
          - port_max: 22
            port_min: 22

进行

现在终于到了执行Playbook的时候了。

# ansible-playbook create.yml
[WARNING]: Unable to parse /ansible/inventory/defaults as an inventory source

[WARNING]: No inventory was parsed, only implicit localhost is available

[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'


PLAY [Create IBM Cloud VPC VSI] ***********************************************************************************

TASK [Gathering Facts] ********************************************************************************************
ok: [localhost]

TASK [Configure VPC] **********************************************************************************************
changed: [localhost]

TASK [Save VPC as fact] *******************************************************************************************
ok: [localhost]

TASK [Configure VPC Subnet] ***************************************************************************************
changed: [localhost]

TASK [Save VPC Subnet as fact] ************************************************************************************
ok: [localhost]

TASK [Configure SSH Key] ******************************************************************************************
changed: [localhost]

TASK [Save SSH Key as fact] ***************************************************************************************
ok: [localhost]

TASK [Retrieve image list] ****************************************************************************************
ok: [localhost]

TASK [Set VM image name/id dictionary fact] ***********************************************************************
ok: [localhost]

TASK [Configure VSI] **********************************************************************************************
changed: [localhost]

TASK [Save VSI as fact] *******************************************************************************************
ok: [localhost]

TASK [Configure Floating IP Address] ******************************************************************************
changed: [localhost]

TASK [Save Floating IP as fact] ***********************************************************************************
ok: [localhost]

TASK [Print Floating IP Address] **********************************************************************************
ok: [localhost] => {
    "msg": "IP Address: 52.117.0.45"
}

TASK [Configure Security Group Rule to open SSH on the VSI] *******************************************************
changed: [localhost]

TASK [Add VSI to Ansible inventory] *******************************************************************************
changed: [localhost]

PLAY [Check Ansible connection to new DEMO VSI] *******************************************************************

TASK [Wait for VSI to become reachable over SSH] ******************************************************************
ok: [52.117.0.45]

PLAY [Check Ansible connection to new DEMO VSI] *******************************************************************

TASK [Gathering Facts] ********************************************************************************************
ok: [52.117.0.45]

TASK [Collect OS information] *************************************************************************************
changed: [52.117.0.45]

TASK [Print OS information] ***************************************************************************************
ok: [52.117.0.45] => {
    "os_info.stdout_lines": [
        "NAME=\"Ubuntu\"",
        "VERSION=\"18.04.2 LTS (Bionic Beaver)\"",
        "ID=ubuntu",
        "ID_LIKE=debian",
        "PRETTY_NAME=\"Ubuntu 18.04.2 LTS\"",
        "VERSION_ID=\"18.04\"",
        "HOME_URL=\"https://www.ubuntu.com/\"",
        "SUPPORT_URL=\"https://help.ubuntu.com/\"",
        "BUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"",
        "PRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"",
        "VERSION_CODENAME=bionic",
        "UBUNTU_CODENAME=bionic"
    ]
}

PLAY RECAP *******************************************************************************************************
52.117.0.45                : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
localhost                  : ok=16   changed=7    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

在Playbook的结尾,我们会登录到生成的用于VPC的虚拟服务器上,提取操作系统信息。

在IBM云门户的https://cloud.ibm.com/vpc-ext/vpcLayout等位置,您可以查看刚创建的VPC等资源,进行确认。

Capture 2020-02-13 13.2<br>9.47.png

你做得很好!非常简单!

有点遗憾的地方

也许是因为发布后不久,所以会有一些令人略感遗憾的地方。

没有幂等性

在第一次执行create.yml后,创建了诸如VPC等资源,并且在完成后,考虑到幂等性验证,我再次执行了create.yml,结果显示如下…

# ansible-playbook create.yml
PLAY [Create IBM Cloud VPC VSI] ***********************************************************************************

TASK [Gathering Facts] ********************************************************************************************
ok: [localhost]

TASK [Configure VPC] **********************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "", "rc": 1, 
"resource": {"_name": "ansible-demo-vpc", "_type": "ibm_is_vpc", "target": 
"ibm_is_vpc.ansible-demo-vpc"}, "stderr": "\nError: {\"errors\":
[{\"code\":\"validation_unique_failed\",\"message\":\"Provided Name 
(ansible-demo-vpc) is not unique\",\"target\":
{\"name\":\"name\",\"type\":\"field\"}}],\"trace\":\"4a01ba51-471b-49e6-
9779-354cd10398b5\"}\n\n  on ibm_is_vpc_ansible-demo-vpc.tf line 1, in 
resource \"ibm_is_vpc\" \"ansible-demo-vpc\":\n   1: resource ibm_is_vpc 
\"ansible-demo-vpc\" {\n\n\n", "stderr_lines": ["", "Error: {\"errors\":
[{\"code\":\"validation_unique_failed\",\"message\":\"Provided Name 
(ansible-demo-vpc) is not unique\",\"target\":
{\"name\":\"name\",\"type\":\"field\"}}],\"trace\":\"4a01ba51-471b-49e6-
9779-354cd10398b5\"}", "", "  on ibm_is_vpc_ansible-demo-vpc.tf line 1, in 
resource \"ibm_is_vpc\" \"ansible-demo-vpc\":", "   1: resource ibm_is_vpc 
\"ansible-demo-vpc\" {", "", ""], "stdout": "ibm_is_vpc.ansible-demo-vpc: 
Creating...\n", "stdout_lines": ["ibm_is_vpc.ansible-demo-vpc: 
Creating..."]}

(見づらいので適当に改行しています)

PLAY RECAP *******************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

由于“提供的名称(ansible-demo-vpc)不是唯一的”,您似乎正在尝试创建另一个同名的VPC,这导致了错误…幂等性…

如果使用when子句来进行自己的实现,可以在某种程度上实现幂等性,但这样几乎没有使用自定义模块的意义…希望将来能在这方面有所期待。

由于「这个收藏与IBM Cloud Provider for Terraform 1.2的发布一同提供。」所以,IBM Cloud Provider for Terraform的改进可能是确保幂等性的困难之一。

未在Ansible Galaxy注册

尽管在这个问题上也有提到,但目前只在GitHub上公开。IBM先生既然已经拥有了Ansible Galaxy的官方仓库,如果能在这里注册并公开,安装就会变得更加简单呢。。。

【2020-02-28 补充】

根据昨天的确认,我们发现在Galaxy上注册的是IBMCLOUD而不是IBM。

我似乎使用了一个相对较新的Ansible模块分发机制,称为Ansible Collection。我已经确认了它可以通过以下命令进行安装。

# ansible-galaxy collection install ibmcloud.ansible_collection
Process install dependency map
Starting collection install process
Installing 'ibmcloud.ansible_collection:1.2.1' to '/root/.ansible/collections/ansible_collections/ibmcloud/ansible_collection'

然而,由于每个模块中调用共同模块的描述在当前时间点上都有错误,因此无法正常运行!例如,ibm_is_images_info模块的第464行有错误,所以无法正常工作。

# 誤: import ansible.module_utils.ibmcloud as ibmcloud

# 正: import ansible_collections.ibmcloud.ansible_collection.plugins.module_utils.ibmcloud as ibmcloud

希望尽快进行修正。

删除资源

好的,最后我们将在 create.yml 中创建的资源进行删除。
由于预先准备的 destroy.yml 并不能正常工作,所以我们需要对其进行以下改良。

(1)为destroy.yml添加内容

- name: Destroy IBM Cloud VPC VSI
  hosts: localhost
  vars_files:   # <- 追加
   - ./vars.yml # <- 追加

  tasks:
    - name: Release Floating IP
      ibm_is_floating_ip:

(2)添加包含所有资源ID的变量文件。

每个资源的ID都需要手动从IBM云门户获取。虽然麻烦,但是没有要求去门户上手动删除。

---
fip:
  id: r006-ae80cf6f-d5cd-44d0-960b-73616b654f58
vsi:
  id: 0737_925c9f40-e0f9-480b-98a1-aee9c77a4db1
ssh_key:
  id: r006-8d77517d-74d1-4b1b-8502-7ca5756a31fb
subnet:
  id: 0737-b7cb766e-c223-4e58-aa17-0e9b21d6a4c1
vpc:
  id: r006-edc0ca50-2d20-47c9-94dc-2327be85e237

如果准备好了,就开始执行。

# ansible-playbook destroy.yml

PLAY [Destroy IBM Cloud VPC VSI] **********************************************************************************

TASK [Gathering Facts] ********************************************************************************************
ok: [localhost]

TASK [Release Floating IP] ****************************************************************************************
ok: [localhost]

TASK [Remove VSI] *************************************************************************************************
ok: [localhost]

TASK [Remove SSH Key] *********************************************************************************************
ok: [localhost]

TASK [Remove VPC Subnet] ******************************************************************************************
ok: [localhost]

TASK [Remove VPC] ************************************************************************************************
ok: [localhost]

PLAY RECAP *******************************************************************************************************
localhost                  : ok=6    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

在IBM Cloud Portal上,记得确认一下确实已经消失了!

总结

我认为虽然它没有保证幂等性,这是一个非常可惜的点,但在刚发布后能如此简单地使用是非常了不起的。

我认为特别麻烦的是,IBM云门户上的门户用户发布是否也可以使用呢?这样在IBM云上的自动化将会更加顺利。我想尝试一些不同的东西。

快乐的自动化!

广告
将在 10 秒后关闭
bannerAds