使用Vagrant + Ansible 来自动化构建环境和执行基准测试(IDCF云).

1. 概括

这是关于云服务器服务(IaaS)性能比较·磁盘测试的额外篇章。

使用Vagrant在云上创建实例,并使用Ansible自动化应用程序的安装、执行和结果获取。本次将整理关于IDCF云平台的相关文章。

1.1 执行环境(主机侧)

    • OS : Linux AMI release 2017.03

 

    • Vagrant : 1.9.4

 

    Ansible : ansible 2.3.0.0

1.2 目标构建

    • Iaas: IDCFクラウド

 

    • OS:CentOS 7.3

 

    インストール及び実行するアプリケーション: fio

2. 前期准备

2.1. 在Vagrant中安装dotenv插件

为了在Vagrant上能够读取.env文件中的变量,我们需要先安装dotenv插件。

请在本地的 Vagrant 中安装 dotenv 插件。

参考: 尝试使用dotenv在不同环境中更改Vagrantfile配置项的值。

2.3 在Vagrant上安装CloudStack的插件

为了处理Vagrant到IDCF云实例的连接,需要安装CloudStack的插件。安装时要指定版本。

使用Vagrant命令安装vagrant-cloudstack插件,插件版本为1.3.0。

3. Vagrant的设置。

3.1 Vagrantfile 的文件

创建 Vagrantfile(首字母大写,无扩展名)作为 Vagrant 的配置文件。
在下面的示例中,我们使用 CloudStack 在 IDCF 云上创建虚拟服务器,并在完成后调用 Ansible。

Dotenv.load

Vagrant.configure(2) do |config|
  config.vm.box = "dummy"

  # CloudStack Setting For IDCF Cloud
  config.vm.provider :cloudstack do |cloudstack, override|

    # Dummy Box
    override.vm.box = "dummy"
    override.vm.box_url = "https://github.com/klarna/vagrant-cloudstack/raw/master/dummy.box"

    # API Parameters
    cloudstack.host                  = "compute.jp-east-2.idcfcloud.com"
    cloudstack.path                  = "/client/api"
    cloudstack.port                  = "443"
    cloudstack.scheme                = "https"
    cloudstack.api_key               = "#{ENV['CLOUDSTACK_API_KEY']}"
    cloudstack.secret_key            = "#{ENV['CLOUDSTACK_SECRET_KEY']}"
    expunge_on_destroy               = true

    # Virtual Machine Settings
    cloudstack.display_name          = "Vagrant-CentOS-7"
    cloudstack.template_name         = "CentOS 7.3 64-bit"
    cloudstack.zone_name             = "#{ENV['CLOUDSTACK_ZONE_NAME']}"
    cloudstack.service_offering_name = "#{ENV['COUDSTACK_SERVICE_OFFERING_NAME']}"

    # Network Settings
    cloudstack.pf_ip_address_id      = "#{ENV['CLOUDSTACK_PF_IP_ADDRESS_ID']}"
    cloudstack.pf_public_port        = "2201"
    cloudstack.keypair               = "#{ENV['CLOUDSTACK_SSH_KEYPAIR']}"
    override.ssh.private_key_path    = "#{ENV['VAGRANT_SSH_PRIVATE_KEY']}"
    override.ssh.username            = "#{ENV['VAGRANT_SSH_USERNAME']}"

    cloudstack.instance_ready_timeout = 1800
  end

  #
  # Run Ansible from the Vagrant Host
  #
  config.vm.provision "ansible" do |ansible|
    ansible.playbook                 = "site.yaml"
    ansible.inventory_path           = "hosts"
    ansible.limit = 'all'
    ansible.verbose = true
  end

end

CloudStack参考:
使用Vagrant在CloudStack上构建环境
尝试使用vagrant-cloudstack

Ansible调用参考:
Vagrant官方:Ansible Provisioner

3.2 环境变量配置文件。

将认证信息等变量写入名为.env的文件中,并将.env文件保存在与Vagrantfile相同的位置。

CLOUDSTACK_API_KEY               = '**********'
CLOUDSTACK_SECRET_KEY            = '**********'
CLOUDSTACK_ZONE_NAME             = 'lux'
COUDSTACK_SERVICE_OFFERING_NAME  = 'light.S1'
CLOUDSTACK_PF_IP_ADDRESS_ID      = '**********'
CLOUDSTACK_SSH_KEYPAIR           = '**********'
VAGRANT_SSH_USERNAME             = 'root'
VAGRANT_SSH_PRIVATE_KEY          = '~/.ssh/id_rsa'
ANSIBLE_PLAYBOOK                 = 'site.yml'
ANSIBLE_INVENTORY_PATH           = 'hosts'

4. Ansible的配置

4.1 主机文件

我会把文件放在Vagrantfile中指定的ansible.inventory_path位置上。在这个例子中,它与Vagrantfile在同一目录层级下。

***.***.**.***:2201
    • Vagrantで作成する仮想マシンのIPアドレスを指定します。

 

    Vagrantfileの中の cloudstack.pf_public_port でパブリックポートを2201 に変更しているので、IPアドレスの後ろにポート番号を指定します。未指定の場合Ansibleはデフォルトの 22 でSSH接続するので、接続に失敗してしまいます。

参考资料:Ansible官方清单或库存

4.2 游戏策略

将希望自动构建的内容编写在Ansible的Playbook(扩展名.yml)中。

4.2.1 职责

Ansible可以根据角色将Playbook分开编写。如果按照固定规则构建roles目录,它会自动包含到Playbook中。通过将Role分离为执行内容的不同部分,可以提高可读性和可重用性。
这次我们的文件布局包括Vagrantfile,如下所示。

hosts
roles/
  iops/ # roleの名前(任意)
    files/  # role内で使用するファイルを配置
      Rand-Read-4k.fio
      Rand-ReadWrite-4k.fio
      Rand-Write-4k.fio
    tasks/ # roleで実行されるtaskの定義
      main.yml
    vars/  # role内で使用する変数定義
      main.yml
site.yml  # Vagrantから呼ばれるPlaybook
Vagrantfile

最初的Playbook被称为4.2.2

在Vagrantfile中指定的ansible.playbook将首先执行。在这个例子中,该Playbook名为site.yaml,与Vagrantfile位于同一层级。

该Playbook中调用了名为iops的角色。

---
- hosts: servers
  become: true
  roles:
    - iops

4.2.3 角色的操作手册(tasks/main.yml)

这个Playbook是从site.yaml中调用的。
这次我们将进行IOPS测试,并执行以下步骤。

    • fioをインストール

 

    • fioの計測パラメータファイルをリモートに送信

 

    • fioを実行

 

    結果ファイルを受信
---
    - name: install epel 
      yum: 
        name: epel-release 
        state: installed
    - name: install fio
      yum: 
        name: fio 
        state: installed

    - name: copy Rand-Read-4k.fio
      copy: 
        src: Rand-Read-4k.fio
        dest: "{{ dest_dir }}"
    - name: copy Rand-ReadWrite-4k.fio
      copy: 
        src: Rand-ReadWrite-4k.fio
        dest: "{{ dest_dir }}"
    - name: copy Rand-Write-4k.fio
      copy: 
        src: Rand-Write-4k.fio
        dest: "{{ dest_dir }}"

    - name: run fio Rand-Read-4k
      command: "fio -f /tmp/Rand-Read-4k.fio -filename=/tmp/fio_test -output Rand-Read-4k.result"
    - name: run fio Rand-ReadWrite-4k
      command: "fio -f /tmp/Rand-ReadWrite-4k.fio -filename=/tmp/fio_test -output Rand-ReadWrite-4k.result"
    - name: run fio Rand-Write-4k
      command: "fio -f /tmp/Rand-ReadWrite-4k.fio -filename=/tmp/fio_test -output Rand-Write-4k.result"

    - name: search files
      find: 
        paths: "/root"
        patterns: "*.result"   
      register: files_to_copy

    - name: receive result
      fetch:
        src: "{{ item.path }}"
        dest: "{{ receive_dir }}"
        flat: yes
      with_items: "{{ files_to_copy.files }}"

4.2.4 变量定义(vars/main.yml)

使用每个角色Playbook所需的变量进行定义。

dest_dir: /tmp/
receive_dir: ./results/

4.2.5 验证Playbook的测试

请确认一下,这样就完成了Ansible的配置,看看有没有错误。

通过在ansible命令后加上”–syntax-check”选项来执行,可以检查Playbook的语法。

$ ansible-playbook site.yml --syntax-check

■ 模拟运行:
当在ansible命令中添加”–check”选项并执行时,不会对目标进行任何更改,只会确认应用Playbook后可能发生的变化。

$ ansible-playbook site.yml --check

■ 冗长模式:
如果实例已启动,也可以通过仅使用Ansible来执行并确认。使用ansible命令加上”-v(–verbose)”选项执行时,可以查看详细的输出。指定”-vvv”则会有更详细的输出。

$ ansible-playbook -i hosts site.yml --private-key=~/.ssh/id_rsa -u root -v

如果在前面提到的Vagrantfile中的Ansible调用部分设置ansible.verbose = true,那么就相当于指定了冗长模式。

■ ansible-lint:
ansible-lint是一个检查Playbook的工具,虽然不是Ansible的功能,但它需要单独安装,并且可以指出Playbook的改进点。
使用方法如下:

$ ansible-lint site.yml

参考:
Ansible:进一步掌握Playbook
Ansible官方:检查模式(”干燥运行”)
GitHub – willthames/ansible-lint:Ansible的最佳实践检查器

5. 运行

让我们从Vagrant中尝试运行。
移动到Vagrantfile所在的位置并执行以下命令。

请运行vagrant启动命令。

如果在4.2.4的变量定义中指定的receive_dir位置内包含结果文件,则表示成功。

额外的东西。Vagrant的基本命令。

    • 起動: $ vagrant up

停止: $ vagrant halt

削除: $ vagrant destroy

再読込: $ vagrant reload ※–provisonでプロビジョニングも実施
プロビジョンだけ実施: $ vagrant provision

bannerAds