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

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 模块
    Redhat8.0 ansible的常用模块以及实战演示。_第1张图片
  • 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级计算机工程学院的一名普通学生。

你可能感兴趣的:(Redhat8.0 ansible的常用模块以及实战演示。)