Ansible架构
用户通过ansible去管理各个主机,那么ansible就是我们所说的主控端,后面的Host为被控端。
在控制主机时,ansible是如何知道哪些主机是被自己控制的呢?
这就需要一个Host Inventory(主机清单),用于记录ansible可以控制网络中的哪些主机。另外,要配置和管理这些主机,可以采用两种方式,一种是单一的命令实现,另外一种也可以使用palybook实现。单一的命令模式是采用不同的模块进行管理,一个模块类似于一些管理的命令,如top,ls,ping等等,适用于临时性的操作任务。如果需要执行一些例行性或经常性的操作,则需要采用playbook的方式,playbook类似于一个脚本,将多个模块按一定的逻辑关系进行组合,然后执行。ansible还支持一些插件,如邮件、日志等,在和远程主机通信时,也会采用类似的连接插件,这里使用则是SSH协议的插件进行通信。
ansible系统由控制主机和被管理主机组成,控制主机不支持windows平台
- 核心:ansible
- Core Modules: ansible自带的模块
- Custom Modules: 核心模块功能不足时,用户可以添加扩展模块
- Plugins: 通过插件来实现记录日志,发送邮件或其他功能
- Playbooks: 剧本,YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能
- Connectior Plugins: ansible基于连接插件连接到各个主机上,默认是使用ssh
- Host Inventory: 记录由Ansible管理的主机信息,包括端口、密码、ip等
Ansible工作原理
1、管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接---这部分对应基本架构图中的连接模块;
2、可以按应用类型等方式进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作---单个模块,单条命令的批量执行,我们可以称之为ad-hoc;
3、管理节点可以通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系统通过组合多条ad-hoc操作的配置文件 。
注意事项
-
执行ansible的主机一般称为主控端,中控,master或堡垒机 -
主控端Python版本需要2.6或以上 -
被控端Python版本小于2.4需要安装python-simplejson -
被控端如开启SELinux需要安装libselinux-python -
windows不能做为主控端
Ansible安装
[root@localhost ~] dnf -y install epel-release
[root@localhost ~]# dnf -y install ansible
#安装过程略
[root@localhost ~]# ansible -m setup localhost|grep python
"_": "/usr/bin/python3.6"
"ansible_python": {
"executable": "/usr/bin/python3.6",
"type": "cpython",
"ansible_python_version": "3.6.8",
"ansible_selinux_python_present": true,
[root@localhost ~]#
构建Ansible清单
定义清单
清单定义Ansible将要管理的一批主机。这些主机也可以分配到组中,以进行集中管理。组可以包含子组,主机也可以是多个组的成员。清单还可以设置应用到它所定义的主机和组的变量。
可以通过两种方式定义主机清单。静态主机清单可以通过文本文件定义。动态主机清单可以根据需要使用外部信息提供程序通过脚本或其他程序来生成
使用静态清单指定受管主机
[root@localhost ansible]# vim inventory
[webservers]
192.168.100.42
192.168.100.43
192.168.100.44
192.168.100.45
192.168.100.46
验证清单
若有疑问,可使用 ansible 命令验证计算机是否存在于清单中
[root@localhost ansible]# ansible webservers --list-hosts
hosts (1):
192.168.100.42
[root@localhost ansible]# vim inventory
[root@localhost ansible]# ansible webservers --list-hosts
hosts (5):
192.168.100.42
192.168.100.43
192.168.100.44
192.168.100.45
192.168.100.46
[root@localhost ansible]# ansible 192.168.100.44 --list-hosts
hosts (1):
192.168.100.44
[root@localhost ansible]# ansible 192.168.100.47 --list-hosts
[WARNING]: Could not match supplied host pattern, ignoring: 192.168.100.47
[WARNING]: No hosts matched, nothing to do
hosts (0):
[root@localhost ansible]#
如果清单中含有名称相同的主机和主机组,ansible 命令将显示警告并以主机作为其目标。主机组则被忽略
应对这种情况的方法有多种,其中最简单的是确保主机组不使用与清单中主机相同的名称。
构建Ansible清单
[root@localhost ansible]# ansible all --list-hosts #列出默认清单文件中的所有受管主机
hosts (5):
192.168.100.42
192.168.100.43
192.168.100.44
192.168.100.45
192.168.100.46
[root@localhost ansible]# ansible ungrouped --list-hosts #列出不属于任何组的受管主机
[WARNING]: No hosts matched, nothing to do
hosts (0):
[root@localhost ansible]# ansible webservers --list-hosts #列出属于某组的受管主机
hosts (5):
192.168.100.42
192.168.100.43
192.168.100.44
192.168.100.45
192.168.100.46
[root@localhost ansible]#
自定义清单文件
将主机加入受管主机序列
[root@localhost ansible]# vim /etc/ansible/inventory
[webservers]
192.168.100.42 ansible_user=root ansible_password=1
~
查看是否ping通
[root@localhost ansible]# ansible all -m ping
192.168.100.42 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
[root@localhost ansible]#
免密登录
将主机名和密码删除
[root@localhost ansible]# vim /etc/ansible/inventory
[webservers]
192.168.100.42
进行免密登录
[root@localhost ~]# ssh-keygen -t rsa #生成密钥过程省略
[root@localhost ~]# ssh-copy-id root@192.168.100.42
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.100.42's password:
Number of key(s) added: 1 #输入密码
Now try logging into the machine, with: "ssh 'root@192.168.100.42'"
and check to make sure that only the key(s) you wanted were added.
[root@localhost ~]# ansible all -m ping
192.168.100.42 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
[root@localhost ~]#
|