一、ansible架构图

image.png

上图为ansible的基本架构,从上图可以了解到其由以下部分组成:

  • 核心:ansible
  • 核心模块(Core Modules):这些都是ansible自带的模块
  • 扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块
  • 插件(Plugins):完成模块功能的补充
  • 剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行
  • 连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
  • 主机群(Host Inventory):定义ansible管理的主机

    二、ansibles工作原理

    image.png

以上是从网上找到的两张ansible工作原理图,两张图基本都是在架构图的基本上进行的拓展。从上面的图上可以了解到:
1、管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接---这部分对应基本架构图中的连接模块;
2、可以按应用类型等方式进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作---单个模块,单条命令的批量执行,我们可以称之为ad-hoc;
3、管理节点可以通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系统通过组合多条ad-hoc操作的配置文件 。

三、ansible主要组成部分

ansible命令执行来源:

  • USER,普通用户,即system administrator
  • CMDB,(配置管理数据库)API调用
  • PUBLIC / PRIVATE CLOUD API调用
  • USER -> ansile playbook -> ansible

利用ansible实现管理的方式:

  • Ad-Hoc,即ansible命令,主要用于临时命令使用场景
  • Ansible-playbook,主要用于长期规划好的,大型项目的场景,需要有前提的规划

ansible-playbook(剧本)执行过程:

  • 将已有编排好的任务集写入ansible-playbook
  • 通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行

ansible主要操作对象:

  • HOSTS 主机
  • NETWORKING 网络设备

注意事项:

  • 执行ansible的主机一般称为主控端,中控,master或堡垒机
  • 主控端python版本需要在2.6或以上
  • 被控端python版本小于2.4需要安装python-simplejson
  • 被控端如开启SELinux需要安装libselinux-python
  • windows不能作为主控端

    playbook核心元素

  • Hosts:执行的远程主机列表

  • Tasks:任务集
  • Varniables: 内置变量或自定义变量在playbook中调用
  • Templates:模板,可替换模板文件中的变量并实现一些简单逻辑的文件
  • Handlersnotity 结合使用,由特定条件触发的操作,满足条件才执行,否则不执行
  • Tags:标签 指定某条任务执行,用于选择运行playbook中的部分代码,ansible具有幂等性,
  • 因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依
  • 然会非常地长,此时,如果确信其没有变化,就可以通过tags跳过此些代码片段

ansible-playbook -t tagsname useradd.yml

一、Hosts:

playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts
用于指定要执行指定任务的主机,须事先定义在主机清单中
可以是如下形式:
1、正常写法,name1为别名:
[test1]
name1 ansible_ssh_host=192.168.1.111 ansible_ssh_user=”root” ansible_ssh_pass=”1234” ansible_ssh_port=22
name2 ansible_ssh_host=192.168.1.222 ansible_ssh_user=”root” ansible_ssh_pass=”1234” ansible_ssh_port=22
2、连续的IP写法,表示192.168.1.20到192.168.1.50,共31台主机:
[test1]
name1 ansible_ssh_host=192.168.1.[20:50] ansible_ssh_user=”root” ansible_ssh_pass=”1234” ansible_ssh_port=22
3、带参数的群组,vars底下为群组共同便变量,包括已定义变量和自定义变量:
[test1]
name1 ansible_ssh_host=192.168.1.[20:50]
[test1:vars]
ansible_ssh_user=root
ansible_ssh_pass=”1234”
testvar=”test”
4、群组整合,children底下为父群组test的子群组,调用方式为ansible test -m ping:
[dbtest]
name1 ansible_ssh_host=192.168.1.[20:50] ansible_ssh_user=”root” ansible_ssh_pass=”1234” ansible_ssh_port=22
[webtest]
name2 ansible_ssh_host=192.168.2.[20:50] ansible_ssh_user=”root” ansible_ssh_pass=”1234” ansible_ssh_port=22
[test:children]
dbtest
webtest
5、调用两个主机组的写法,以下webservers和dbservers都会被调用:
ansible webservers:dbservers -m win_ping
6、在webservers组中但不在dbsersers中的调用:
ansible webservers:!dbservers -m win_ping
7、在webservers组中并且在dbservers组中的才会调用:
ansible webservers:&dbservers -m win_ping
8、在调用前加~,代表正则表达式:
ansible ~(web|db).*.91it.org -m win_ping
9、组合的例子:
webserver:dbservers:&nginx:!ntp
10、hosts文件中没有定义的IP或别名,在进行调用中,会提示错误。ansible对单台服务器的调用,服务器IP或域名必须有写在hosts里。

原文
https://www.cnblogs.com/lizhewei/p/11684204.html