Ansible是Red Hat公司使用python研发的开源的自动化运维工具,类似于saltstack和Puppet这样老牌的自动化运维工具。
ansible作为一个后起之秀,在发布的短时间内迅速崛起,超越了大部分老牌的自动化运维工具,其中就包括了Saltstack和Puppet,能获得这样成绩的原因,有一个不同和优点是我们不需要在节点中安装任何客户端。它使用SSH来和节点进行通信。所以只需要被管理节点具备SSH服务以及python即可,无需任何多余操作就可实现自动化管理,而管理节点只需要安装Ansible工具,以及python,openssl即可。
总的来说:Ansible是一个部署一群远程主机的工具;Ansible通过SSH协议实现远程节点和管理节点之间的通信。理论上说,只要管理员通过ssh登录到一台远程主机上能做的操作,Ansible都可以做到。Ansible是python开发的,故依赖一些python库和组件,如:paramiko,PyYaml和jinja三个关键组件;
https://www.ansible.com/
此名取自 Ansible 作者最喜爱的《安德的游戏》小说,而这部小说更被后人改编成电影 -《战争游戏》
ansible系统由管理节点和被管理节点组成,Ansible 在管理节点将 Ansible 模块通过SSH 协议推送到被管理端执行,执行完之后自动删除,可以使用 SVN、GIT 等来管理自定义模块及编
由上图可以看到ansible的组成是由5个部分组成的
剧本:playbooks
Ansible: ansible的核心程序
Modules:包括 Ansible 自带的核心模块及自定义模块。
Core Modules:Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Inventory中的主机,就可以完成管理主机。
Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。
Plugins:模块功能补充,通过插件来实现记录日志,发送邮件或其他功能。
Connectior Plugins:连接插件, ansible基于连接插件连接到各个主机上,默认是使用ssh。
Playbooks:剧本,YAML格式文件。多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能定义,即实现自动化部署文件。
Host Inventory: 记录由Ansible管理的主机信息,包括端口、密码、ip等。 [ˈɪnvəntri] 清单。
右边绿色部分是被管理的主机(虚拟机,物理机,云主机等),从以上架构图中可以看出ansible是由主机清单,playbook以及各模块插件组成。
简单的说就是,用户(管理员)通过ansible的主机清单配置或Playbook配置(一组任务),调用ansible的各种模块及参数来对清单中的主机进行统一管理。
ansible执行自动化任务,分为两种执行方式:
1.ad-hoc:即ansible命令,命令行界面,单条命令的批量执行,称之为ad-hoc。这种方式,主要用来进行功能测试,或者是简单的应用部署
2.playbook:Playbook方式(剧本方式),从字面意思就可以知道,我们的剧本方式是提前设置好内,进行剧本的演示。即把多个想要执行的任务放到一个playbook中,当然多个任务在事物逻辑上最好是有上下联系的。通过多个任务可以完成一个总体的目标,这就是playbook。Playbook方式适用于大型自动化部署应用
部署简单, 只需要在管理主机上部署ansible环境,被管理端上只要求安装ssh和python 2.5以上版本,这个对于类unix系统来说相当与无需配置。
1、部署简单,只需在管理端部署Ansible环境,被管理端无需做任何操作,即不需要安装agent
2、默认使用SSH协议对设备进行管理
3、易读的语法,基于yaml语法编写playbook
4、模块化设计,调用特定的模块来完成特定任务
5、基于Python语言实现,由Paramiko(python的一个可并发连接ssh主机功能库), PyYAML和Jinja2(模板化)三个关键模块实现。支持API(供第三方程序调用的应用程序编程接口(API))及自定义模块,可通过Python轻松扩展
6、支持playbook剧本,连续任务按先后设置顺序完成。通过Playbooks来定制强大的配置、状态管理
7、幂等性,一个任务执行一遍和执行n遍效果一样,不会因为重复执行带来意外情况。意味着在同一台服务器上多次执行同一个playbook是安全的
8、对云计算平台、大数据都有很好的支持
注:运行ansible时,需要关闭SElinux,或者让SELinux放行Ansible的操作
[root@cong11 ~]# setenforce 0 #临时关闭selinux
参考地址:http://mirrors.aliyun.com
[root@cong11 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
Ansible软件默认不在centos的光盘yum仓库中,因此我们需要配置 epel仓库
[root@cong11 ~]# yum install -y epel-release
对于安装Ansible来说,我们只需要在管理节点上安装即可,被管理节点除了保证有python和开启了sshd服务以外,不需要任何操作。
[root@cong11 ~]# yum install -y ansible
ansible 的主配置文件: /etc/ansible/ansible.cfg
这个文件主要定义了roles_path路径,主机清单路径,连接清单中的主机方式等配置,这些大部的默认配置已经足够我们平时使用,如需要特别配置可以自行去修改
主机清单文件:/etc/ansible/hosts
这个配置文件就是默认主机清单配置文件,可通过ansible.cfg重新定义的;
如定义一组主机:[web_servers] 其中不能包含特殊字符下划线可以,其他特殊字符都不可以使用。
除了以上两个重要的配置文件还有三个重要的可执行文件分别是
ansible 主执行程序,一般用于命令行下执行
ansible-playbook 执行playbook中的任务
ansible-doc 获取各模块的帮助信息
在前面了解了ansible的两种运行方式后,我们来看下使用命令行方式怎么测下主机的运行,如果想要进行测试,需要将被管理的主机添加到/etc/ansible/hosts里。
[root@cong11 ~]# vim /etc/ansible/hosts
文件 /etc/ansible/hosts 维护着Ansible中被管理服务器的清单。书写格式可以参考/etc/ansible/hosts文件的注释说明。在文件最后追加以下内容
[web_servers]
192.168.1.12 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
192.168.1.13 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
其中,中括号里的web_servers是组名,组名下方为该组包括的主机,每一行定义一个主机,组名需要唯一,而组中的一台主机则可以同时属于几个不同的组。
ansible_ssh_port:指定ssh端口(如果是默认端口22,此参数可以省略)
ansible_ssh_user:指定 ssh 用户
ansible_ssh_pass:指定 ssh 用户登录是认证密码(明文密码不安全)
ansible_sudo_pass:指明 sudo 时候的密码
[root@cong11 ~]# ansible -i /etc/ansible/hosts web_servers -m ping
-i # 指定 host 文件的路径,默认是在 /etc/ansible/hosts
-m # 指定使用的ping模块
web_servers #在主机清单文件中定义的组名(组名建议不要包括特殊字符)
报错:
192.168.1.13 ansible_ssh_port=22 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname 192.168.1.13\\302\\240\\302\\240ansible_ssh_port=22: Name or service not known",
"unreachable": true
}
错误原因:
出现上述错误原因很简单,我们第一次ssh登录一台机器都需要在ansible服务器上保存目标主机的fingerprint指纹,也就是我们看到的这个页面
解决方法:
想要解决刚才的问题:
只需要简单的配置下Ansible服务即可,对于ansible来说我们是可以通过ansible.cfg进行配置调整,一般情况下,ansible配置文件存放在/etc/ansible/ansible.cfg
注:/etc/ansible/ansible.cfg:ansible的主配置文件
[root@cong11 ~]# vim /etc/ansible/ansible.cfg
需要添加的就是我们图中红箭头指的配置,意思是将公钥认证检查关闭,这样我们就可以正常的访问被管理节点了
我们可以为/etc/ansible/hosts中的主机起别名,类似于这样
[web_servers]
nginx01 ansible_ssh_host=192.168.1.12 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
[root@cong11 ~]# ssh-keygen
[root@localhost ~]# for ip in 12 13 ; do ssh-copy-id [email protected].$ip ; done #把公钥复制到到12 13服务器
[root@cong11 ~]# vim /etc/ansible/hosts #修改以下内容
[web_servers]
nginx01 ansible_ssh_host=192.168.1.12 ansible_ssh_port=22 ansible_ssh_user=root
nginx02 ansible_ssh_host=192.168.1.13 ansible_ssh_port=22 ansible_ssh_user=root
[root@cong11 ~]# ansible -i /etc/ansible/hosts web_servers -m ping
[root@cong11 ~]# ansible web_servers -m ping
#不指定配置文件,默认使用/etc/ansible/hosts文件
[root@cong11 ~]# ansible --help #查看帮助
Usage: ansible
例如:ansible [组名] [-i 主机文件] [-m 模块名称] [-a 模块参数]
ansible详细参数:
-v #详细模式,如果命令执行成功,输出详细的结果 (-vv –vvv -vvvv)
-i #指定清单文件(hosts)的路径,默认是在 /etc/ansible/hosts
-m #指定使用的module名称,默认使用 command模块
-a #指定module模块的参数
-u #ssh连接的用户名,默认用root,ansible.cfg中可以配置
-k #提示输入ssh登录密码,当使用密码验证的时候用
-s,--sudo:远程执行命令时使用sudo方式,相当于Linux系统下的sudo命令。
-U SUDO_USERNAME,sudo到哪个用户,默认为root
注意:上述的-s和-U选项在新版中已经失效。新版本选项如下两项:
-s,--sudo 被改成 -b,--become
-U,--sudo-user被改成 --become-user
-K, --ask-become-pass:使用--become或者--become-user时使用的密码认证(即提示输入sudo密码,当不是NOPASSWD模式时使用)。
-C #测试此命令执行会改变什么内容,不会真正的去执行
-f FORKS, --forks=FORKS:并行线程数量,当有数量巨大的机器需要配置,可以使用高并发线程,默认是5个。
--list-host:只打印有哪些主机会执行这个命令,不会实际执行
ansible-doc详细参数:
ansible-doc -l #列出所有的模块列表
ansible-doc -s 模块名 #查看指定模块的参数 -s, --snippet # [ˈsnɪpɪt] 片断
检查ansibel被管理节点的cpu负载
[root@cong11 ~]# ansible web_servers -m command -a "uptime"
给ansible被管理节点增加用户
[root@cong11 ~]# ansible -m command -a "useradd user1" web_servers
[root@cong11 ~]# ansible -m command -a "grep user1 /etc/passwd" web_servers
[root@cong11 ~]# ansible web_servers -m shell -a "echo "user1:123456" | chpasswd"
2.6.2 测试 -b -K -m --become-user
用user1创建admin用户
[root@cong11 ~]# ansible -i /etc/ansible/hosts web_servers -u user1 -k -b --become-user root -K -m command -a "useradd admin"
[root@cong11 ~]# ansible -i /etc/ansible/hosts web_servers -u user1 -k -b --become-user root -K -m command -a "grep admin /etc/passwd"
[root@cong11 ~]# ansible all -a "ls" --list-hosts
hosts (2):
nginx01
nginx02
总结:ansible指定要执行操作的被管理节点或组
1、指定执行机器
注意:ip需要在/etc/ansible/hosts提前里面配置
#指定192.168.1/24段的所有机器
ansible 192.168.1.* -m ping
#指定one、 two两台机器
ansible one.example.com:two.example.com -m ping
2、使用分组过滤
#指定A组
A
#指定A和B两个组
A:B
#指定在A组但不在B组
A:\!B #\表示转义符
#指定同时在A组和B组
A:\&B
下一篇写模块