Redhat8.0 ansible的常用模块以及实战演示。

2023-05-16

Ansible是最新出现的开源自动化运维工具也可以说是一种语言,由于它的强大易懂无代理等无数个优点,让Ansible迅速在运维界备受关注。
总之理解为它很牛逼就对了!
如果你将Ansible当成一个语言或许会更贴切一点,因为我们在学习Ansible的时候要使用大量集成进Ansible中的python模块,语法是YML格式。当你写好一个特定的Ansible代码,你可以在所有合适的环境下运行这个剧本,它会神奇的听你的话一步一步的执行,直到完成你所设置的工作,毕竟是你创造了这个playbook。
那么,ansible到底是个什么东西呢?
Ansible是一个开源自动化运维平台。Ansible是一个可以在Ansible playbook中在完美描述IT应用架构的 简单的自动化语言。它也是一个运行Ansible Playbook的自动化引擎。

Ansible可以管理强大的自动化任务,并且可以适应许多不同的工作流和环境。同时,Ansible的新使用者 可以非常快速的使用它并将其带入生产环境。
上面这些都是官方给的解释。
那么,用我们的大白话说呢?
其实ansible可以比作为你在拍一场戏,你是导演,剧本也是你写的,主角和配角都是你的主机和你要管理的机器。
但是你不用花费太大的精力去弄演员,因为这里的每一个演员,只需要ssh协议就能替你进行,你自己制定的剧本,要怎么进行演戏。

Ansible的特点:

简单的Ansible-Simple Ansible Playbooks是容易理解,容易看懂的。playbooks是非常容易理解和修改的自动化工具。不需要特 别复杂的编程能力就能写playbook。playbook顺序执行task。playbook简单涉及让每个团队都能很容易 上手使用。
强大的Ansible-Powerful 你可以使用ansible来部署应用,进行配置管理,工作流自动化运维,网路自动化运维。Ansible可用于协调 整个应用程序生命周期。
无代理的Ansible-Agentless Ansible被建立为无代理的架构。通常,Ansible通过使用OpenSSH或WinRM来连接到被管理的主机并且 经常(但不全是)通过向被管理主机推送叫Ansible模块的小程序来运行tasks。这些程序用于将系统置于 特定的期望状态。任何被推送的模块当ansible任务执行完之后将会被移除。你可以很快的上手ansible,因 为ansible在被管理主机上不需要任何特殊的代理。因为客户端没有代理,所以Ansible是更高效的并且相 比其他的自动化运维工具更安全。

官方给的一大堆解释,看不懂啥玩意。

我对ansible的见解就是。
可以管理很多台服务器,你就是上帝,你让他们怎么做他们就得怎么做,他们必须按照你的命令来执行。
你根本不需要在被管理的主机上安装什么乱七八槽的软件来配合你这个上帝的演出,它们每个人身上只需要支持ssh足矣,而且放心它们在传输的过程中安全的一批。
而且ansible写代码,不需要秃头哟~~~

Ansible概念和架构-个人理解

在ansible的架构中,有两种东西,管理者和被管理者。
管理者“控制节点”,被管理者“被管理的主机”
控制节点是安装Ansible的机器,当然,这个“上帝”可以随时被替换,只要是安装Ansible的机器都可以成为“上帝”,管理节点就是好似与“免费的工具人”。

在Ansible中也有一个库存之类的东西。
这个库存是用来存放所有被管理主机可达到的地址,可以根据被管理主机的特性来分组,比如,我有200台机器,100台机器在上海,100台机器在河南经贸(我的母校),那么我就可以给河南经贸这100台机器创建一个组,在上海的100台机器我再给他创建一个组,这样就会使我们的管理更具有条理性。

接下来开始实战演练:

写第一个playbook。

先来配置一下ansible的环境。
安装的方法在上一篇博客中,可以自行查找。
先来配置免密登陆,方便后面的操作。

[root@ansible ~]# ssh-keygen   ##一路回车到底
[root@test ~]# ssh-copy-id test   
[root@nginx ~]# ssh-copy-id nginx

当你安装好ansible后,会自动出来ansible的配置目录和文件
cd /etc/ansible
这个里面,存放着ansible的配置文件,其中的ansible.afg是ansible的主配置文件。
我们可以自己配置一个文件,方便操作。

[root@guochanghe ~]# mkdir guohe
[root@guochanghe ~]# cd guohe/
[root@guochanghe ~]#vim ansible.afg
[defaults]
inventory = ./inventory   #我们就定义我们的inventory文件在当前目录
remote_user = root       #我们使用被管理主机root用户来执行
ask_pass = false			#每次执行的时候是否需要输入密码
[root@guochanghe ~]#vim inventory
test #test和nginx是我定义的管理机。
nginx 
#测试一下,ping一下,使用ansible命令
[root@guochanghe guohe]# ansible all -m ping
test | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
nginx | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
成功。

接下来继续配置文件
[root@guochanghe ~]#vim ansible.afg
[defaults]
inventory = ./inventory #我们就定义我们的inventory文件在当前目录
remote_user = root #我们使用被管理主机root用户来执行
ask_pass = false #每次执行的时候是否需要输入密码
[privilege_escalation]
become = true #becmoe表示是否要提权
becom_method = sudo #表示提权的方式。
becom_user = root #表示提权到什么用户
becom_ask_pass = false #表示提权是否需要密码

关于inventory = ./inventory ,因为我是在guohe这个目录下进行定义,所以我想指定在当前目录,用的./这个路径,当然也可以写绝对路径/root/guohe/inventory

开始编写第一个yml文件,用来执行。

[root@guochanghe ~]#vim gch.yml
---
- name: 这是我人生中第一次写ansible执行
  hosts: test
  tasks:
          - name: 我们用yum来给我的test主机安装一个httpd服务
            yum:
                    name: httpd
                    state: installed 
要注意的:
1、对于大小写非常的敏感
2、使用空格来表示层级关系的 我们可以看到 开头三个杠别问为什么,我也不知道
第二列- name 一个层的就是代表我们的剧本中的第一个plays啦 这个plays操作的对象就是test的主机啦
3、我们可以看到tasks下面就开始写我们的剧情啦,我写的是让test主机安装一个httpd的剧情
但是细心的同学就会发现 tasks下面的缩进怎么比上面的长呢,因为它们从这里开始就不是一个层级啦 注意 缩进必须是空格 不能Tab键 缩多少懂没关系只要比上面的层长就对了
那tasks写完了,我们要开始写tasks下面的剧情是什么了对吧 – name描述开头 就对了
不要问我为什么- -因为好看 ,我们的剧情是使用yum模块对吧,然后我们写yum –使用模块就这么简单 然后我们要使用yum模块给我们的tasks安装什么东西对吧,这里就会发现 下面的内容又不是一个层级了,如果还写在同一个层级,那么就是第二你要用的模块了 ,   
 开始检查一下语法是否错误:
 [root@guochanghe ~]#ansible-playbook --syntax-check gch.yml
 如果一片红,就说明缩进和层级有问题。同级别的缩进要一摸一样的哟。
 然后开始演练一下,这是ansible的特色功能之一,演练:
  [root@guochanghe ~]#ansible-playbook -C gch.yml
  PLAY [这是我人生中第一次写ansible执行] **********************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [test]

TASK [我们用yum来给我的test主机安装一个httpd服务] **************************************************************************************************************
ok: [test]

PLAY RECAP **************************************************************************************************************************************
test                       : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
由此我们可以看出演练没毛病,所以我们就把-C去掉。
但是,当我们做完了,想检查是否成功安装,我们可以使用ansible命令来检查。
[root@guochanghe guohe]# ansible test -a "yum list installed httpd"
[WARNING]: Consider using the yum module rather than running 'yum'.  If you need to use command because yum is insufficient you can add 'warn:
false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
test | CHANGED | rc=0 >>
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.
已安装的软件包
httpd.x86_64                2.4.37-10.module+el8+2764+7127e69e                @b
可以看出,已经安装成功了,不要管提示,目前接触不到。其实也是因为懒,懒得看了。嘻嘻(#^.^#)

看到这,我相信肯定会有很多人疑问,inventory,这个文件。
这到底是是个什么东西呢?
他是在哪里呢?
他在干啥呢?
他有啥写法呢?
其实,关于inventory,
因为Ansible的配置文件可以放在任意地方,所以我之前在/guohe目录下建了一个ansible的配置文件
ansible.afg,里面不是定义了inventory放在哪了吗,这就是他的位置。
所以说,我们在ansible配置文件里制定在哪,那么它就是在那个地方老老实实的待着,哪也不能去。去了腿打断,嘿嘿嘿。
但是疑问来了,这个玩意文件是个啥东西呢?有啥用呢?
因为,我们已经知道他是由ansible配置文件来创造出来的,
对于inventory,我百度翻译给的意思是,“库存”,那么库存我们应该第一时间想到的就是一个用来存放东西的文件。
那么它存什么呢?
其实它是存放被管理主机可达地址的一个文件,我们可以存被管理主机的域名, 也可以存被管理主机的IP地址和主机名。

请允许我自己杠一下我自己。
你BB那么多,那么inventory有啥用呢?
嘿,你别急,它的用处还真挺大。
我们使用ansible的核心是批量管理很多很多很多的主机,那么如何让他们老老实实服服帖帖的照顾我呢?
这个时候就体现出来了inventory的作用,我们可以把他们的地址放到inventory文件里面,这样,它们就能老老实实服服帖帖的照顾你,听你的话啦,是不是用处很大。哈哈

回顾之前写的yml文件,其实就是一个剧本。
我们在写的那个剧本里面写的plays里的hosts,这里就是你想让谁来享受下面的操作了,那个被选中的幸运蛋就是从inventory中挑选出来的。
这样一来,是不是顿悟了这个文件到底是啥用的。

但是,之前的那种写法太low了,只能适用几台机器。
如果,河南经贸有1000台机器,上海有1000台机器,我想让河南经贸的所有机器都配合我出演,要一点一点的写吗?不!
有更高级的写法!
我们可以定义一个组,这个组就叫河南经贸,然后把河南经贸的地址都放到这个组里面
[root@ansible guohe]# vim inventory
[河南经贸]



[上海]



这样就完成了。然后在剧本修改一下。
[root@ansible guohe]# vim gch.yml

  • name: 这是我人生中第一次写ansible执行
  • hosts: 河南经贸

  • 这样就能让河南经贸的所有机器配合我的出演。

但是疑问又来了,被管理的主机可以再多个组吗?
答案是,可以的。
例如:
[root@ansible guohe]#vim inventory
[夏邑]
test
nginx
eee
[河南经贸]
he
nan
jing
mao
[上海]
shang
hai
hao
如果,我们想让河南经贸和上海的一些主机,给夏邑来管,我们就可以写成这样。
[root@ansible guohe]#vim inventory
[夏邑]
test
nginx
eee
mao
hai
[河南经贸]
he
nan
jing
mao
[上海]
shang
hai
hao
这样,mao和hai两个管理主机就能被夏邑共享管着。

还有一个组的名字叫:
嵌套组。
哇哦,嵌套组,好6666,名字好高大上啊!!
其实并不是,嵌套组,很简单,看我操作~
[root@ansible guohe]#vim inventory
[河南经贸]
test
nginx
[上海]
shang
hai
[夏邑:children]
河南经贸
上海
这样就将上海和河南经贸的所有机器共享给夏邑来管

ansible的inventory使用“:children”来表示嵌套组

我们也可以指定主机的范围。
inventory是可以写被管理主机的范围。
用正则来写。
如果写[1:20]
就是匹配1-20个。
如果写[01:10],就是匹配01 02 03 … 10
192.168.[4:7].[0:255] 匹配192.168.4.0/22网络
server[01:20].example.com匹配server01.example.com到server20.example.com,不会匹配 server1.example.com
[a:c].dns.example.com将会匹配a.dns.example.com,b.dns.example.com,c.dns.example.com
2001:db8::[a:f]将会匹配所有从2001:db8::a到2001:db8::f的地址
[上海]
fei[01:02].example.com
[河南经贸]
fei[1:2].example.com
这样写就大大的缩短了时间,很方便效率。

接下来就进入了最终章,常用的模块。
command 模块
ping 模块
yum 模块
service 模块
copy 模块
file模块
user模块
get_url 模块

  • command模块
    ansible 主机 –m command –a ‘linux命令’
  • ping模块
    ansible all -m ping #ping所有的管理机
  • yum 模块
    在这里插入图片描述
  • service 模块
---
- name: httpd开启服务
  hosts: test
  tasks:
          - name: 使用service模块把test的httpd服务全部启动起来
            service:
                    name: httpd
                    state: started #restarted重启 stopped停止
                    enabled: yes #yes开机启动 no开机不自启动
[root@guochanghe guohe]# ansible-playbook  gh.yml 

PLAY [httpd开启服务] ********************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [test]

TASK [使用service模块把test的httpd服务全部启动起来] ***********************************************************************************************************
ok: [test]

PLAY RECAP **************************************************************************************************************************************
test                       : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
  • copy 模块
---
- name: copy复制
  hosts: test
  tasks:
          - name: 使用copy模块在本地复制文件给test主机
            copy:
                    src: gh.yml			#复制本地的什么文件
                    dest: /root/gh.yml #复制到被管理机器test的什么位置
                    owner: root 		#文件的拥有者是谁
                    group: root			#文件的所属组是谁
                    mode: 0644			#文件的权限是什么
[root@guochanghe guohe]# ansible-playbook  copy.yml 

PLAY [copy复制] ***********************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [test]

TASK [使用copy模块在本地复制文件给test主机] *******************************************************************************************************************
ok: [test]

PLAY RECAP **************************************************************************************************************************************
test                       : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
#去到test上查看一下。
[root@test ~]# ls -ld gh.yml 
-rw-r--r--. 1 root root 251 5月  12 12:03 gh.yml
#成功运行。
  • file模块
---
- name: file模块
  hosts: test
  tasks:
          - name: 使用file模块给test主机创建一个软连接文件
            file:
                    src: /etc/fstab		#给这个文件创建一个软连接
                    dest: /tmp/fstab	#连接到/tmp/fstab
                    owner: root			#拥有者的权限
                    group: root			#所属组的权限
                    state: link			#创建软连接
                    #如果想创建目录就是directory
                    #file 创建文件
                    #hard创建硬连接,可以自己进行测试。
[root@guochanghe guohe]# ansible-playbook -C file.yml 

PLAY [file模块] ***********************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [test]

TASK [使用file模块给test主机创建一个软连接文件] *****************************************************************************************************************
ok: [test]

PLAY RECAP **************************************************************************************************************************************
test                       : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
#去到test主机上查看
[root@test tmp]# ll -ld fstab 
lrwxrwxrwx. 1 root root 10 5月  12 12:09 fstab -> /etc/fstab
#发现开头是l,而且成功创建了软连接
  • user 模块
    user模块的作用,顾名思义,就是系统的账户管理。
#user的创建
---
- name: user模块
  hosts: test
  tasks:
          - name: 使用user模块创建一个用户
            user:
                    name: jxm
                    password: "redhat"
                    uid: 2020
[root@guochanghe guohe]# ansible-playbook user.yml 

PLAY [user模块] ***********************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [test]

TASK [使用user模块创建一个用户] ***************************************************************************************************************************
[WARNING]: The input password appears not to have been hashed. The 'password' argument must be encrypted for this module to work properly.
changed: [test]

PLAY RECAP **************************************************************************************************************************************
test                       : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
#不用管紫色警告。
#既然有创建,就一定会有删除
---
- name: 删除用户
  hosts: test
  tasks:
          - name: 使用user模块删除一个用户
            user:
                    name: jxm
                    state: absent
                    remove: yes
[root@guochanghe guohe]# ansible-playbook userdel.yml 

PLAY [删除用户] *************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [test]

TASK [使用user模块删除一个用户] ***************************************************************************************************************************
changed: [test]

PLAY RECAP **************************************************************************************************************************************
test                       : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
#删除成功
[root@guochanghe guohe]# ansible test -a " ls /home"
test | CHANGED | rc=0 >>
admin11
gch
gh
user1
user111
user2
#确定删除成功
  • get_url模块
---
- name: get_url模块
  hosts: test
  tasks:
          - name: 使用get_url模块从网上下载一个文件到test主机上
            get_url:
                    uel: https://redhat.com/path/lvjie.txt #下载地址,这个网址好像失效了,别用。自己找网址下载测试
                    dest: /root/lvjie.txt #下载到哪里

到这,就告一段落了,关于Redhat8.0 ansible的常用模块以及ansible的概念就结束了,刚开始接触ansible没多长时间,有些理解还不是很深,写这个博客记录一下,如有不足,欢迎交流,共同增进技术,谢谢大家的阅读。
以后会经常发自己在学习上的见解和收获,借此记录下来。
----来自河南经贸19级计算机工程学院的一名普通学生。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redhat8.0 ansible的常用模块以及实战演示。 的相关文章

  • 二、nodeJS 项目架构详解(app.js + Express + Http)

    参考 xff1a https www cnblogs com ostrich sunshine p 7474471 html 其中重点文件 文件夹说明 xff1a techNode xff1a bin www 启动运行 xff08 服务端口
  • centos 安装freeswitch

    首先安装freeswitch的运行库 更新yum yum update 安装依赖 yum install y git gcc c 43 43 wget alsa lib devel autoconf automake bison broad
  • Visio、Matlab高清图片插入word文档的几种方法。

    2023 3 30 直接参考这两个就行了 xff0c 不用花里胡哨的 MATLAB 1 重要的第一步 xff0c 另存为png图片 xff1b 2 导出之前先设置分辨率 xff0c 很多期刊要求600dpi 这一步很关键 Visio 1 重
  • CTF Crypto---RSA NC不互素

    题目 span class token keyword from span Crypto span class token punctuation span Util span class token punctuation span nu
  • 看一看Ubuntu的目录结构

    先了解一下Ubuntu的目录结构 xff0c 对于后面学习Ubuntu软件安装和使用都有帮助 一 Linux没有盘符这个概念 Windows存在多个驱动器盘符 xff0c 每个盘符形成多个树形并列的情形 xff0c Linux没有盘符这个概
  • 【C语言】——结构体进阶:结构体的内存对齐(超详细)

    前言 xff1a 上一篇已经讲了结构体的基本用法 相信各位小伙伴以经学会怎么使用 但是还有一个问题没有弄明白 结构体到底多大 xff0c 占内存空间多不多 xff0c 以经系统到底怎么访问结构体内的数据的 接下来 xff0c 详细分析一下结
  • [OpenCV实战]15 基于深度学习的目标跟踪算法GOTURN

    目录 1 什么是对象跟踪和GOTURN 2 在OpenCV中使用GOTURN 3 GOTURN优缺点 4 参考 在这篇文章中 xff0c 我们将学习一种基于深度学习的目标跟踪算法GOTURN GOTURN在Caffe中搭建 xff0c 现在
  • **在Linux的shell脚本里激活conda 虚拟环境**

    在Linux的shell脚本里激活conda 虚拟环境 之前突发其想 xff0c 既然在命令行可以通过conda activate tf激活tf的虚拟环境 xff0c 那么能不能写个脚本实现呢 xff1f 费了好大劲 xff0c 发现并不行
  • Hierarchical Russian Roulette for Vertex Connections论文研读

    第二篇论文研读文章了 xff0c 虽然依旧很菜 xff0c 但这一篇开始就相对轻松一点了 文档种有些问题 xff0c 其中所有 实时 应该替换为 高效 Hierarchical Russian Roulette for Vertex Con
  • ARM通用中断控制器GIC之中断控制

    在阅读本章之前 xff0c 可以参考笔者之前关于GIC的一些描述 xff1a ARM通用中断控制器GIC generic Interrupt Controller 简介 ARM架构Generic Interrupt Controller G
  • 最小生成树之Kruskal算法

    给定一个无向图 xff0c 如果它任意两个顶点都联通并且是一棵树 xff0c 那么我们就称之为生成树 Spanning Tree 如果是带权值的无向图 xff0c 那么权值之和最小的生成树 xff0c 我们就称之为最小生成树 MST Min
  • xcode11解决:xcode multiple commands produce .../xxx/Assets.car

    最近在xcode 11上使用pod碰到一个问题 xff0c Assets car被生成多次 问题如下 xff1a Multiple commands produce 39 Users luowei Library Developer Xco
  • 算法 —— 冒泡排序

    冒泡排序 冒泡排序是比较两个相邻元素 xff0c 如果它们不符合预期的顺序就交换的一个排序过程 冒泡排序就像水中气泡上升到水面的运动一样 xff0c 数组的每个元素在每次迭代中都把当前迭中最大 或最小 的元素移动到最后 xff0c 因此被称
  • UICollectionView viewForSupplementaryElementOfKind 不调用

    发现UICollectionView 的 方法不调用 func collectionView collectionView UICollectionView viewForSupplementaryElementOfKind kind St
  • UICollectionViewCell 自动大小的两种常用方式

    方法一 xff1a 自动计算 override func viewDidLoad super viewDidLoad if let flowLayout 61 collectionView collectionViewLayout as U
  • UITableViewCell 图片自适应

    常见的一种方法是异步Completed时 xff0c 根据图片大小计算cell的高度并缓存到字典里后 xff0c 刷新tableView或indexPath 但这里介绍另一种更好的方式是使用约束处理 xff0c 对imageView的上下左
  • Swift编译死锁问题

    最近在Swift OC混编项目里遇到个奇怪的问题 xff0c 这样一行代码尽然引发了Swift编译过程死锁 xxSwiftModel salary 61 xxOCModel salary doubleValue 如果哪位大神知道根因 xff
  • 多线程及聊天室程序

    1 一个多线程程序 新建一个 win32 console application 取名 xff1a MultiThread 选空的工程 xff0c 并建立一个名为 MultiThread 的源文件编辑 xff1a include inclu
  • SQL Server 2008语句大全完整版

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 设置内存选项 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • Swift从相册选择图片,图文混排并且可以保存、上传数据

    博主最近突发奇想想做一个自己的日记本App xff0c 在过程中遇到了一些坑 xff0c 摸索了很久才做出一个简单的日记本功能 先来看看一下效果吧 xff1a 先来说说这次用到的一些东西吧 xff1a 1 UIImagePickerCont

随机推荐