ansible all -m shell -a 'free -h'
主机清单文件在修改后会立即生效,一般使用“ansible-inventory --graph”命令以结构化的方式显示出受管主机的信息。因为我们对受管主机进行了分组,因此这种方式非常便于我们的阅读。
[root@Master2 ~]# ansible-inventory --graph
@all:
|--@ES:
| |--192.168.1.188
| |--192.168.1.198
| |--192.168.1.221
|--@MQ:
| |--192.168.1.134
| |--192.168.1.199
| |--192.168.1.212
|--@Master:
| |--192.168.1.112
| |--192.168.1.222
|--@Redis:
| |--192.168.1.210
| |--192.168.1.211
| |--192.168.1.225
|--@file:
| |--192.168.1.179
| |--192.168.1.244
| |--192.168.1.250
|--@lb:
| |--192.168.1.226
| |--192.168.1.242
|--@ntv:
| |--192.168.1.101
| |--192.168.1.206
| |--192.168.1.224
| |--192.168.1.253
|--@ungrouped:
Ansible常用变量汇总
参数 | 作用 |
---|---|
ansible_ssh_host | 受管主机名 |
ansible_ssh_port | 端口号 |
ansible_ssh_user | 默认账号 |
ansible_ssh_pass | 默认密码 |
ansible_shell_type | Shell终端类型 |
用户只需要将对应的变量及信息填写到主机清单文件中,在执行任务时便会自动对账号和密码进行匹配,而不用每次重复输入它们。继续
修改主机清单文件:
[root@Master2 ~]# vim /etc/ansible/hosts
[dev]
192.168.10.20
[test]
192.168.10.21
[prod]
192.168.10.22
192.168.10.23
[balancers]
192.168.10.24
[all:vars]
ansible_user=root
ansible_password=redhat
还剩最后一步。将Ansible主配置文件中的第71行设置成默认不需要SSH协议的指纹验证,以及将第107行设置成默认执行剧本时所使用的管理员名称为root:
[root@Master2 ~]# vim /etc/ansible/ansible.cfg
69
70 # uncomment this to disable SSH key host checking
71 host_key_checking = False
72
………………省略部分输出信息………………
104
105 # default user to use for playbooks if user is not specified
106 # (/usr/bin/ansible will use current user as default)
107 remote_user = root
108
不需要重启服务,保证主机之间的网络能够互通是后续实验的基石。
运行临时命令
Ansible服务的强大之处在于只需要一条命令,便可以操控成千上万台的主机节点,而ansible命令便是最得力的工具之一。前文提到,Ansible服务实际上只是一个框架,能够完成工作的是模块化功能代码。Ansible的常用模块大致有20多个(见表16-5),本书将会在后面的实验中逐一详解。
偶尔遇到书中没有提及的模块,大家可以使用“ansible-doc模块名称”的命令格式自行查询,或是使用ansibe-doc -l命令列出所有的模块信息以供选择。
Ansible服务常用模块名称及作用
模块名称 | 模块作用 |
---|---|
ping | 检查受管节点主机网络是否能够联通。 |
yum | 安装、更新及卸载软件包。 |
yum_repository | 管理主机的软件仓库配置文件。 |
template | 复制模板文件到受管节点主机。 |
copy | 新建、修改及复制文件。 |
user | 创建、修改及删除用户。 |
group | 创建、修改及删除用户组。 |
service | 启动、关闭及查看服务状态。 |
get_url | 从网络中下载文件。 |
file | 设置文件权限及创建快捷方式。 |
cron | 添加、修改及删除计划任务。 |
command | 直接执行用户指定的命令。 |
shell | 直接执行用户指定的命令(支持特殊字符)。 |
debug | 输出调试或报错信息。 |
mount | 挂载硬盘设备文件。 |
filesystem | 格式化硬盘设备文件。 |
lineinfile | 通过正则表达式修改文件内容。 |
setup | 收集受管节点主机上的系统及变量信息。 |
firewalld | 添加、修改及删除防火墙策略。 |
lvg | 管理主机的物理卷及卷组设备。 |
lvol | 管理主机的逻辑卷设备。 |
在Ansible服务中,ansible是用于执行临时任务的命令,也就在是执行后即结束(与剧本文件的可重复执行不同)。在使用ansible命令时,必须指明受管主机的信息,如果已经设置过主机清单文件(/etc/ansible/hosts),则可以使用all参数来指代全体受管主机,或是用dev、test等主机组名称来指代某一组的主机。
ansible命令常用的语法格式为“ansible受管主机节点 -m模块名称[-a模块参数]”,常见的参数如表16-6所示。其中,-a是要传递给模块的参数,只有功能极其简单的模块才不需要额外参数,所以大多情况下-m与-a参数都会同时出现。
ansible命令常用参数
参数 | 作用 |
---|---|
-k | 手动输入SSH协议密码 |
-i | 指定主机清单文件 |
-m | 指定要使用的模块名 |
-M | 指定要使用的模块路径 |
-S | 使用su命令 |
-T | 设置SSH协议连接超时时间 |
-a | 设置传递给模块的参数 |
--version | 查看版本信息 |
-h | 帮助信息 |
如果想实现某个功能,但是却不知道用什么模块,又或者是知道了模块名称,但不清楚模块具体的作用,则建议使用ansible-doc命令进行查找。例如,列举出当前Ansible服务所支持的所有模块信息:
[root@Master2 ~]# ansible-doc -l
一般情况下,很难通过名称来判别一个模块的作用,要么是参考模块后面的介绍信息,要么是平时多学多练,进行积累。例如,接下来随机查看一个模块的详细信息。ansible-doc命令会在屏幕上显示出这个模块的作用、可用参数及实例等信息:
[root@Master2 ~]# ansible-doc a10_server
> A10_SERVER (/usr/lib/python2.7/site-packages/ansible/modules/network/a10/a10_server.py)
Manage SLB (Server Load Balancer) server objects on A10 Networks devices via aXAPIv2.
* This module is maintained by The Ansible Community
OPTIONS (= is mandatory):
- client_cert
PEM formatted certificate chain file to be used for SSL client authentication.
This file can also include the key as well, and if the key is included, `client_key' is not required.
[Default: (null)]
type: path
- client_key
………………省略部分输出信息………………
已经成功地将受管主机的IP地址填写到主机清单文件中,接下来小试牛刀,检查一下这些主机的网络连通性。ping模块用于进行简单的网络测试(类似于常用的ping命令)。可以使用ansible命令直接针对所有主机调用ping模块,不需要增加额外的参数,返回值若为SUCCESS,则表示主机当前在线。
[root@Master2 ~]# ansible all -m ping
192.168.1.242 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.226 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.225 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@Master2 ~]# ansible all -m shell -a 'date'
192.168.1.226 | CHANGED | rc=0 >>
Thu Sep 23 14:53:58 CST 2021
192.168.1.225 | CHANGED | rc=0 >>
Thu Sep 23 15:05:32 CST 2021
192.168.1.242 | CHANGED | rc=0 >>
Thu Sep 23 15:03:34 CST 2021
192.168.1.211 | CHANGED | rc=0 >>
Thu Sep 23 15:05:32 CST 2021
192.168.1.210 | CHANGED | rc=0 >>
Thu Sep 23 15:06:19 CST 2021
192.168.1.199 | CHANGED | rc=0 >>
Thu Sep 23 15:06:01 CST 2021
192.168.1.101 | CHANGED | rc=0 >>
剧本文件实战
在很多情况下,仅仅执行单个命令或调用某一个模块,根本无法满足复杂工作的需要。Ansible服务允许用户根据需求,在类似于Shell脚本的模式下编写自动化运维脚本,然后由程序自动、重复地执行,从而大大提高了工作效率。
Ansible服务的剧本(playbook)文件采用YAML语言编写,具有强制性的格式规范,它通过空格将不同信息分组,因此有时会因一两个空格错位而导致报错。大家在使用时要万分小心。YAML文件的开头需要先写3个减号(---),多个分组的信息需要间隔一致才能执行,而且上下也要对齐,后缀名一般为.yml。剧本文件在执行后,会在屏幕上输出运行界面,内容会根据工作的不同而变化。在运行界面中,绿色表示成功,黄色表示执行成功并进行了修改,而红色则表示执行失败。
剧本文件的结构由4部分组成,分别是target、variable、task、handler,其各自的作用如下。
target:用于定义要执行剧本的主机范围。
variable:用于定义剧本执行时要用到的变量。
task:用于定义将在远程主机上执行的任务列表。
handler:用于定义执行完成后需要调用的后续任务。
YAML语言编写的Ansible剧本文件会按照从上到下的顺序自动运行,其形式类似于Shell脚本,但格式有严格的要求。例如,创建一个名为packages.yml的剧本,让dev、test和prod组的主机可以自动安装数据库软件,并且将dev组主机的软件更新至最新。
安装和更新软件需要使用yum模块。先看一下帮助信息中的示例吧:
[root@Master2 ~]# aansible-doc yum
> YUM (/usr/lib/python3.6/site-packages/ansible/modules/packaging/os/yum.py)
Installs, upgrade, downgrades, removes, and lists packages and
groups with the `yum' package manager. This module only works
on Python 2. If you require Python 3 support see the [dnf]
module.
* This module is maintained by The Ansible Core Team
* note: This module has a corresponding action plugin.
………………省略部分输出信息………………
EXAMPLES:
- name: install the latest version of Apache
yum:
name: httpd
state: latest
在配置Ansible剧本文件时,ansible-doc命令提供的帮助信息真是好用。在知道yum模块的使用方法和格式后,就可以开始编写剧本了。初次编写剧本文件时,请务必看准格式,模块及play(动作)格式也要上下对齐,否则会出现“参数一模一样,但不能执行”的情况。
综上,一个剧本正确的写法应该是:
[root@Master2 001.ansible]# cat test.yml
---
- name: Install Packages
hosts: Master,ES,MQ,Redis
remote_user: root
ignore_errors: yes
tasks:
- name: Install htop
yum: name=htop state=latest
- name: synd hosts file
copy: src=/etc/hosts dest=/etc/hosts
在执行成功后,我们主要观察最下方的输出信息。其中,ok和changed表示执行及修改成功。如遇到unreachable或failed大于0的情况,建议手动检查剧本是否在所有主机中都正确运行了,以及有无安装失败的情况。
创建及使用角色
在日常编写剧本时,会存在剧本越来越长的情况,这不利于进行阅读和维护,而且还无法让其他剧本灵活地调用其中的功能代码。角色(role)这一功能则是自Ansible 1.2版本开始引入的新特性,用于层次性、结构化地组织剧本。角色功能分别把变量、文件、任务、模块及处理器配置放在各个独立的目录中,然后对其进行便捷加载。简单来说,角色功能是把常用的一些功能“类模块化”,然后在用的时候加载即可。
Ansible服务的角色功能类似于编程中的封装技术—将具体的功能封装起来,用户不仅可以方便地调用它,而且甚至可以不用完全理解其中的原理。就像普通消费者不需要深入理解汽车刹车是如何实现的,制动总泵、刹车分泵、真空助力器、刹车盘、刹车鼓、刹车片或ABS泵都藏于底层结构中,用户只需要用脚轻踩刹车踏板就能制动汽车。这便是技术封装的好处。
角色的好处就在于将剧本组织成了一个简洁的、可重复调用的抽象对象,使得用户把注意力放到剧本的宏观大局上,统筹各个关键性任务,只有在需要时才去深入了解细节。角色的获取有3种方法,分别是加载系统内置角色、从外部环境获取角色以及自行创建角色。
加载系统内置角色
在使用RHEL系统的内置角色时,我们不需要联网就能实现。用户只需要配置好软件仓库的配置文件,然后安装包含系统角色的软件包rhel-system-roles,随后便可以在系统中找到它们了,然后就能够使用剧本文件调用角色了。
[root@linuxprobe ~]# dnf install -y rhel-system-roles
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
Last metadata expiration check: 1:06:26 ago on Tue 13 Apr 2021 07:22:03 AM CST.
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
rhel-system-roles noarch 1.0-5.el8 AppStream 127 k
Transaction Summary
================================================================================
Install 1 Package
………………省略部分输出信息………………
Installed:
rhel-system-roles-1.0-5.el8.noarch
Complete!
评论区