一、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 的组成由 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文件中
[test表示控制的组可以根据实际进行定义,下面添加主机列表]
3、命令模块
这也是默认的模块,也就是不加-m指定模块时默认的模块,这个模块不能使用包含管道的命令。
[root@centos7 ~]#ansible-doc -s command
演示:
[root@centos7 ~]#ansible test -a 'date'
4、shell模块
shell模块也是可以执行命令,与command模块不同的是,command模块不能执行包含管道的模块,而shell可以
[root@centos7 ~]#ansible-doc -s shell
演示:
[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
演示:
[root@centos7 ~]#ansible test -m copy -a 'src=/etc/issue dest=/tmp/issue.txt mode=600'
查看测试成功
[root@centos7 ~]#ansible test -a 'ls /tmp/issue.txt'
6、cron模块:分发定期任务
[root@centos7 ~]#ansible-doc -s cron
演示:每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"'
7、yum模块:顾名思义,该模块可以管理软件的安装和卸载,state=present(安装) absent(卸载)
[root@centos7 ~]#ansible-doc -s yum
演示:
[root@centos7 ~]#ansible test -m yum -a 'name=tree state=present'
测试安装是否成功
[root@centos7 ~]#ansible test -a 'rpm -q httpd'
8、service模块
state=started/stopped/restarted
[root@centos7 ~]#ansible-doc -s service
演示:
现在的httpd服务是停止的,我们重启一下
[root@centos7 ~]#ansible test -m service -a 'name=httpd state=started '
查看已经启动成功
[root@centos7 ~]#ansible test -m shell -a 'ss -tnl|grep 80'
三、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
没有问题就可以正式运行命令脚本了
[root@centos7 ansible]#ansible-playbook test.yaml
检查测试成功
[root@centos7 ansible]#ansible test -a 'tail -1 /etc/group'
3、playbook变量
(1)变量命名:字母、数字和下划线组成,仅能以字母开头;
(2)变量种类:
- facts:由远程主机发回主机特有的属性信息,这些信息被保存在ansible变量中;无需声明,可直接调用
- 自定义变量:
- 通过命令行传递:ansible-playbook test.yaml -extra-vars "host=www user=test"
- 通过roles传递
- 主机变量:定义在inventory中的主机之后的变量;直接传递给单个主机的变量