侧边栏壁纸
博主头像
WinJay博主等级

博观而约取 厚积而薄发

  • 累计撰写 317 篇文章
  • 累计创建 169 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Ansible

WinJay
2021-09-23 / 0 评论 / 0 点赞 / 61 阅读 / 7,166 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2021-12-27,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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:

image.png

Ansible常用变量汇总

参数作用
ansible_ssh_host受管主机名
ansible_ssh_port端口号
ansible_ssh_user默认账号
ansible_ssh_pass默认密码
ansible_shell_typeShell终端类型

用户只需要将对应的变量及信息填写到主机清单文件中,在执行任务时便会自动对账号和密码进行匹配,而不用每次重复输入它们。继续

修改主机清单文件:

[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

image.png

一般情况下,很难通过名称来判别一个模块的作用,要么是参考模块后面的介绍信息,要么是平时多学多练,进行积累。例如,接下来随机查看一个模块的详细信息。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
………………省略部分输出信息………………

image.png

已经成功地将受管主机的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 >>

image.png
image.png

剧本文件实战

在很多情况下,仅仅执行单个命令或调用某一个模块,根本无法满足复杂工作的需要。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

image.pngimage.png

在执行成功后,我们主要观察最下方的输出信息。其中,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!
0

评论区