内容:
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无服务器端,使用时直接运行命令即可,同时不需要在被管控主机上安装任何客户端,因此ansible是一个十分轻量级的工具,可以在epel源进行安装,ansible已经被红帽收购,相信不久会被收入base源
配置好epel源后直接yum安装ansible
查看ansible相关信息:
安装ansible:
[root@redhat7 ~]#yum -y install ansible
查看生成的主要配置文件:
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的控制主机,另外三台作为被管理的机器节点
1、ansible的连接:
通过前面的介绍我们知道,ansible是基于ssh协议来进行数据传输,ssh连接一般有两种方法,一种是使用密码密钥,一种是使用公私密码免密码登录,为了顺利使用ansible,下面配置基于公私密码免密码登录
(1)生成密匙对
[root@redhat7 ~]#ssh-keygen -t rsa
(2)查看已经成功生成了一对密钥
(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
[test]
表示控制的组名可以根据实际进行定义,下面添加主机列表
3、命令模块:
这也是默认的模块,也就是不加-m
指定模块时默认的模块,这个模块不能使用包含管道的命令。
查看command命令模块的帮助信息:
[root@redhat7 ~]#ansible-doc -s command
演示:
[root@redhat7 ~]#ansible test -a 'date'
4、shell模块:
shell模块也是可以执行命令,与comman模块不同的时,command模块不能执行包含管道的命令,而shell可以
查看shell
模块的帮助信息说明:
[root@redhat7 ~]#ansible-doc -s shell
演示:
[root@redhat7 ~]#ansible test -m shell -a 'echo 111 > /tmp/test.txt'
在客户端查看已经生成文件:
5、copy模块:可以把本机的文件拷贝至被管理的机器,通常用于分发配置文件
查看copy
模块的帮助文件信息:
演示:
[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'
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"'
查看客户端已经成功添加计划任务
[root@redhat7 ~]#ansible test -a 'crontab -l'
7、yum模块:顾名思义,该模块可以管理软件的安装和卸载,state=present(安装) adsent(卸载)
查看yum
模块的帮助信息
[root@redhat7 ~]#ansible-doc -s yum
演示
[root@redhat7 ~]#ansible test -m yum -a 'name=tree state=present'
测试安装成功
[root@redhat7 ~]#ansible test -a 'rpm -q tree'
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的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'"
(3)创建 Playbook (site.yml)
[root@redhat7 ansible]#vim roles/apache2/tasks/site.yml
- name: Install Apache2
hosts: test
remote_user: root
roles:
- apache2
(4)整在使用时我们最好先预运行下看有没有错误
[root@redhat7 ansible]#ansible-playbook --check roles/apache2/tasks/site.yml
(5)执行
[root@redhat7 ansible]#ansible-playbook roles/apache2/tasks/site.yml
官方的playbook例子:
https://github.com/ansible/ansible-examples
playbook
文件加密
加密已存在的文件:
[root@redhat7 ansible]#ansible-vault encrypt
加密并创建文件
ansible-vault create filename
加密后的playbook
执行加密后的playbook
[root@redhat7 ansible]#ansible-playbook roles/apache2/tasks/site.yml --ask-vault-pass
解密
[root@redhat7 ansible]#ansible-vault decrypt roles/apache2/tasks/site.yml
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
在主机172.16.252.131上查看8080端口是否启动
(3)
tags
示例
(做下面这个实验之前可以先把原来主机172.16.252.131上的
httpd
用
yum 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
语法检查
查验标签
执行
在172.16.252.131主机上验证httpd的8080端口是否开启(这里将httpd服务端口改为了8080)
(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
在主机172.16.252.131上检查是否httpd安装成功: