使用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-cloudstackAnsible调用参考:
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