fenghzy 发表于 2018-1-3 07:24:31

【ansible】通过ansible方式读取计算节点NUMA信息的方法

  在yardstick的自动化脚本开发过程有一种重要场景,就是要登陆计算节点来读取计算节点的信息或者验证某些信息,一般来讲,假如源节点(要登陆计算节点的端点,譬如笔记本)在计算节点的云内,比如源节点就是计算节点上的虚拟机,这时直接就可以ssh登陆。但是,假如源节点在云外,只能通过openstack的API地址访问云,那这时候计算节点的管理IP是不对外的,我们只能通过先登陆控制节点,然后再登陆计算节点的方式来达到目的。
https://images2017.cnblogs.com/blog/1198753/201708/1198753-20170831120622015-354233508.png
  Openstack网络示意图
  大多数的openstack的网络跟上面的示意图类似,基本分为四个网络,这里暂且不讨论存储网络,也就还剩三个网络:管理网络1(红色)、业务网络(蓝色)和管理网络2(紫色),红色网络是各个节点间进行通信的网络,蓝色网络是虚拟机的网络,紫色网络是openstack对外的网络,外部要访问openstack内部只能通过紫色网络。要申明一点,很多时候,openstack的控制节点和网络节点合一了,即只有控制节点和计算节点,这里把网络节点看成是控制节点就行了,然后多个控制节点通过一个公共的浮动IP对外提供服务。
  由于上面的原因,当我们使用node类型的context也即ansible的方式来实现从docker节点(yardstick运行在docker上)跳转到计算节点并读取计算节点信息时就要用到跳板ansible的跳转机的方法(不用)。
  说明:
  1)用ansible的缺点是,当跳转到compute节点上时,compute包括的所有的host都会把compute的action执行一遍,这会耗用一定的资源,当host的数量很大时,下面介绍的方法不适用,但对于自动化验证来说,host的数量少,是可以用后面介绍的方法的。
  2)除了使用完全都用node的context的方法外,还可以用context为heat,然后从虚拟机通过两次ssh的方式登陆计算节点(该方法正在调试,调试完成会共享出来);或者用混合的方式,即一个testcase的yaml文件既用node类型的context也用heat类型的context。
  3)下面介绍的方法还用了ansible框架的功能,即通过ansible框架,在网络可达的基础上,源主机(ansible框架代码所在的主机)是可以ssh直接登录到inventory.ini文件中的各个host上去的,不需要跳板机。之所以用跳板机是由于上面图的openstack的网络架构的原因。
  4)Ansible的一些说明:Ansible 可同时操作属于一个组的多台主机,组和主机之间的关系通过 inventory 文件配置. 默认的文件路径为 /etc/ansible/hosts

方法分为两大步骤:

1、配置跳板机的方式
  1)配置ssh的跳板机的方式。该配置文件(位于docker上)是说,去所有的host主机都会通过192.168.115.222进行跳转。
  

root@88050931d062:~# more ssh_config  

  
GSSAPIAuthentication no
  
Host *
  ProxyCommand ssh root@192.168.115.222 -W %h:%p
  

  

root@88050931d062:~# pwd  
/root
  

  


2)在dorcker上的ansible.cfg文件配置SSH的相关选项,特别是ssh_connect
  

root@88050931d062:/home/opnfv/repos/yardstick/ansible# more ansible.cfg  

  

  
host_key_checking = False
  
keep_remote_files = True
  
remote_tmp = /tmp/.ansible/tmp
  

  

  
ssh_args = -o ControlPersist=15m -F /root/ssh_config -q
  
scp_if_ssh = True
  

  


2、在compute的action部分增加when语句,我这个文档是把roles和action合一了。
  具体如下(红色标注):
  

- hosts: compute  tasks:
  - name: get name of current host
  shell:
  source /etc/yardstick/openstack.creds;
  echo $HOSTNAME
  args:
  executable: /bin/bash
  register: computenode2
  

  - debug: var=computenode2
  

  - name: get host of VM created
  shell:
  source /etc/yardstick/openstack.creds;
  nova show yardstick-vm |grep OS-EXT-SRV-ATTR:hypervisor_hostname | awk '{print $4}'
  args:
  executable: /bin/bash
  register: computenode1
  

  - debug: var=computenode1
  

  - name: the node is not right
  when: computenode1.stdout_lines!=computenode2.stdout_lines
  shell: echo "The vm is not on the" {{item}}
  with_items:
  - '{{computenode2.stdout_lines}}'
  register: display
  

  - debug: var=display
  

  - name: show NUMA info
  when: computenode1.stdout_lines==computenode2.stdout_lines
  shell:sleep 10; numastat -p qemu
  args:
  executable: /bin/bash
  register: cmd
  

  - debug: var=cmd.stdout
  

  附件:整个yaml文件的内容。
  

---  
- hosts: localhost
  

  tasks:
  - name: create flavor yardstick-pinned-flavor
  

  shell:
  source /etc/yardstick/openstack.creds;
  nova flavor-create 'yardstick-pinned-flavor' $(cat /proc/sys/kernel/random/uuid) 512 2 2;
  nova flavor-list
  

  args:
  executable: /bin/bash
  

  register: cmd
  

  - debug: var=cmd.stdout_lines
  

  - name: set yardstick-pinned-flavor property
  

  shell:
  source /etc/yardstick/openstack.creds;
  openstack flavor set --property hw:cpu_policy=dedicated yardstick-pinned-flavor;
  openstack flavor set --property hw:numa_nodes=1 yardstick-pinned-flavor;
  openstack flavor show yardstick-pinned-flavor;
  

  args:
  executable: /bin/bash
  

  register: cmd
  

  - debug: var=cmd.stdout_lines
  

  - name: create VM
  

  shell:
  source /etc/yardstick/openstack.creds;
  openstack server create --flavor yardstick-pinned-flavor --image cirros-0.3.5 \
  --network=ext-net yardstick-vm
  

  args:
  executable: /bin/bash
  

  register: cmd
  

  - debug: var=cmd.stdout_lines
  

  
- hosts: compute
  

  tasks:
  

  - name: get name of current host
  

  shell:
  source /etc/yardstick/openstack.creds;
  echo $HOSTNAME
  

  args:
  executable: /bin/bash
  

  register: computenode2
  

  - debug: var=computenode2
  

  - name: get host of VM created
  

  shell:
  source /etc/yardstick/openstack.creds;
  nova show yardstick-vm |grep OS-EXT-SRV-ATTR:hypervisor_hostname | awk '{print $4}'
  

  args:
  executable: /bin/bash
  

  register: computenode1
  

  - debug: var=computenode1
  

  - name: the node is not right
  

  when: computenode1.stdout_lines!=computenode2.stdout_lines
  

  shell: echo "The vm is not on the" {{item}}
  

  with_items:
  

  - '{{computenode2.stdout_lines}}'
  

  register: display
  

  - debug: var=display
  

  - name: show NUMA info
  

  when: computenode1.stdout_lines==computenode2.stdout_lines
  

  shell:sleep 10; numastat -p qemu
  

  args:
  

  executable: /bin/bash
  

  register: cmd
  

  - debug: var=cmd.stdout
  

  

  

  
- hosts: localhost
  

  tasks:
  

  - name: delete VM
  

  shell:
  

  source /etc/yardstick/openstack.creds;
  openstack server delete yardstick-vm
  

  args:
  

  executable: /bin/bash
  

  register: cmd
  

  

  - debug: var=cmd.stdout_lines
  

  - name: delete flavor yardstick-pinned-flavor
  

  shell:
  

  source /etc/yardstick/openstack.creds;
  nova flavor-delete 'yardstick-pinned-flavor';
  

  args:
  

  executable: /bin/bash
  

  register: cmd
  

  

  

  - debug: var=cmd.stdout_lines
  
页: [1]
查看完整版本: 【ansible】通过ansible方式读取计算节点NUMA信息的方法