ansible 工作原理以及使用详解

内容:

1、ansible的作用以及工作结构

2、ansible的安装以及使用

3、ansible的playbook使用

一、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协议!

ansible 工作原理以及使用详解_第1张图片

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

1、ansible无服务器端,使用时直接运行命令即可,同时不需要在被管控主机上安装任何客户端,因此ansible是一个十分轻量级的工具,可以在epel源进行安装,ansible已经被红帽收购,相信不久会被收入base源

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

查看ansible相关信息:

ansible 工作原理以及使用详解_第2张图片

安装ansible:

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

查看生成的主要配置文件:

ansible 工作原理以及使用详解_第3张图片

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支持非常多的模块:

查看帮助:

ansible-doc -s 

注意:使用ansible-doc -s查看帮助时,一般有=号的参数都是必要的参数

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

具体如下:

ansible 工作原理以及使用详解_第4张图片

下面对一些常用的模块来进行演示说明:

首先现在测试环境:四台主机,一台作为ansible的控制主机,另外三台作为被管理的机器节点

1、ansible的连接:

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

(1)生成密匙对

[root@redhat7 ~]#ssh-keygen -t rsa
ansible 工作原理以及使用详解_第5张图片

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

ansible 工作原理以及使用详解_第6张图片

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

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

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

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

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

2、配置ansible需要控制的主机列表,其配置在hosts文件中:
[root@redhat7 ~]#vim /etc/ansible/hosts

ansible 工作原理以及使用详解_第7张图片

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

3、命令模块:

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

查看command命令模块的帮助信息:

[root@redhat7 ~]#ansible-doc -s command
ansible 工作原理以及使用详解_第8张图片

演示:

[root@redhat7 ~]#ansible test -a 'date'
ansible 工作原理以及使用详解_第9张图片
4、shell模块:

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

查看shell模块的帮助信息说明:

[root@redhat7 ~]#ansible-doc -s shell
ansible 工作原理以及使用详解_第10张图片

演示:

[root@redhat7 ~]#ansible test -m shell -a 'echo 111 > /tmp/test.txt'
ansible 工作原理以及使用详解_第11张图片

在客户端查看已经生成文件:

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

查看copy模块的帮助文件信息:

ansible 工作原理以及使用详解_第12张图片

演示:

[root@redhat7 ~]#ansible test -m copy -a 'src=/etc/issue dest=/tmp/issu.txt mode=600'

172.16.252.79 | SUCCESS => {
    "changed": true, 
    "checksum": "5c76e3b565c91e21bee303f15c728c71e6b39540", 
    "dest": "/tmp/issu.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "f078fe086dfc22f64b5dca2e1b95de2c", 
    "mode": "0600", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 23, 
    "src": "/root/.ansible/tmp/ansible-tmp-1505995197.52-47510030965157/source", 
    "state": "file", 
    "uid": 0
}
172.16.252.170 | SUCCESS => {
    "changed": true, 
    "checksum": "5c76e3b565c91e21bee303f15c728c71e6b39540", 
    "dest": "/tmp/issu.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "f078fe086dfc22f64b5dca2e1b95de2c", 
    "mode": "0600", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 23, 
    "src": "/root/.ansible/tmp/ansible-tmp-1505995197.45-41365644836543/source", 
    "state": "file", 
    "uid": 0
}
172.16.252.131 | SUCCESS => {
    "changed": true, 
    "checksum": "5c76e3b565c91e21bee303f15c728c71e6b39540", 
    "dest": "/tmp/issu.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "f078fe086dfc22f64b5dca2e1b95de2c", 
    "mode": "0600", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 23, 
    "src": "/root/.ansible/tmp/ansible-tmp-1505995197.79-25329696990563/source", 
    "state": "file", 
    "uid": 0
}

客户端查看测试成功

[root@redhat7 ~]#ansible test -a 'ls /tmp/issu.txt'
ansible 工作原理以及使用详解_第13张图片
6、cron模块:分发定期任务

查看cron模块的帮助文档信息

[root@redhat7 ~]#ansible-doc -s cron

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

[root@redhat7 ~]#ansible test -m cron -a 'name="test" minute=*/5 day=* month=* weekday=* job="usr/sbin/ntpdate 172.16.0.1"'
ansible 工作原理以及使用详解_第14张图片

查看客户端已经成功添加计划任务

[root@redhat7 ~]#ansible test -a 'crontab -l'
ansible 工作原理以及使用详解_第15张图片
7、yum模块:顾名思义,该模块可以管理软件的安装和卸载,state=present(安装) adsent(卸载)

查看yum模块的帮助信息

[root@redhat7 ~]#ansible-doc -s yum

演示

[root@redhat7 ~]#ansible test -m yum -a 'name=tree state=present'
ansible 工作原理以及使用详解_第16张图片

测试安装成功

[root@redhat7 ~]#ansible test -a 'rpm -q tree'
ansible 工作原理以及使用详解_第17张图片
8、service模块

state = started | stopped | restarted

查看service模块的帮助文档信息

[root@redhat7 ~]#ansible-doc -s service

演示

[root@redhat7 ~]#ansible test -m service -a 'name=httpd state=restarted'
172.16.252.79 | SUCCESS => {
    "changed": true, 
    "name": "httpd", 
    "state": "started", 
    "status": {
            .........
            }
}
172.16.252.170 | SUCCESS => {
    "changed": true, 
    "name": "httpd", 
    "state": "started", 
    "status": {
            .........
            }
}
172.16.252.131 | SUCCESS => {
    "changed": true, 
    "name": "httpd", 
    "state": "started",
    "status": {
            .........
            } 
}

查看已经启动成功

[root@redhat7 ~]#ansible test -m shell -a 'ss -tnl | grep 80'
ansible 工作原理以及使用详解_第18张图片

三、ansible的playbook使用

有上面的演示我们体会到了ansible的强大,但是上面的演示都是一条一条指令的输入,这样未免影响了效率,有没有办法想shell脚本一样一次执行多条语句呢,答案是肯定的,只不过这里不叫shell脚本而叫playbook剧本

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

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

(1)YAML简介

YAML :YAML Ain‘t Markup Language; Yet Another Markup Language; 类似于半结构化数据,声明式配置;可读性较高的用来表达资料序列的格式,易于与脚本语言交互

官方站点:http://www.yaml.org

(2)语法格式

    1)任何数据结构都用缩进来标识,可以嵌套

    2)每一行是一个键值数据key:value,冒号隔开。若想在一行标识需要用{ }和,分隔格式

    3)列表用 – 标识

(3)Playbook组成结构

    Tasks : 任务,即调用模块完成的操作

    Variables : 变量

    Templates : 模板

    Handlers : 处理器,由某个条件触发执行的操作

    Roles : 角色

基本结构

        – host:webservices

        remote_user:

            – tasks:

            – task1

        module_name

    YAML文件扩展名通常为.yml,如test.yml。
2、playbook的使用:

前面的介绍我们知道了playbook的存储*.yaml文本中,我们创建一个yaml件验证下

(1)创建目录

[root@redhat7 ansible]#cd /etc/ansible
[root@redhat7 ansible]#mkdir -p roles/apache2/tasks

(2)创建tasks/main.yml

[root@redhat7 ansible]#vim roles/apache2/tasks/main.yml
- name: Install apache2 (RedHat)
  yum: name=httpd
  when: "ansible_os_family == 'RedHat'"
 
- name: Install apache2 (Debian)
  apt: name=apache2
  when: "ansible_os_family == 'Debian'"

ansible 工作原理以及使用详解_第19张图片

(3)创建 Playbook (site.yml)

[root@redhat7 ansible]#vim roles/apache2/tasks/site.yml
- name: Install Apache2
  hosts: test
  remote_user: root
 
  roles:
    - apache2

ansible 工作原理以及使用详解_第20张图片

(4)整在使用时我们最好先预运行下看有没有错误

[root@redhat7 ansible]#ansible-playbook --check roles/apache2/tasks/site.yml
ansible 工作原理以及使用详解_第21张图片

(5)执行

[root@redhat7 ansible]#ansible-playbook roles/apache2/tasks/site.yml

ansible 工作原理以及使用详解_第22张图片

官方的playbook例子:

https://github.com/ansible/ansible-examples

playbook文件加密

加密已存在的文件:

[root@redhat7 ansible]#ansible-vault encrypt

加密并创建文件

ansible-vault create filename

加密后的playbook

ansible 工作原理以及使用详解_第23张图片

执行加密后的playbook

[root@redhat7 ansible]#ansible-playbook roles/apache2/tasks/site.yml --ask-vault-pass
ansible 工作原理以及使用详解_第24张图片

解密

[root@redhat7 ansible]#ansible-vault decrypt roles/apache2/tasks/site.yml
ansible 工作原理以及使用详解_第25张图片

3.playbook-变量

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

(2)变量种类:

    1)facts:由远程主机发回的主机特有的属性信息,这些信息被保存在ansible变量中;无须声明,可直接调用;

    2)自定义变量:

    通过命令行传递:ansible-playbook  test.yml  –extra-vars "host=www user=test"

    通过roles传递

    3)主机变量:定义在inventory中的主机之后的变量;直接传递给单个主机的变量

实例:

在hosts中直接定义在主机之后

[root@redhat7 ~]#vim /etc/ansible/hosts

[web]
172.16.252.131 host=mail
172.16.252.170
172.16.252.79

组变量:定义在invetory中的组上的变量(例如在默认的文件/etc/ansible/hosts上编辑)

[websrvs]
172.16.252.131
172.16.252.170
 
[websrvs:vars]
host=mail

变量使用示例

[root@redhat7 ~]#vim useradd.yml

- host: websrvs
  remote_user: root
  vars:
 
username: testuser
password: 123456
 
   tasks:
 
- name: add user
  user: name={{ username }} state=present
 
- name: set passwd
  shell: /bin/echo {{ password }}|/usr/bin/passwd-stdin {{ username }}

注释:

1) {{ }} 调用变量

2) #ansible-playbook /PATH/TO/SOME_YAML_FILE  { -eVARS|–extra-vars=VARS}     

变量的重新赋值调用方法

[root@localhost ~]# ansible-playbookuseradd.yml –extra-vars "username=ubuntu"

ansible-playbook参考

(1)基础示例

[root@redhat7 ~]#vim base.yaml

- hosts: 172.16.252.131
 remote_user: root
 tasks:
 - name: install httpd server
    yum: name=httpd state=present
  - name: start httpd server
    service: name=httpd state=started

(2)handlers 示例

[root@redhat7 ~]## vim handlers.yaml

- hosts: 172.16.252.131
  remote_user: root
 
  tasks:
  - name: install httpd
    yum: name=httpd state=present
 
  - name: install configure file
    copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify: restart httpd server
 
  handlers:
  - name: restart httpd server
    service: name=httpd state=restarted

~]# vim /etc/httpd/conf/httpd.conf

修改Listen 80为Linsten 8080:

检查handlers.yaml文件是否有错误

[root@redhat7 ~]#ansible-playbook --syntax-check handlers.yaml

执行

[root@redhat7 ~]#ansible-playbook handlers.yaml
    
ansible 工作原理以及使用详解_第26张图片

在主机172.16.252.131上查看8080端口是否启动

ansible 工作原理以及使用详解_第27张图片

(3) tags示例
(做下面这个实验之前可以先把原来主机172.16.252.131上的 httpdyum remove httpd删除)

[root@redhat7 ~]#vim tags.yaml

- hosts: 172.16.252.131
  remote_user: root
 
  tasks:
  - name: install httpd
    yum: name=httpd state=present
 
  - name: install configure file
    copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
    tags: instconf
    notify: 'restart httpd server'
 
  handlers:
  - name: 'restart httpd server'
    service: name=httpd state=restarted

语法检查

ansible 工作原理以及使用详解_第28张图片

查验标签

ansible 工作原理以及使用详解_第29张图片

执行

ansible 工作原理以及使用详解_第30张图片

在172.16.252.131主机上验证httpd的8080端口是否开启(这里将httpd服务端口改为了8080)

ansible 工作原理以及使用详解_第31张图片

(4)variables(变量)示例:

[root@redhat7 ~]#vim variables.yaml

- hosts: 172.16.252.131
  remote_user: root
 
  tasks:
  - name: "install {{ package }}"
    yum:  "name={{ package }} state=present"


[root@redhat7 ~]#vim /etc/ansible/hosts
[websrvs]
172.16.252.131 package=httpd

语法检查:

[root@redhat7 ~]#ansible-playbook --syntax-check variables.yaml

执行:

[root@redhat7 ~]#ansible-playbook  variables.yaml
ansible 工作原理以及使用详解_第32张图片

在主机172.16.252.131上检查是否httpd安装成功:

ansible 工作原理以及使用详解_第33张图片

你可能感兴趣的:(ansible 工作原理以及使用详解)