自动化运维工具Ansible入门笔记(一)
一、简介:
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
Ansible默认通过 SSH 协议管理机器.安装Ansible之后,不需要启动或运行一个后台进程,或是添加一个数据库.只要在一台电脑(可以是一台笔记本)上安装好,就可以通过这台电脑管理一组远程的机器.在远程被管理的机器上,不需要安装运行任何软件,因此升级Ansible版本不会有太多问题.
Ansible is an IT automation tool. It can configure systems, deploy software, and orchestrate more advanced IT tasks such as continuous deployments or zero downtime rolling updates.
Ansible’s main goals are simplicity and ease-of-use. It also has a strong focus on security and reliability, featuring a minimum of moving parts, usage of OpenSSH for transport (with an accelerated socket mode and pull modes as alternatives), and a language that is designed around auditability by humans–even those not familiar with the program.
好吧!以上的内容完全是拼凑来的,但足以描述ansible的特性了。ansible的特点就是不需要安装客户端,只需一台主机安装ansible和相关组件即可,ansible默认会通过OpenSSH与被管理主机通讯,并完成一系列命令。当然如果主机无法使用OpenSSH,ansible也提供了其他的通讯方式,例如python的pramamiko模块(ansible是使用py开发的)。仔细一想貌似原理并不复杂,使用bash中的ssh就可以实现了,但ansible的功能远不止这么简单,他只是提供一个框架,真正强大的是他可拓展的模块们以及ansible的衍生产品。(主要模块上边有介绍)
ansible的工作流程大致如下:
想要掌握一个工具,最快的办法就是使用它,从搭建环境开始↓
二、安装
官网上提供了多种安装方式:http://docs.ansible.com/ansible/latest/intro_installation.html ,包括使用yum、apt、Python的pip以及源码安装等。笔者使用Ubuntu系统做测试,所以为了方便直接选择apt了:
$ sudo apt-get update $ sudo apt-get install software-properties-common $ sudo apt-add-repository ppa:ansible/ansible $ sudo apt-get update $ sudo apt-get install ansible
注意:ansible依赖Python运行环境,所以在安装ansible之前,需要安装2.7以上版本的Python。
安装好之后,打开/etc/ansible/hosts文件,该文件是配置被管理主机的,ansible默认会在/etc/ansible/hosts文件中查找被管理主机,当然也可以使用 -i 或定义环境变量的方式自定义。
hosts中有好多被注释掉的配置,这些注释简单介绍了该文件的配置方法,我们先不管,直接在该文件最底部加一行:
127.0.0.1 ansible_connection=ssh ansible_ssh_user=app
注:127.0.0.1是被管理主机的ip,由于我只有一台主机,所以只好配置成自己来实验了!ansible_ssh_user为连接到被管理主机所使用的用户。
测试一下:
ansible all -m ping --ask-pass -c paramiko
注:ping模块用于测试连通性,( -m用于指定用哪个模块,--ask-pass 询问密码,-c paramiko 代替sshpass )。由于我的机器没安装sshpass ,所以使用Python的paramiko代替了。all指定被管理主机群,all表示所有hosts中配置的主机都要执行这个命令。
输入密码后,结果如下:
SSH password: 127.0.0.1 | SUCCESS => { "changed": false, "ping": "pong" }
表示执行成功了。
三、简单配置:
- 自定义hosts文件,现在我不想使用/etc/ansible/hosts文件配置被管理主机了,我要在$home/目录下自定义一个文件作为hosts:
$ cd ~ $ touch ansible_hosts $ echo '[appServer]' >>ansible_hosts $ echo '127.0.0.1 ansible_connection=ssh ansible_ssh_user=app' >>ansible_hosts $ cat ansible_hosts [appServer] 127.0.0.1 ansible_connection=ssh ansible_ssh_user=app
为方便测试,我们先将/etc/ansible/hosts中配置的主机信息注释掉,使用-i指定该文件为hosts文件:$ ansible all -m shell -a "hostname" --ask-pass -i ~/ansible_hosts
命令执行成功,但是每次都要-i太麻烦了,我们现在配置ANSIBLE_HOSTS环境变量即可解决:$ echo 'export ANSIBLE_HOSTS=~/ansible_hosts' >> ~/.bashrc #加入环境变量 $ source ~/.bashrc #使环境变量立即生效
现在不使用-i了:ansible all -m shell -a "hostname" --ask-pass
执行成功。 - 使用--ask-pass每次都要输入密码,太麻烦了,当然我们可以使用ansible_ssh_pass把密码配置进hosts文件中,如下,但是这种存储明文密码的做法并不推荐。
127.0.0.1 ansible_connection=ssh ansible_ssh_user=app ansible_ssh_pass=123456
我们通常的做法是使用公钥登录被管理主机,ansible提供了秘钥管理模块:$ #生成公钥 $ ssh-keygen -t rsa $ #使用ssh秘钥管理模块将公钥写入主机 $ ansible all -m authorized_key -a "user=admin key='{{ lookup('file', '/servers/.ssh/id_rsa.pub') }}' path=/servers/.ssh/authorized_keys manage_dir=no" --ask-pass -c paramiko
或者我们可以使用文件模块,将秘钥文件传输到被管理主机,再使用shell写入:$ #传公钥到被管理主机 $ ansible all -m copy -a "src=/servers/.ssh/id_rsa.pub dest=/tmp/id_rsa.pub" --ask-pass -c paramiko $ #将公钥写入被管理主机 $ ansible all -m shell -a "cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys" --ask-pass -c paramiko -u root #需要启动root用户ssh登录
注:-u 指定登录用户,注意若要使用root用户登录,需要先开启root用户的ssh登录权限,若未开通方法如下:$ #允许root用户使用ssh登录 $ sudo vi /etc/ssh/sshd_config $ #修改配置内容:PermitRootLogin yes $ service sshd restart #重启ssh生效
验证一下:$ ansible all -m shell -a "hostname"
不用输入密码,即可执行成功!
本章先写到这里!
下一篇: 150行代码写爬虫(一)