Ansible 实践

最近在思考如何将团队里的所有的虚拟机都很好的管理并监控起来,但是由于我们的虚拟机的操作系统繁多,包括 Windows, Linux, AIX, HP-UX, Solaris SPARC 和 Solaris x86. 到底选择哪种方式来管理比较好呢?这需要结合具体场景来考虑。

Ansible 和其他工具的对比

这里有一个关于 Chef,Puppet,Ansible 和 Saltstack 的对比文章

https://www.edureka.co/blog/chef-vs-puppet-vs-ansible-vs-saltstack/

选择合适的工具

仅管理 Windows 和 Linux

如果你的虚拟机没有这么多平台,只是 Windows 和 Linux,假如你已经有了 VMware vSphere 来管理了,那么可以通过 VMware vSphere API 来查看这些机器的状态。

这里是 VMware 官方的 API Library 供使用:

管理多个操作系统

如果你和我的情况一下,想监控很多个操作操作系统,那么就只能通过 ssh 来登录到每一台机器上去查看,比如执行 uptime 等命令。可以写 shell 脚本来完成这些登录、检测等操作。

另外就是使用 Ansible 的 Playbook。Playbook 里描述了你要做的操作,这是一个权衡,学习 Ansible 的 Playbook 需要花些时间的。

如果想了解下 Ansible 那么可以试试 Ansible Playbook。以下是我使用 Ansible 做了一些练习。

Playbook结构

+- vars
| +- vars.yml
| +- ...
+- hosts # save all hosts you want to monitor
+- run.yml # ansible executable file

Playbook具体代码

vars/vars.yml

---
# system
ip: "{{ ansible_default_ipv4['address'] }}"
host_name: "{{ ansible_hostname }}"
os: "{{ ansible_distribution }}"
version: "{{ ansible_distribution_version }}"
total_mb: "{{ ansible_memtotal_mb }}"
vcpus: "{{ ansible_processor_vcpus }}"

hosts

[unix-vm]
aix ansible_host=walbld01.dev.company.com ansible_user=test ansible_become_pass=test
hp-ux ansible_host=walbld04.dev.company.com ansible_user=test ansible_become_pass=test
linux ansible_host=walbld05.dev.company.com ansible_user=test ansible_become_pass=test

[win-vm]
win-bld02 ansible_host=walbld02.dev.company.com ansible_user=Administrator ansible_password=admin ansible_port=5985 ansible_connection=winrm ansible_winrm_server_cert_validation=ignore

[other-vm]
solaris ansible_host=walbld07.dev.company.com ansible_user=test ansible_become_pass=test
win-udb03 ansible_host=walbld03.dev.company.com ansible_user=administrator ansible_become_pass=admin

run.yml

---
# this playbook is simple test
- name: "get unix build machine info"
hosts: unix-vm
gather_facts: True

tasks:
- name: get uname, hostname and uptime
shell: "uname && hostname && uptime"
register: output
- debug: var=output['stdout_lines']

- name: "get windows build machine os info"
hosts: win-vm
gather_facts: True

tasks:
- debug: var=hostvars['win-bld02'].ansible_facts.hostname
- debug: var=hostvars['win-bld02'].ansible_distribution

如何执行

首先需要安装了 ansible,然后执行

# run with playbook
ansible-playbook -i hosts run.yml

注:上面的代码是脱敏过的,需要根据你的环境进行调整才能执行成功。

Ansible TroubleShotting

"msg": "winrm or requests is not installed: No module named winrm"

Need install pywinrm on your master server.

“msg”: “plaintext: auth method plaintext requires a password”

when I run ansible mywin -i hosts -m win_ping -vvv, I notice the output used Python2.7, so I install pywinrm with command sudo pip2 install pywinrm, then my problem was resolved.

mywin | UNREACHABLE! => {
"changed": false,
"msg": "plaintext: auth method plaintext requires a password",
"unreachable": true
}

Result: You should be using ansible_password and not ansible_pass. link