运维自动化工具Ansible的安装体验
Ansible介绍
Ansible是一个简单的自动化运维管理工具,基于Python语言实现,由Paramiko和PyYAML两个关键模块构建,可用于自动化部署应用、配置、编排task(持续交付、无宕机更新等)。最关键的是Ansible基于SSH协议,无需在被控机上安装客户端代理之类的,使用起来非常之方便。网上搜了一下,Ansible的特点如下:
1.部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作。
2.默认使用SSH(Secure Shell)协议对设备进行管理,无需安装客户端。
3.去中心化,主从集中化管理。
4.配置简单、功能强大、扩展性强。
5.支持API及自定义模块,可通过Python轻松扩展。
6.过Playbooks来定制强大的配置、状态管理。
7.对云计算平台、大数据都有很好的支持。
8.提供一个功能强大、操作性强的 Web 管理界面和 REST API 接口 ---- AWX 平台。
9.幂等性:一种操作重复多次结果相同
Ansible中文权威指南:http://www.ansible.com.cn/
Ansible主控端配置
安装Ansible
环境要求
机器上安装了 Python 2.6 或 Python 2.7 (windows系统不可以做控制主机),都可以运行Ansible.
安装方法
apt-get安装:apt-get install ansible
其他安装方式:http://www.ansible.com.cn/docs/intro_installation.html#installing-the-control-machine
Ansible配置
秘钥认证
>ssh-keygen #生成秘钥 >ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@10.211.55.7 #将公钥写入被管理的机器
添加被控机
>vi /etc/ansible/hosts
支持主机分组,如:
[client] 10.211.55.6 10.211.55.7
支持添加多个分组,支持定义别名,主机名支持正则表达式等,这里就不详细列举了。
发送控制指令测试
例如,批量执行查看硬盘使用情况的df命令:
>ansible client -m command -a "df"
执行返回结果如下:
root@macOS-debian:~# ansible client -m command -a "df" 10.211.55.7 | SUCCESS | rc=0 >> Filesystem 1K-blocks Used Available Use% Mounted on udev 2012044 0 2012044 0% /dev tmpfs 404640 5548 399092 2% /run /dev/sda1 64760428 14552152 46888932 24% / tmpfs 2023180 0 2023180 0% /dev/shm tmpfs 5120 0 5120 0% /run/lock tmpfs 2023180 0 2023180 0% /sys/fs/cgroup tmpfs 404636 0 404636 0% /run/user/0 10.211.55.6 | SUCCESS | rc=0 >> Filesystem 1K-blocks Used Available Use% Mounted on udev 496744 0 496744 0% /dev tmpfs 101576 10744 90832 11% /run /dev/sda1 64760428 3735984 57705100 7% / tmpfs 507876 0 507876 0% /dev/shm tmpfs 5120 0 5120 0% /run/lock tmpfs 507876 0 507876 0% /sys/fs/cgroup tmpfs 101572 0 101572 0% /run/user/0 overlay 64760428 3735984 57705100 7% /var/lib/docker/overlay2/e4373909ceacde98e04d2e594add0c4fc5311e9df268eb7e392adf5c7191b3a3/merged shm 65536 0 65536 0% /var/lib/docker/containers/535cdb6e434e5f845545a6c371edc283ee7fbade453debd86c7209106beaafe1/mounts/shm
ansible模块
ansible内置了非常多的模块,方便我们使用,具体的可以查阅官方文档:http://docs.ansible.com/ansible/latest/list_of_all_modules.html或http://www.ansible.com.cn/docs/modules.html
Ansible-playbook
playbook文件格式为yaml语法,下面是一个简单的安装golang环境的例子!
之前在网络看到一篇文章里推荐的playbook脚本目录结构如下:
root@macOS-debian:/etc/ansible# tree . . ├── ansible.cfg ├── hosts ├── install-golang.yml └── roles └── install-golang ├── files │ ├── go1.10.1.linux-amd64.tar.gz │ ├── install-golang.sh │ └── set_variable.sh ├── tasks │ └── main.yml ├── templates └── vars └── main.yml
## file目录:用于存放将要拷贝到远程主机的安装包等
## tasks目录:将要执行的所有任务,如果比较复杂,可以单独定义不同的任务,最后在 main.yml 文件中引用即可
## templates目录:模板目录,这里存放着一些可变的文件,即:每台主机上的这些文件中的内容都不完全相同
## vars目录:用于存放变量
install-golang.yml文件内容为:
--- - hosts: client roles: - install-golang
roles/install-golang/tasks/main.yml文件内容为:
--- - name: copy file go{{go_version}}.tar.gz copy: src=go{{go_version}}.tar.gz dest=/opt/go{{go_version}}.tar.gz owner=root group=root - name: unzip file shell: tar -C /usr/local -xzf /opt/go{{go_version}}.tar.gz - name: mkdir GOPATH shell: mkdir -p {{gopath}} - name: set variable lineinfile: dest=/etc/profile regexp="^export GOROOT=" line="export GOROOT=/usr/local/go" - name: set varialbe lineinfile: dest=/etc/profile regexp="^export GOPATH=" line="export GOPATH={{gopath}}" - name: set varialbe lineinfile: dest=/etc/profile regexp="^export PATH=\$PATH:\$GOROOT" line="export PATH=$PATH:$GOROOT/bin:$GOPATH/bin"
roles/install-golang/vars/main.yml文件内容为:
go_version: 1.10.1.linux-amd64 gopath: /data/go
执行的playbook方式为:ansible-playbook /etc/ansible/install-golang.yml