一、批量管理服务知识介绍

1. ansible是一个基于Python开发的自动化运维工具。基于Python语言实现,由Paramiko和PyYAML两个关键模块构建。

2. ansible是一个基于ssh协议实现远程管理的工具

3. ansible软件可以实现多种批量管理操作(批量系统配置、批量软件部署、批量文件拷贝、批量运行命令)

二、批量管理服务特征介绍

1.  Ansible不需要服务端,不需要守护进程服务。不需要启动任何服务 默认服务端不需要任何的配置

2.  Ansible不需要单独安装客户端,基于系统自带的SSHD服务。

3.  依靠大量的模块或者使用shell/python写成脚本或程序实现批量管理

三、Ansible软件基本架构

ansible能管理1万台服务器吗 ansible service_html

   从上图可以了解到其由以下部分组成:

   核心:ansible

   核心模块(Core Modules):ansible自带的模块

   扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块

   插件(Plugins):完成模块功能的补充

   剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行

   连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件

   主机群(Host Inventory):定义ansible管理的主机

四、ansible软件安装部署

1. ansible软件自动化环境架构规划

 

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_02

2. Ansible部署环境准备

    Ansible管理服务节点需要安装软件,这里为m01,IP地址为172.16.1.61

   1)安装软件包命令如下

    yum install epel-release -y

    yum install ansible  -y                 

    yum install libselinux-python -y   #python 依赖包

   2)查看Ansible软件安装了哪些文件

    rpm -ql ansible

 

ansible能管理1万台服务器吗 ansible service_定时任务_03

   3)查看Ansible软件版本信息

   ansible --version

 

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_04

  4)Ansible被管理服务节点需要安装软件

   yum install libselinux-python -y 

3. Ansible批量管理方式

    利用Ansible批量管理主机有两种方式:一种是密码认证的管理方式;一种是利用密钥的管理方式。

    1)通过SSH密码认证方式批量管理主机

    前提:假如主机nfs01和backup主机没有配置免密钥

 

ansible能管理1万台服务器吗 ansible service_定时任务_05

 

ansible能管理1万台服务器吗 ansible service_html_06

    ansible 管理主机信息或者主机组信息  -m 模块名称 -a 相关模块参数  -u 指定以什么身份远程登录 -k 采用密码方式登录

 

ansible能管理1万台服务器吗 ansible service_html_07

 

ansible能管理1万台服务器吗 ansible service_Ansible_08

  发现每次执行ansible命令都要输入root用户密码,如果不同主机的密码不一致,就要输入多次。解决办法:可以在/etc/ansible/hosts主机列表文件中添加指定配置参数信息,实现远程管理主机的效果。

 

ansible能管理1万台服务器吗 ansible service_Ansible_09

 

ansible能管理1万台服务器吗 ansible service_Ansible_10

 注:主机列表文件中常见配置参数如下:

 

ansible能管理1万台服务器吗 ansible service_定时任务_11

   2)通过SSH密钥方式进行批量管理主机

    a. 创建SSH秘钥对信息

        交互式:ssh-keygen -t dsa

        影响免交互创建密钥对创建因素:需要指定私钥存放路径;需要进行私钥文件密码设定

        免交互式:ssh-keygen -t dsa -f /root/.ssh/id_dsa -P "" > /dev/null 2>&1

 

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_12

         注:利用ssh-keygen命令参数实现免交互创建密钥对

                -f:表示指定将密钥文件创建在什么路径

                -P/-N:表示指定密钥文件的密码信息是什么,此处设置为空

                -q:表示创建的密钥结果信息不用输出,等价于追加到空(>/dev/null 2>&1)

    b.分发公钥信息,将SSH服务创建的公钥信息分发到被管理主机上

        交互式:ssh-copy-id -i /root/.ssh/id_dsa.pub 被管理主机ip地址

        影响免交互批量分发密钥因素:

        需要有确认连接过程,需要输入yes/no:-o StrictHostKeyChecking=no 参数信息,跳过SSH连接确认信息。

        需要解决密码问题:sshpass指定SSH密码信息

        免交互式:sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no" 172.16.1.31

  

ansible能管理1万台服务器吗 ansible service_Ansible_13

        如果机器比较多,可以编写分发公钥脚本文件实现批量分发公钥

 

ansible能管理1万台服务器吗 ansible service_定时任务_14

 执行脚本,查看运行结果

 

ansible能管理1万台服务器吗 ansible service_定时任务_15

    c.编写Ansible被管理主机列表清单

       vi /etc/ansible/hosts

 

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_16

    d.利用Ansible管理命令进行批量管理

       ansible 管理主机信息或者主机组信息  -m 模块名称 -a 相关模块参数      

       主机信息:远程主机IP地址 远程主机组名称 远程所有主机all

       -m 指定相应模块

       -a 利用模块中某些参数功能

 

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_17

五、Ansible批量管理模式和命令介绍

1. Ansible实现批量管理的两种模式

    Ansible实现批量管理主机主要有两种模式,一种是利用ansible命令实现批量管理(ad-hoc模式),另一种是利用ansible剧本实现批量管理(playbook模式)

(1)ad-hoc模式

         Ansible的ad-hoc模式即ansible命令行模式,这种模式常用来日常临时批量处理一些任务

(2)playbook模式

       Ansible的playbook模式是针对指定的具体较大任务,事先写好执行剧本,然后在其他机器上批量执行相同的任务,属于定制化的批量执行任务。

2. ansible命令

    ansible语法格式如下:

 

ansible能管理1万台服务器吗 ansible service_html_18

   根据语法格式可知,应用ansible命令批量管理主要涉及以下6个部分

   1)第一部分表示ansible批量管理命令

   2)第二部分表示指定要管理的主机信息,可以是主机组名称,主机IP地址,或者是all(表示所有主机)

   3)第三部分表示调用相应的ansible模块参数(-m)

   4)第四部分表示指定应用ansible软件什么功能模块,即指定功能模块名称

   5)第五部分表示调用相应模块功能参数(-a)

   6)第六部分表示指定应用模块功能中的哪些功能,有标准参数定义。

   ansible命令参数总结

  

ansible能管理1万台服务器吗 ansible service_html_19

3. ansible-doc命令

   1)列出所有ansible支持的模块

         ansible-doc -l

   2)查看某个模块具体的帮助参数

         ansible-doc -s command

 

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_20

六、Ansible模块详解

       Ansible自动化服务软件实现批量管理功能必须依赖Ansible软件中众多的模块。

1. Ansible命令和脚本类型模块说明

1). command模块功能说明

     功能:在远程节点上执行一个命令

     官方参考链接:http://docs.ansible.com/ansible/latest/modules/command_module.html

     command模块功能参数

     参数:chdir---在执行某个命令前,先切换目录

 

ansible能管理1万台服务器吗 ansible service_定时任务_21

     参数:creates---判断一个文件是否存在,如果已经存在了,后面的命令就不会执行

 

ansible能管理1万台服务器吗 ansible service_定时任务_22

     参数:removes---判断一个文件是否存在,如果不存在,后面的命令就不会执行

 

ansible能管理1万台服务器吗 ansible service_Ansible_23

     参数(必须要有的):free_form---表示执行command模块时,必须要有linux合法命令信息

 

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_24

ansible能管理1万台服务器吗 ansible service_html_25

     注:使用command模块执行远程命令时,命令中不能包括变量,类似$HOME和参数类似"<" ">" "|" 等特殊符号信息。

2). shell模块功能说明 

     功能说明:在远程节点上执行命令(可以是多个命令)

    官方参考链接:http://docs.ansible.com/ansible/latest/modules/shell_module.html

    参数:chdir---在执行莫个命令前,先切换目录

    参数:creates---判断一个文件是否存在,如果已经存在了,后面的命令就不会执行

    参数:removes---判断一个文件是否存在,如果不存在,后面的命令就不会执行

    参数(必须要有的):free_form---表示执行command模块时,必须要有linux合法命令信息

    注:shell模块可以满足command模块所有功能,并且可以支持识别特殊字符信息 < > | ; 

 

ansible能管理1万台服务器吗 ansible service_定时任务_26

   利用shell模块实现批量执行远程主机脚本时,脚本必须在远程主机上,并且授权为执行权限。

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_27

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_28

3). script---专门运行脚本模块

    功能说明:把本地脚本传输到远程节点上并运行脚本

    官方参考链接:http://docs.ansible.com/ansible/latest/modules/script_module.html

    参数:chdir---在执行莫个命令前,先切换目录

    参数:creates---判断一个文件是否存在,如果已经存在了,后面的命令就不会执行

    参数:removes---判断一个文件是否存在,如果不存在,后面的命令就不会执行

    参数(必须要有的):free_form---表示执行command模块时,必须要有linux合法命令信息

 

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_29

    注:利用script模块实现批量执行远程主机脚本时,脚本不用在远程主机上存放和授权

2. Ansible文件类型模块说明

    1)copy模块功能说明

    功能说明:复制文件到远程主机

    官方链接:http://docs.ansible.com/ansible/latest/copy_module.html

    参数:backup---对数据信息进行备份

    参数:src---定义要推送数据信息

    参数:dest---定义将数据推送到远程主机什么目录中 

    参数:owner---设置复制后的文件属主权限

    参数:group---设置复制后的文件属组权限

    参数:mode---设置复制后的文件权限(600 755)

    批量远程复制文件

   ansible web -m copy -a "src=/etc/passwd dest=/tmp/test.txt owner=test group=test mode=0755"

  

ansible能管理1万台服务器吗 ansible service_html_30

 

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_31

 远程批量复制备份

 ansible web -m copy -a "content='I am teacher' dest=/tmp/test1.txt backup=yes"

 

ansible能管理1万台服务器吗 ansible service_定时任务_32

 

ansible能管理1万台服务器吗 ansible service_定时任务_33

 2)file模块功能说明

     功能说明:创建及设置文件(目录)属性

    官方链接:http://docs.ansible.com/ansible/latest/file_module.html

    参数:backup---对数据信息进行备份

    参数:src---要链接的文件路径(只能应用state=link),创建链接文件时使用

    参数:path(必选参数)文件路径管理,别名方式:dest,name

    参数:owner---设置复制后的文件属主权限

    参数:group---设置复制后的文件属组权限

    参数:mode---设置复制后的文件权限(600 755)

    参数:state---如果指定参数为directory,所有不存在的子目录就会被创建

                          如果指定参数为file,如果文件不存在将不能被创建,如果想创建可以参考copy

                          如果指定参数为link,符号链接将被创建或更改

                          如果指定参数为hard,便会创建硬链接

                          如果指定参数为absent,目录将被递归删除以及文件,而链接将被取消

                          如果指定参数为touch,如果路径不存在将创建一个空文件,如果文件或目录存在,将接收更新文件访问和修改时间

   ansible web -m file -a "dest=/tmp/dir01 state=directory"

  

ansible能管理1万台服务器吗 ansible service_Ansible_34

  ansible web -m file -a "dest=/tmp/file01 state=touch"

 

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_35

ansible能管理1万台服务器吗 ansible service_Ansible_36

  ansible web -m file -a "src=/etc/hosts dest=/tmp/link_file state=link"

 

ansible能管理1万台服务器吗 ansible service_Ansible_37

 

ansible能管理1万台服务器吗 ansible service_html_38

3.Ansible软件类型模块说明

  功能说明:yum包管理模块

  官方链接:http://docs.ansible.com/ansible/latest/yum_module.html

  name:执行要安装软件的名称,以及软件的版本

  state:installed安装 absent(卸载)

  list:指定软件名称,查看软件是否可以安装,以及是否已经安装过了

  ansible 172.16.1.7 -m yum -a "list=iftop"

 

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_39

  ansible web -m yum -a "name=iftop state=absent"

ansible能管理1万台服务器吗 ansible service_html_40

 ansible web -m yum -a "name=iftop state=installed"、

ansible能管理1万台服务器吗 ansible service_html_41

4.Ansible网络服务类型模块说明

  1)service/systemd模块功能说明

  功能说明:Service服务管理用于CentOS6以及以前系统,而systemd命令应用于CentOS7系统

  官方链接:http://docs.ansible.com/ansible/latest/modules/service_module.html

  name: 指定要管理的服务名称(管理的服务一定在chkconfig中可以看到)

  state:stopped started restarted reloaded

  enabled:yes表示服务开机自启动 no表示服务开机不要自动启动

  ansible web -m shell -a "systemctl status crond"

  ansible web -m service -a "name=crond state=stopped enabled=no"

  ansible web -m systemd -a "name=crond state=started enabled=yes"

 

ansible能管理1万台服务器吗 ansible service_Ansible_42

ansible能管理1万台服务器吗 ansible service_定时任务_43

ansible能管理1万台服务器吗 ansible service_Ansible_44

2)cron模块功能说明

功能说明:管理定时任务条目信息模块

官方链接:http://docs.ansible.com/ansible/latest/modules/cron_module.html

cron模块功能参数

ansible能管理1万台服务器吗 ansible service_定时任务_45

user参数:此参数用于设置当前计划任务属于哪个用户,当不使用此参数时,默认为管理员用户。

job参数:此参数用于指定计划的任务中需要实际执行的命令或者脚本,比如上例中的 “echo test” 命令。

name参数:此参数用于设置计划任务的名称,计划任务的名称会在注释中显示,当不指定计划任务的名称时,ansible 会默认为计划任务加入注释,注释的内容为 #Ansible: None,假设指定计划任务的名称为 test,那么注释的内容为#Ansible: test,在一台机器中,计划任务的名称应该具有唯一性,方便以后根据名称修改或删除计划任务。

state参数:确认job或环境变量是开启或是关闭;即创建定时任务或删除定时任务。当删除计划任务时,需要将 state 的值设置为 absent。

disabled参数:如果job应该关闭(被注释掉)。只能影响状态是开启状态的定时任务条目

    Ansible编写定时任务,和直接编写定时任务文件思路一样,只不过有些参数信息发生变化。系统定时任务与ansible定时任务对比如下:

ansible能管理1万台服务器吗 ansible service_html_46

设置定时任务

ansible web -m cron -a "name='test' job='/usr/sbin/ntpdate ntp3.aliyun.com >/dev/null 2 >&1' minute=*/5"

ansible能管理1万台服务器吗 ansible service_Ansible_47

#删除定时任务

ansible web -m cron -a "name='test' state=absent"

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_48

3)mount模块功能说明

功能说明:挂载及卸载文件系统(本地或远程)

官方链接:http://docs.ansible.com/ansible/latest/modules/mount_module.html

参数src:要挂载的设备

参数path:挂载点,如/mnt

参数fstype:挂载的文件系统类型

参数opts:挂载的参数选项

参数state:present 开机挂载,仅将挂载配置写入到/etc/fstab

                  mounted挂载设备,并将配置写入/etc/fstab

                  unmounted卸载设备,不会清除/etc/fstab写入的配置

                  absent卸载设备,会清理/etc/fstab写入的配置

ansible web -m mount -a "src=172.16.1.31:/data path=/mnt fstype=nfs opts=defaults state=mounted"

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_49

ansible能管理1万台服务器吗 ansible service_html_50

5.Ansible用户和组类型模块说明

1)user模块功能说明

功能说明:管理系统用户

官方链接:http://docs.ansible.com/ansible/latest/modules/user_module.html

参数create_home:创建家目录,除非设置no,不创建家目录

参数group:创建用户组

参数name:创建用户的名字

参数password:创建用户密码

参数uid:创建用户uid

参数shell:创建用户的登录shell

ansible web -m user -a "name=xixi uid=8888 shell=/sbin/nologin create_home=no"

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_51

2)group模块功能说明

功能说明:管理系统用户

官方链接:http://docs.ansible.com/ansible/latest/modules/group_module.html

参数name:指定创建的组名

参数gid:指定组的gid

参数state:absent 移除远端主机的组

                   present创建远端主机的组

ansible web -m group -a "name=sa gid=9999"

ansible能管理1万台服务器吗 ansible service_html_52

七、Ansible最核心的组件playbook

       Ansible最核心的组件playbook。Ansible主要用于进行配置管理,它在实际工作中会去编写和使用剧本,从而提升匹配管理工作的效率。

1. playbook基本语法

    Ansible的playbook文件格式为YAML语法。

   编写规范:http://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html  

   遵循pyyaml

  ①. - 用法说明,表示列表显示的内容(短横线与列表信息之间又空格)

  ②. : 用法说明,采用字典格式进行设置,key: value(key和value之间用冒号加空格进行分割)

  ③. 空格 用法说明:对内容进行分级时,需要有两个空格表示分级

  补充:必须使用空格分隔ansible剧本级别,一定不要使用tab键进行分割。两个空格作为一个缩进。

2. playbook执行方式

    加载执行剧本文件时,使用ansible-playbook命令

    执行playbook的基本方法如下:

    ansible-playbook test.yml

    --verbose 参数查看剧本执行时输出的详细信息

    --list-hosts参数查看剧本执行时会影响那些主机信息

    -i /etc/ansible/hosts参数指定加载的主机清单文件

     --syntax-check参数:检查剧本语法是否正确

     -C参数只是模拟执行,不会影响主机的配置

3. playbook的输出

   剧本在执行的过程中,会产生相应的输出,根据输出的信息可以掌握剧本是否完整执行,每个执行过程是否正确,以及根据输出的错误提示信息,可以排查剧本编写中的逻辑问题。

ansible能管理1万台服务器吗 ansible service_定时任务_53

   通过以上执行剧本输出的信息,可以将剧本执行过程输出的信息总结Wie三个部分,具体如下:

 1)PLAY [web] :显示执行过程中加载所管理主机或者主机组信息

 2)TASK [Gathering Facts]:显示对所管理主机执行的任务信息,默认最先执行的任务为收集主机信息

      TASK [copy the /etc/hosts]:显示对所管理主机具体执行的任务,默认加载模块命令,可以根据name定义显示

 3)PLAY RECAP:剧本执行结果汇总统计,统计对主机做了多少次改动,以及出现了多少次错误。

4. playbook扩展配置

 1)playbook设置变量功能

       a. 在playbook中用户自定义变量

       通过vars关键字自定义变量,之后再用{{}}调用即可

       也可以将变量放到单独的一个文件中,之后通过关键字“var_files”可以将变量引用到playbook中。

ansible能管理1万台服务器吗 ansible service_html_54

ansible能管理1万台服务器吗 ansible service_定时任务_55

       b. 用户无须定义,Ansible会在执行playbook之前去管理主机上搜集关于远程主机系统的信息变量

       Ansible会通过模块“setup”来搜集主机的系统信息,这些搜集到的系统信息称之为Facts。每个playbook在执行前都会默认执行setup模块,所以Facts信息可以直接以变量的形式使用

      可以通过在命令行中调用setup模块命令,查看所有可以调用的Facts变量信息

      ansible web -m setup -u root

ansible能管理1万台服务器吗 ansible service_Ansible_56

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_57

       c. 在文件模板中,可以直接使用上述两种变量

       d. 把任务的运行结果作为一个变量使用,这个叫做注册变量

      把执行结果注册到一个变量中,关键字是register,待后面的任务使用。

      注册变量经常和debug模块一起使用。

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_58

       e. 为了使playbook更灵活,通用性更强,允许用户在执行playbook时传入变量的值,此时需要用到额外变量。

      用命令行传递参数

ansible能管理1万台服务器吗 ansible service_定时任务_59

 2)playbook逻辑控制语句

      参数when:条件判断语句,类似编程语言中的if

ansible能管理1万台服务器吗 ansible service_定时任务_60

      参数loop:循环语句,类似编程语言中的while

      “with_items” 用于迭代的list类型变量,不仅支持简单的字符串列表,也可以支持哈希列表

       嵌套循环,用[]访问内存和外层的循环

ansible能管理1万台服务器吗 ansible service_定时任务_61

ansible能管理1万台服务器吗 ansible service_ansible能管理1万台服务器吗_62

      参数block:把几个任务组成一个代码块,以便针对一组操作的异常进行处理

3. playbook调试功能配置

   常用的调试功能有以下功能:

   ignore_errors:忽略剧本执行过程中的错误信息

   tags:给剧本打标签