实现了批量系统部署,批量程序部署,批量运行命令等功能,Ansible是基于模块工作的,本身没有批量部署的能力,真正具有能力的是Ansible运行的模块,Ansible只是提供一个框架。

核心组件:

image.png

  • Ansible:核心程序
  • connection-Plugins:负责和被监控端实现通信
  • plugins:完成模块功能的补充,包括连接插件,邮件插件
  • modules:包括ansible自带的核心模块和自定义模块
  • playbook:剧本,定义ansible多任务配置文件,由ansible自动执行
  • inventory:定义ansible管理的主机清单

    特点:

  • 不需要在被监控端上安装任何服务程序

  • 无服务器端,使用时直接运行命令即可
  • 基于ssh工作
  • 基于模块工作,可以使用任意语言开发
  • 使用yaml语言编写playbook
  • 可实现多级指挥
  • 具有幂等性,一次操作重复多次的结果相同
  • 执行过程:加载自己的配置文件,默认为/etc/ansible/ansible.cfg。加载自己的模板文件。通过ansible将模块或命令生成对应的py文件,并将该文件传输到远程服务器。对应执行用户家目录的ansible/tmp/xx.py文件。给文件+X执行。执行并返回结果,删除临时的py文件,sleep0退出。

    安装部署ansible:

    1. yum install epel-release.noarch -y
    2. yum install ansible -y
    ssh-keygen -P "" -t rsa
    ssh-copy-id -i /root/.ssh/id_rsa.pub root@server2
    

    常用命令:

  • ansible:临时命令的执行工具,常用于执行临时命令

  • ansible-doc:用于模块功能的查询
  • ansible-playbook:用于执行剧本

ansible参数说明:

-m:指定模块
-a:指定模块的参数
-C:坚持执行结果
-e:指明变量名
-f:指定并发进程数
-i:指定主机清单文件
—syntax-check:检查执行命令是否存在语法错误

常用模块:

ansible执行的状态:

  • 绿色:执行成功并且不需要做改变的操作
  • 黄色:执行成功需要做改变的操作
  • 红色:执行失败
  • 粉色:警告信息
  • 蓝色:显示ansible命令的执行过程

ping模块:主机连通性测试
user模块:
Group模块:
command模块:不支持管道,变量及重定向。
shell模块:
script模块:
copy模块:
file模块:
yum模块:
service模块:
selinux模块:
mount模块:
parted模块:
lvg模块:
lvol模块:
filesystem模块:
block模块:
rescure模块:
always模块:
find模块:
wait_for模块:
unarchive模块:
archive模块:
debug模块:帮助我们进行调试,debug模块可以帮助我们把信息输出到ansible控制台上,以便我们能够定位问题。可以通过msg:返回变量的值

Playbook:

简介:

playbook是由yaml语言编写的具有多个play组成的列表,可以让这些列表按照编排的顺序执行,所谓的task就是调用ansible具体的模块,在模块参数中可以使用变量。模块执行是幂等性的,意味着多次执行结果相同。

核心字段:

  • hosts:执行的远程主机列表
  • tasks:任务,由模块的定义操作列表
  • variables:内置变量或者是自定义变量
  • templates:模板,定义模板文件,模板文件一般由jinja2语言编写
  • handlers:和nogity结合使用,为条件触发操作,满足条件则执行
  • roles:角色

    变量:

    变量的来源:

  • 远程主机的所有变量都可以使用ansible -m setup nodes

  • 自定义变量

优先级:

  • 通过命令行指定变量的优先级最高
  • /etc/ansible/hosts定义变量(针对单个主机定义,针对主机组进行定义)
  • Playbook中定义的变量

    模板:

  • 文本文件,内部嵌套有模板语言的脚本

  • jinjia2是由python编写的,写模板时一般用jinjia2语言
  • 功能:将模板中的变量替换为本地主机的确定值
  • 语法:字符串,数字,列表[],字典{},元组(),算数运算,比较运算,逻辑运算。

变量:{{name}}

控制结构:

条件判断:

- name restart nginx
  service:
     name:nginx
     state:restarted
  when:ansible_distribution_major_version =='6'

循环迭代:

  • with_items:在列表嵌套列表的情况下,将子列表展开
  • with_flattened:在列表嵌套列表的情况下,将子列表展开
  • with_list:在列表嵌套列表的情况下,不将子列表展开,也就是不会拉平拉直
  • with_together:将多个列表中的对应元素,组合起来类似于python中的zip
  • with_cartesian:用于列表嵌套的情况,将第一个列表中的第一个元素与第二个列表中的元素组合(笛卡尔的方式)。
  • with_nested:与cartesian一样
  • with_indexed_items:给每个元素添加编号,在嵌套三层列表后,不能像flattened一样拉平
  • with_sequence:与数字相关
  • with_random_choice:从列表中随机返回一个值
  • with_dic:与字典相关
  • with_file:能够显示文件内容
  • with_fileglob:能够匹配文件名称
  • loops:是最近出现的一个循环迭代方法,可以通过加上过滤器替代with_xxx的循环方式 ```shell

    基于字符串列表

    tasks:
    • name: create rsyncd file copy: src= {{item}} dest= /tmp/{{ item }} with_items:
      • a
      • b
      • c
      • d

        基于字典列表

        tasks:
    • name: add serveral users user: name: {{ item.name }} groups: {{ item.groups }} state: present with_items:
      • {name: ‘user1’ , groups: ‘wheel’}
      • {name: ‘user2’ , groups: ‘root’ }

```

角色:

角色是用来提高ansible的便利性,降低冗余性。我们能将某一个服务定义为一个角色,当我们需要用到这个服务时,直接调用角色就行,就不会再在剧本中重写该服务的语句。提高了可维护性和便利性。
如何使用角色呢:首先我们需要在角色的目录下使用ansible-galaxy init apache初始化一个角色。该角色初始化完成后会有,files,tasks,template,defaults,handlers,vars,meta等目录。就是相当于角色的性质。我们需要什么样的角色,就去将相应的性质加到里面。当我们需要调用角色时,应该在roles的目录下定义一个site.yaml文件。里面包含了name字段,remote_user字段,以及hosts
还有roles:将我们需要的角色加进去就可以,本质上它是一个剧本。

roles目录下各目录的的功能:

  • tasks:此目录中至少有一个main.yaml文件,用来定义各种task任务,其他文件由main.yaml调用
  • handlers:有main.yaml文件,用来定义各种handler
  • vars:有main.yaml文件,用来定义各种变量
  • tmplates:用来存放template模块调用的模板文件
  • meta:有main.yaml,定义当前角色的设定及其依赖关系
  • default:有main.yaml文件,设定默认的值
  • files:此目录存放copy或者script等模块调用的文件。