阶段六:企业级自动化配置工具之Ansible进阶

Ansible模块(重点理解)

copy模块(重点)

作用:copy模块用于对文件的远程拷贝操作(如把本地的文件拷贝到远程的机器上)

本机:nginx.conf,copy模块:分发到所有web节点

https://docs.ansible.com/ansible/latest/modules/copy_module.html#copy-module

在master上准备一个文件,拷贝此文件到webserver的所有机器上

master# echo master > /tmp/file1
master# ansible webserver -m copy -a 'src=/tmp/file1 dest=/tmp/file2'

使用content参数直接往远程文件里写内容(会覆盖原内容)

master# ansible webserver -m copy -a 'content="ansible\n" dest=/tmp/file2'

注意:ansible中-a后面的参数里也有引号时,记得要单引双引交叉使用,如果都为双引会出现问题

使用force参数控制是否强制覆盖

如果目标文件已经存在,则不覆盖

touch /tmp/file2
master# ansible webserver -m copy -a 'src=/tmp/file2 dest=/tmp/file3 force=no'

如果目标文件已经存在,则会强制覆盖

master# ansible webserver -m copy -a 'src=/tmp/file2 dest=/tmp/file3 force=yes'

使用backup参数控制是否备份文件

backup=yes表示如果拷贝的文件内容与原内容不一样,则会备份远程主机的那一份

webserver的机器上会将/tmp/file3备份一份(备份文件命名加上时间),再远程拷贝新的文件为/tmp/file3

master# ansible webserver -m copy -a 'src=/etc/fstab dest=/tmp/file3 backup=yes owner=daemon group=daemon mode=0777'
简单理解:就是对目标文件进行备份操作

copy模块拷贝时要注意拷贝目录后面是否带"/"符号

/etc/yum.repos.d后面不带/符号,则表示把/etc/yum.repos.d整个目录拷贝到/tmp/目录下

master# ansible webserver  -m copy -a 'src=/etc/yum.repos.d dest=/tmp'

/etc/yum.repos.d/后面带/符号,则表示把/etc/yum.repos.d/目录里所有文件拷贝到/tmp/目录下

master# ansible group1 -m copy -a 'src=/etc/yum.repos.d/ dest=/tmp/'

小结:

Ansible有一个特殊模块,用于把本地文件拷贝到远程服务器,这个模块(copy)

copy模块有两个常用的参数:(src)、(dest)

fetch模块

作用:fetch模块与copy模块类似,但作用相反。用于把远程机器的文件拷贝到本地(master),类似于收作业!!!

https://docs.ansible.com/ansible/latest/modules/fetch_module.html#fetch-module

注意: fetch模块不能从远程拷贝目录到本地

第1步: 在两台被管理机上分别创建一个同名文件(但内容不同)

agent1# echo agent1 > /tmp/1.txt
agent2# echo agent2 > /tmp/1.txt

第2步: 从master上fecth文件(因为webserver里有2台机器,为了避免同名文件文件冲突,它使用了不同的目录)

master# ansible webserver   -m fetch -a 'src=/tmp/1.txt dest=/tmp/'
192.168.88.102 | CHANGED => {
  "changed": true, 
  "checksum": "d2911a028d3fcdf775a4e26c0b9c9d981551ae41", 
  "dest": "/tmp/192.168.88.102/tmp/1.txt",
  "md5sum": "0d59da0b2723eb03ecfbb0d779e6eca5", 
  "remote_checksum": "d2911a028d3fcdf775a4e26c0b9c9d981551ae41", 
  "remote_md5sum": null
}

192.168.88.103 | CHANGED => {
  "changed": true, 
  "checksum": "b27fb3c4285612643593d53045035bd8d972c995", 
  "dest": "/tmp/192.168.88.103/tmp/1.txt",
  "md5sum": "cd0bd22f33d6324908dbadf6bc128f52", 
  "remote_checksum": "b27fb3c4285612643593d53045035bd8d972c995", 
  "remote_md5sum": null
}

安装tree:

# yum install tree -y
# 以大树结构显示文件信息(包含多层)
# tree /tmp

命令作用:

执行结果:

关键参数:

注意事项:

作用:user模块用于管理用户账号和用户属性。

https://docs.ansible.com/ansible/latest/modules/user_module.html#user-module

案例1:创建aaa用户,默认为普通用户,创建家目录


案例2:创建bbb系统用户,并且登录shell环境为/sbin/nologin

$1$DpcyhW2G$Kb/y1f.lyLI4MpRlHU9oq0

passwd可以使用-l选项,代表lock,锁定账号,不允许登录系统


下一句命令注意一下格式,密码要用双引号引起来,单引号的话验证时会密码不正确

案例4:创建一个普通用户叫hadoop,并产生空密码密钥对


案例5:删除aaa用户,但家目录默认没有删除

案例6:删除bbb用户,使用remove=yes参数让其删除用户的同时也删除家目录


小结:


创建用户(state=present)和删除用户(state=absent)


作用:group模块用于管理用户组和用户组属性。

https://docs.ansible.com/ansible/latest/modules/group_module.html#group-module

创建组

删除组(如果有用户的gid为此组,则删除不了)


小结:

group模块比较简单,主要用于(创建用户组)和(删除用户组)


聊聊计划任务(定时器)=>(重点)

*/1:每分钟

图解:

常见格式:

星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,"1,2,5,7,8,9" 中杠(-):可以用整数之间的中杠表示一个整数范围,例如"2-6"表示"2,3,4,5,6" 正斜线(/):可以用正斜线指定时间的间隔频率,例如"0-23/2"表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。


时间案例:

案例:每分钟创建一个文件/root/file_202404171733.txt




问题:在crontab中如果出现了%百分号,默认无法执行
解决:添加反斜杠转义\%

cron模块用于管理周期性时间任务

https://docs.ansible.com/ansible/latest/modules/cron_module.html#cron-module

创建一个cron任务,不指定user的话,默认就是root(因为我这里是用root操作的)。

如果minute,hour,day,month,week不指定的话,默认都为\*


删除cron任务

小结:

Ansible可以通过cron模块创建或者移除计划任务!

yum模块用于使用yum命令来实现软件包的安装与卸载。

https://docs.ansible.com/ansible/latest/modules/yum_module.html#yum-module


使用yum安装httpd,httpd-devel软件,state=latest表示安装最新版本

或

使用yum卸载httpd,httpd-devel软件



作用:service模块用于控制服务的启动,关闭,开机自启动等。

https://docs.ansible.com/ansible/latest/modules/service_module.html#service-module

启动httpd服务,如何没有安装,首先进行软件的安装,通过yum模块去进行软件的安装,并设为开机自动启动

state服务管理可以选参数:"reloaded"、"restarted"、"started"、"stopped"

关闭vsftpd服务,并设为开机不自动启动


小结:

yum/dnf模块:主要负责(安装或卸载软件)

service模块:主要负责(服务的管理、启动、停止、重启、开机自启、开机不自启)


作用:script模块用于在远程机器上执行master本地脚本。

https://docs.ansible.com/ansible/latest/modules/script_module.html#script-module

在master上准备一个脚本

#!/bin/bash

关键参数:

注意事项:

tasks: dnf: copy: loop: notify: user: service: handlers: service:


第二步:找到如下两个文件(/etc/vsftpd/ftpusers,/etc/vsftpd/user_list)

去掉root账号(否则root无法登录)

第三步:使用课件中提供的FlashFXP连接FTP服务,如下图所示:





工作职责:







说明:
/etc/exports:NFS默认配置文件
*代表任意主机均可挂载访问/share目录

注意事项:

tasks:

handlers:

tasks:

小结:

注意:NFS服务全名(nfs-server)

作用:把变量、任务、handlers分别作为角色,按文件夹来实现分离编写过程!

files:用来存放由copy模块或script模块调用的文件。 tasks:至少有一个main.yml文件,定义各tasks。 handlers:有一个main.yml文件,定义各handlers。 templates:用来存放jinjia2模板。 vars:有一个main.yml文件,定义变量。 meta:有一个main.yml文件,定义此角色的特殊设定及其依赖关系,类似说明书。







/etc/ansible/roles/

按需求修改配置文件后,拷贝到httpd角色目录里的files子目录


**第7步:编写lamp的playbook文件调用前面定义好的三个角色**

  roles:

小结:


缺点:文件夹太多,过于冗余

常见问题:

问题1:YAML语法有错误,千万不要按Tab键,如果出错了,可以借助于YAML校检工具

https://www.bejson.com/validators/yaml_editor/index.html

问题2:Roles脚本是一个整体,不要单独执行某个yaml文件应该统一执行最终的yaml,如lamp.yaml

单独执行某个main.yml,报错信息如下:

以上其实不是错误,而是也能为main.yml文件不完整导致的!


注意事项:


**第8步:编写lamp的playbook文件调用前面定义好的三个角色**

  roles: