https://blog.csdn.net/du_wood/article/details/84915731
一、简介:
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
$ 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 ansible_connection=ssh ansible_ssh_user=app
注:127.0.0.1是被管理主机的ip,由于我只有一台主机,所以只好配置成自己来实验了!ansible_ssh_user为连接到被管理主机所使用的用户。
测试一下:
- ansible all -m ping --ask-pass -c paramiko
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"
- }
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
$ 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
- $ ansible all -m shell -a "hostname" --ask-pass -i ~/ansible_hosts
$ ansible all -m shell -a "hostname" --ask-pass -i ~/ansible_hosts
- $ echo 'export ANSIBLE_HOSTS=~/ansible_hosts' >> ~/.bashrc #加入环境变量
- $ source ~/.bashrc #使环境变量立即生效
$ echo 'export ANSIBLE_HOSTS=~/ansible_hosts' >> ~/.bashrc #加入环境变量 $ source ~/.bashrc #使环境变量立即生效
- ansible all -m shell -a "hostname" --ask-pass
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
127.0.0.1 ansible_connection=ssh ansible_ssh_user=app ansible_ssh_pass=123456
- $ #生成公钥
- $ 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
$ #生成公钥 $ 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
- $ #传公钥到被管理主机
- $ 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登录
$ #传公钥到被管理主机 $ 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登录
- $ #允许root用户使用ssh登录
- $ sudo vi /etc/ssh/sshd_config
- $ #修改配置内容:PermitRootLogin yes
- $ service sshd restart #重启ssh生效
$ #允许root用户使用ssh登录 $ sudo vi /etc/ssh/sshd_config $ #修改配置内容:PermitRootLogin yes $ service sshd restart #重启ssh生效
- $ ansible all -m shell -a "hostname"
$ ansible all -m shell -a "hostname"
原文地址:https://blog.csdn.net/weixin_42408510/article/details/88393194
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。