absible原理及基础应用

一、ansible的作用及工作结构

1、ansible简介:
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务

2、ansible的总体架构:连接其他主机默认使用ssh协议

absible原理及基础应用_第1张图片

由上面的图可以看到 Ansible 的组成由 5 个部分组成:

Ansible: 核心
Modules: 包括 Ansible 自带的核心模块及自定义模块
Plugins: 完成模块功能的补充,包括连接插件、邮件插件等
Playbooks: 剧本(编排好一步一步的执行);定义 Ansible 多任务配置文件,有 Ansible 自动执行
Inventory: 定义 Ansible 管理主机的清单

二、ansible的安装以及常用的模块使用

1、ansible无服务器端,使用时直接运行命令即可,同时不需要在被管控主机上安装任何客户端,因此ansible是一个十分轻量级的工具,可以再epel源进行安装。

配置好epel源直接安装yum安装ansible

[root@centos7 ~]#yum -y install ansible

查看生成的主要文件:

[root@centos7 ~]#rpm -ql ansible
/etc/ansible
/etc/ansible/ansible.cfg   #配置文件
/etc/ansible/hosts   #主机库(host inventory)
/usr/bin/ansible   #主程序
/usr/bin/ansible-doc   #文档
/usr/bin/ansible-playbook   #剧本
......

2、ansible命令的使用方法
语法:

ansible  [-f forks] [-m module_name] [-a args]
    
    host-pattern:host inventory文件的一个组名,可以为all
    -f forks:并行处理的个数,默认为5
    -m module_name:模块名,默认为command
    -a args:参数
ansible-doc:
    -l:查看模块列表
    -s:查看相关模块参数

Ansible默认安装好后有一个配置文件/etc/ansible/ansible.cfg,改配置文件中定义了ansible的主机的默认配置部分,如默认是否需要输入密码、是否开启sudo认证、action_plugins插件的位置、hosts主机组的位置、是否需要开启log功能、默认端口、key文件位置等。

[defaults]
    # some basic default values...
    hostfile       = /etc/ansible/hosts   \\指定默认hosts配置的位置
    # library_path = /usr/share/my_modules/
    remote_tmp     = $HOME/.ansible/tmp
    pattern        = *
    forks          = 5
    poll_interval  = 15
    sudo_user      = root  \\远程sudo用户
    #ask_sudo_pass = True  \\每次执行ansible命令是否询问sudo密码
    #ask_pass      = True  \\每次执行ansible命令时是否询问ssh密码
    transport      = smart
    remote_port    = 22
    module_lang    = C
    gathering = implicit
    host_key_checking = False    \\关闭第一次使用ansible连接客户端是输入命令提示
    log_path    = /var/log/ansible.log \\需要时可以自行添加。chown -R root:root ansible.log
    system_warnings = False    \\关闭运行ansible时系统的提示信息,一般为提示升级
    # set plugin path directories here, separate with colons
    action_plugins     = /usr/share/ansible_plugins/action_plugins
    callback_plugins   = /usr/share/ansible_plugins/callback_plugins
    connection_plugins = /usr/share/ansible_plugins/connection_plugins
    lookup_plugins     = /usr/share/ansible_plugins/lookup_plugins
    vars_plugins       = /usr/share/ansible_plugins/vars_plugins
    filter_plugins     = /usr/share/ansible_plugins/filter_plugins
    fact_caching = memory
    [accelerate]
    accelerate_port = 5099
    accelerate_timeout = 30
    accelerate_connect_timeout = 5.0
    # The daemon timeout is measured in minutes. This time is measured
    # from the last activity to the accelerate daemon.
    accelerate_daemon_timeout = 30

下面对一些常用的模块进行演示说明:
首先准备测试环境:四台主机,一台作为ansible的控制主机,另外三台作为被管理的机器节点

1、ansible的连接:
通过前面的介绍我们知道,ansible是基于ssh协议来进行数据传输,ssh连接一般由两种方法,一种是使用密码密钥,一种是使用公私密码免密码登陆,为了顺利使用ansible,下面配置基于公私密码免密码登录

(1)生成密钥对

[root@centos7 ~]#ssh-keygen -t rsa
\\-t表示使用的加密类型,其中rsa1表示version1版本,rsa、dsa、ecdsa的加密是对于version2版本

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):   \\这里询问你要把生成的密钥文件保存在哪里,默认是在家目录下的.ssh文件夹中,回车保存默认目录

Enter passphrase (empty for no passphrase):
\\ 这里是对密钥文件加密,不输入则表示不加密
 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
e3:39:0e:4b:f0:a1:4f:23:aa:f2:d2:5f:d6:90:8e:af [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|       .         |
|    . + S        |
|     * = o       |
| .  + X =        |
|o .. O = .       |
|o+o.E.+ .        |
+-----------------+

(2)查看已经成功生成了一对密钥

[root@centos7 ~]#ls /root/.ssh
id_rsa  id_rsa.pub  known_hosts
\\其中id_rsa为私钥,id_rsa.pub为公钥

(3)在生成完密钥对之后将公钥上传给服务器对应用户的家目录

[root@centos7 ~]#ssh-copy-id -i .ssh/id_rsa.pub [email protected]

[root@centos7 ~]#ssh-copy-id -i .ssh/id_rsa.pub [email protected]

[root@centos7 ~]#ssh-copy-id -i .ssh/id_rsa.pub [email protected]

已经配置好无需密码登录了,下面进行ansible的配置

2、配置ansible需要控制的主机列表,其配置在/etc/ansible/hosts文件中

absible原理及基础应用_第2张图片

[test表示控制的组可以根据实际进行定义,下面添加主机列表]

3、命令模块

这也是默认的模块,也就是不加-m指定模块时默认的模块,这个模块不能使用包含管道的命令。

[root@centos7 ~]#ansible-doc -s command
absible原理及基础应用_第3张图片

演示:

[root@centos7 ~]#ansible test -a 'date'
absible原理及基础应用_第4张图片

4、shell模块

shell模块也是可以执行命令,与command模块不同的是,command模块不能执行包含管道的模块,而shell可以

[root@centos7 ~]#ansible-doc -s shell
absible原理及基础应用_第5张图片

演示:

[root@centos7 ~]#ansible test -m shell -a 'echo 111 > /tmp/test.txt'
172.16.250.129 | SUCCESS | rc=0 >>


172.16.252.190 | SUCCESS | rc=0 >>


172.16.252.192 | SUCCESS | rc=0 >>

客户端查看已经生成文件

[root@centos7 ~]#cat /tmp/test.txt 
111

5、copy模块:可以把本机的文件拷贝至被管理的机器,通常用于分发配置文件

[root@centos7 ~]#ansible-doc -s copy
absible原理及基础应用_第6张图片

演示:

[root@centos7 ~]#ansible test -m copy -a 'src=/etc/issue dest=/tmp/issue.txt mode=600'
absible原理及基础应用_第7张图片

查看测试成功

[root@centos7 ~]#ansible test -a 'ls /tmp/issue.txt'
absible原理及基础应用_第8张图片

6、cron模块:分发定期任务

[root@centos7 ~]#ansible-doc -s cron
absible原理及基础应用_第9张图片

演示:每5分钟同步ntp服务器

[root@centos7 ansible]#ansible test -m cron -a 'name="test" minute=*/5 hour=* day=*  month=* weekday=* job="usr/sbin/ntpdate 172.16.0.1"'

absible原理及基础应用_第10张图片

7、yum模块:顾名思义,该模块可以管理软件的安装和卸载,state=present(安装) absent(卸载)

[root@centos7 ~]#ansible-doc -s yum
absible原理及基础应用_第11张图片

演示:

[root@centos7 ~]#ansible test -m yum -a 'name=tree state=present'

absible原理及基础应用_第12张图片

测试安装是否成功

[root@centos7 ~]#ansible test -a 'rpm -q httpd'
absible原理及基础应用_第13张图片

8、service模块
state=started/stopped/restarted

[root@centos7 ~]#ansible-doc -s service
absible原理及基础应用_第14张图片

演示:

现在的httpd服务是停止的,我们重启一下

[root@centos7 ~]#ansible test -m service -a 'name=httpd state=started '
absible原理及基础应用_第15张图片

查看已经启动成功

[root@centos7 ~]#ansible test -m shell -a 'ss -tnl|grep 80'
absible原理及基础应用_第16张图片

三、ansible的playbook使用

由上面的演示我们体会到了ansible的强大,但是上面的演示都是一条一条指令的输入,这样未免影响了效率,这里可以使用playbook剧本像shell脚本一样一次执行多条语句

1:playbook组织格式:YAML语言格式

playbook是ansible更强大的配置管理组件,实现基于文本文件编排执行的多个任务,且多次重复执行

(1)YAML简介

  • YAML:YAML Ain‘t Markup Language; Yet Another Markup Language;
  • 类似于半结构化数据,声明配置;可读性较高的用来表达资料序列的格式,易于与脚本语言交互
  • 官方站点:http://www.yaml.org
    (2)语法格式
  • 任何数据结构都用缩进来标识,可以嵌套
  • 每一行是一个键值数据key:value,冒号隔开。若想在一行标识需要用{ } 和,分隔格式
  • 列表用-标识
    (3)playbook组成结构
  • Tasks:任务,即调用模块完成的操作
  • Variables:变量
  • Templates:模板
  • Handlers:处理器,由某个条件触发执行的操作
  • Roles:角色
    基本结构:
- host:webservices
 remote_user:
   - tasks:
   - task1
   module_name

YAML文件扩展名通常为.yaml,如test.yaml

2、playbook的使用:
前面已经介绍了playbook的存储在*.yaml文件中,我们创建一个yaml文件验证一下

[root@centos7 ansible]#cat /etc/ansible/test.yaml
- hosts: test
  remote_user: root
  tasks:
  - name: user a group
    group: gid=1111 name=test system=no
  - name: show command
    shell: date

正式使用时我们最好先运行下看有没有错误

[root@centos7 ansible]#ansible-playbook --check test.yaml
absible原理及基础应用_第17张图片

没有问题就可以正式运行命令脚本了

[root@centos7 ansible]#ansible-playbook test.yaml 
absible原理及基础应用_第18张图片

检查测试成功

[root@centos7 ansible]#ansible test -a 'tail -1 /etc/group'
absible原理及基础应用_第19张图片

3、playbook变量
(1)变量命名:字母、数字和下划线组成,仅能以字母开头;
(2)变量种类:

  • facts:由远程主机发回主机特有的属性信息,这些信息被保存在ansible变量中;无需声明,可直接调用
  • 自定义变量:
  • 通过命令行传递:ansible-playbook test.yaml -extra-vars "host=www user=test"
  • 通过roles传递
  • 主机变量:定义在inventory中的主机之后的变量;直接传递给单个主机的变量

你可能感兴趣的:(absible原理及基础应用)