Linux云计算 |【第二阶段】AUTOMATION-DAY4

主要内容:

部署Ansible、Ansible基础命令(Ansible ad-hoc命令格式、Ansible-doc帮助)、Ansible模块常用:脚本与命令模块、文件与账户模块、软件与服务模块、逻辑卷模块

补充:touch 除创建文件外,若再创建相同文件时,只会修改文件的时间信息,内容不变;

一、Ansible概述

Ansible 是一种开源的自动化工具,由 Red Hat 公司支持,首次发布于2012年,作者Michael DeHaan(Cobbler作者)后来被RedHat收购。主要用于配置管理、应用部署、任务自动化和 IT 基础设施自动化,基于Python开发,能实现批量系统配置、批量程序部署、批量运行命令、批量修改服务器密码、批量安装软件包、批量修改配置等功能。

Ansible 以其简单性、易用性和强大的功能而受到广泛欢迎。以下是 Ansible 的一些关键特性:

1. 无代理架构:Ansible 采用无代理架构,这意味着它不需要在目标主机上安装任何额外的软件或代理。它通过 SSH(默认情况下)或 WinRM(用于 Windows 主机)与目标主机通信,执行任务和配置管理。

2. 基于 YAML 的 Playbooks:Ansible 使用 YAML(YAML Ain't Markup Language)格式编写 Playbooks,这是一种人类可读的数据序列化语言。Playbooks 定义了一系列任务,这些任务可以按顺序执行,以实现自动化目标。

3. 模块化设计:Ansible 提供了大量的模块,用于执行各种任务,如文件操作、软件包管理、服务管理等。用户还可以编写自定义模块,以满足特定需求。

4. 幂等性:Ansible 的设计理念之一是幂等性,即无论执行多少次相同的操作,结果都应该是一样的。这意味着如果配置已经符合预期状态,Ansible 不会进行不必要的更改。

5. 强大的生态系统:Ansible 拥有一个活跃的社区和丰富的生态系统,提供了大量的 Playbooks、角色和模块,可以快速实现各种自动化任务。

6. 支持多种平台:Ansible 支持管理各种操作系统,包括 Linux、Windows、网络设备等。

7. 易于扩展:Ansible 的设计使其易于扩展和集成。用户可以编写自定义模块、插件和扩展,以满足特定的自动化需求。

8. 集中式管理:Ansible 通过一个控制节点(通常是 Ansible 服务器)来管理所有目标主机,这使得集中式管理和监控变得非常方便。

使用场景:

  • 配置管理:自动化配置操作系统和应用程序。
  • 应用部署:自动化应用程序的部署和更新。
  • 任务自动化:自动化日常的 IT 任务,如备份、监控等。
  • IT 基础设施自动化:自动化整个 IT 基础设施的部署和管理,包括虚拟机、容器、网络设备等。

1、Ansible原理概述

  • ① 控制端主机安装Ansible,自带很多模块(模块就是脚本,默认8000多个Python脚本);
  • ② ansible通过ssh远程被管理主机,将控制端的模块(脚本)或命令传输到被管理主机;(脚本放在被管理主机的tmp目录中进行执行,退出ssh后将脚本rm删除)
  • ③ 在被管理端主机执行模块(脚本)或命令,执行不同的模块或命令可以实现不同的功能;
  • ④ 最后ansible退出ssh远程。

注意:绝大多数模块(脚本)都需要参数才能执行成功,类似于shell脚本的位置变量!

Ansible的两种执行方式:

1)Ansible ad-hoc是一种通过命令行批量管理的方式,基本格式如下

格式:ansible 主机集合 -m 模块名 -a "参数"

选项:[--list-hosts]     //固定选项,查看主机清单(列表)

2)Playbook(剧本)

常用模块:Command、Shell、Script

  • Command 和 Shell 模块的区别:command不支持bash特性,如管道和重定向等功能,所有需要调用shell的功能都无法使用;
  • Shell 模块会启动shell执行命令。不可以使用shell模块执行交互命令,如vim、top;
  • Script 允许在本地写脚本,拷贝到被管理端并执行脚本,可以不是shell脚本(如python、perl脚本等),可以没有-x;

2、部署Ansible

整体思路:创建实验主机(控制端和被控制端)、配置SSH实验环境、安装Ansible自动化软件、修改Ansible配置;

环境要求:操作系统为RHEL8,配置主机名称、IP地址、YUM源

控制节点要求:

  • 1)域名解析(为了方便后期操作,可不做)
  • 2)配置SSH密钥(ansible是基于ssh实现远程控制)
  • 3)安装Ansible软件

被控制节点要求:

  • 1)Ansible默认通过SSH协议管理机器
  • 2)被管理主机要开启SSH服务,并允许控制主机登录
  • 3)被管理主机需要安装有Python(默认RHEL8安装)

步骤1:准备基础环境

1)控制节点(Control)

修改/etc/hosts,在文件中手动添加如下内容,修改该文件的目的是做域名解析

[root@control ~]# vim /etc/hosts
...
192.168.4.253 control
192.168.4.11 node1 Control
192.168.4.12 node2
192.168.4.13 node3
192.168.4.14 node4
192.168.4.15 node5

— 验证:使用ping命令依次ping所有主机的域名

[root@control ~]# ping node1

2)配置SSH密钥实现免密码登录(非常重要)

注意:Ansible是基于SSH远程的原理实现远程控制,需实现免密登录被管理端主机

[root@control ~]# ssh-keygen -f /root/.ssh/id_rsa -N ''   //生成SSH密钥
[root@control ~]# for i in node{1..5}    //通过for循环传递公钥
> do
> ssh-copy-id $i      //拷贝密钥到远程被管理端主机
> done

提示:拷贝密钥到远程主机时需要输入对方主机的密码才可完成密钥拷贝

验证:使用ssh命令依次测试所有主机的远程访问

[root@control ~]# ssh node1

3)上传软件压缩包

[root@localhost 2]# scp ansible_soft.tar.gz root@192.168.4.253:/root
ansible_soft.tar.gz                    100%   14MB  24.3MB/s   00:00   
[root@control ~]# tar -xf ansible_soft.tar.gz     //解压ansible_soft.tar.gz
[root@control ~]# ls
anaconda-ks.cfg  ansible_soft  ansible_soft.tar.gz
[root@control ~]# cd ansible_soft/
[root@control ansible_soft]# ls
ansible-2.8.5-2.el8.noarch.rpm
libsodium-1.0.18-2.el8.x86_64.rpm
python3-bcrypt-3.1.6-2.el8.1.x86_64.rpm
python3-paramiko-2.4.3-1.el8.noarch.rpm
python3-pynacl-1.3.0-5.el8.x86_64.rpm
sshpass-1.06-9.el8.x86_64.rpm
[root@control ansible_soft]# dnf -y install *    //【*】代表所有,安装rpm包

步骤2:修改配置文件(主配置文件:ansible.cfg)

Ansible 配置文件检测顺序:

1. 首先检测 ANSIBLE_CONFIG 变量定义的配置文件(默认没有这个变量)

2. 其次检查 当前目录下的./ansible.cfg文件(该当前目录指~/ansible/ansible.cfg)

    注意:Ansible在当前目录下找配置文件,所以需要切换到Ansible目录

3. 再次检查 当前用户家目录 下 ~/ansible.cfg 文件

4. 最后检查/etc/ansible/ansible.cfg文件(可参考该文件)

1) 修改主配置文件

[root@control ~]# mkdir ~/ansible      //创建ansible目录(以当前目录方式)
[root@control ~]# vim ~/ansible/ansible.cfg    //新建主配置文件
[defaults]
inventory = ~/ansible/inventory     //指定主机清单配置文件(需手动创建)
#forks = 5      //ssh并发数量(默认并发数为5)
#host_key_checking = False    //是否校验密钥(第一次ssh时是否提示yes/no)

注意:指定主机清单配置文件inventory可以是任意文件名,但手动创建主机清单文件时,必须按照主配置文件 inventory 定义的一致

2)创建并修改主机清单文件

[root@control ~]# vim ~/ansible/inventory
[test]       //定义主机组(组名称任意)
node1        //定义组中的具体主机,组中包括一台主机node1
[proxy]
node2
[webserver]
node[3:4]     //node[3:4]等同于node3和node4
[database]
node5
[cluster:children]    //嵌套组(children为关键字),嵌套组可以在组中包含其他组
webserver
database
  • 补充:清单中定义的node,非hostname主机名,而是/etc/hosts文件中解析的node,若需要定义IP,则将node换成IP即可(不能node,IP并用)
  • 补充:嵌套组(children为关键字),嵌套组可以在组中包含其他组
  • 补充:不建议定义组[all],[all]包含清单中所有的主机


示例1:Ansible ad-hoc应用一(针对命令)

要求:command、shell、script

  • 1)测试主机列表中的主机是否可以ping通
  • 2)查看被管理主机的服务器信息(如时间、版本、内存等)
  • 3)学习ansible-doc命令的用法
  • 4)测试command与shell模块的区别
  • 5)使用script模块在远程主机执行脚本(装软件包、启服务)

Ansible ad-hoc是一种通过命令行批量管理的方式,命令基本格式如下:

  • 格式:ansible 主机集合 -m 模块名 -a "参数"
  • 选项:[--list-hosts]     //固定选项,查看主机清单(列表)

通过ansible-doc获取帮助:

[root@control ansible]# ansible-doc -l       //列出所有模块
a10_server                                    Manage A10 Networks ...
a10_server_axapi3                             Manage A10 Networks ...
...[root@control ansible]# ansible-doc -l | grep yum    //在所有模块中过滤关键词
yum                                            Manages packages wit...
yum_repository                                   Add or remove YUM re...[root@control ansible]# ansible-doc yum      //查看模块帮助
> YUM    (/usr/lib/python3.6/site-packages/ansible/modules/packaging/os/yum.py)Installs, upgrade, downgrades, removes, and lists packages andgroups with the `yum' package manager. This module only workson 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.
...

 Ansible输出的结果:

Success,Changed,Warning,Failed

① SUCCESS 执行成功

② CHANGED 执行成功且发生修改

③ WARRING 告警提示

④ FAILED 执行失败


步骤1:测试环境

1)查看主机列表
[root@control ~]# cd ansible    //切换到ansible路径中执行ansible操作
[root@control ansible]# ansible all --list-hosts      //查看所有主机列表hosts (5):node1node2node3node4node5

注意:必须切换到ansible路径中执行ansible操作

2)Ping模块测试远程主机(ping测试多个主机或组时,中间使用逗号【,】分隔)
[root@control ansible]# ansible node1 -m ping     //调用ping模块
node1 | SUCCESS => {      //输出结果SUCCESS"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": false,"ping": "pong"
}
}
[root@control ansible]# ansible node1,webserver -m ping    //测试主机和组
[root@control ansible]# ansible all -m ping     //测试所有主机

提示:模块叫 ping,不会发送任何ICMP协议的 ping 数据包,控制端主机仅仅是ssh远程被管理端主机并执行模块ping,检查其是否有python环境,能顺利远程并且有Python环境就会返回正确的提示信息,否则报错;


常见报错:未在配置文件路径~/ansible执行ansible操作

[root@control ~]# ansible all --list-hosts[WARNING]: provided hosts list is empty, only localhost is available. Note
that the implicit localhost does not match 'all'

常见报错:UNREACHABLE不能到达的,SSH连接访问失败

node1 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
"unreachable": true
}
  • 问题分析:Failed失败,connect连接,via通过,permission权限,denied被拒绝

Failed to connect to host via ssh(通过ssh远程连接到主机失败)

Permission denied(因无法连接,所以权限被拒绝)

  • 解决办法:手动ping和ssh主机,验证是否可以实现免密码登录。

3)测试command默认模块及参数(命令)

模块就是脚本(多数为Python脚本),多数脚本都支持参数

补充:默认模块为command,一般可忽略(比其它模块更节省资源)

格式:ansible 主机集合 -m command -a “命令”

[root@control ansible]# ansible node1 -m command -a "date"  //查看时间
node1 | CHANGED | rc=0 >>
Thu Apr 22 16:33:14 CST 2021
[root@control ansible]# ansible node1 -a "date"   //command为默认模块可忽略
node1 | CHANGED | rc=0 >>
Thu Apr 22 16:33:37 CST 2021[root@control ansible]# ansible node1 -a "uname -r"   //查看内核版本
node1 | CHANGED | rc=0 >>
4.18.0-193.el8.x86_64[root@control ansible]# ansible node1,node2 -a "uptime"  //查看CPU负载
node2 | CHANGED | rc=0 >>16:52:55 up  2:27,  2 users,  load average: 0.00, 0.00, 0.00
node1 | CHANGED | rc=0 >>16:52:55 up  2:27,  2 users,  load average: 0.00, 0.00, 0.00[root@control ansible]# ansible node1,proxy -a "date"    //查看时间(主机、组)
node1 | CHANGED | rc=0 >>
Thu Apr 22 16:57:16 CST 2021
node2 | CHANGED | rc=0 >>
Thu Apr 22 16:57:16 CST 2021[root@control ansible]# ansible all -a " ip address show"  //查看所有主机网卡信息
4)测试shell模块及参数(支持bash特性,命令)

command和shell模块的区别:command不支持bash的特性,如管道和重定向等功能,但是shell模块可以支持;注意不可以使用shell模块执行交互命令(如vim、top等)

格式:ansible 主机集合 -m shell -a “命令”

[root@control ansible]# ansible test -m shell -a "ps aux | wc -l"   //查看进程数量
node1 | CHANGED | rc=0 >>
117
[root@control ansible]# ansible test -m shell -a "who"   //查看登陆主机信息
node1 | CHANGED | rc=0 >>
root     pts/0        Apr 22 14:27 (192.168.4.254)
root     pts/1        Apr 22 17:47 (192.168.4.253)
[root@control ansible]# ansible test -m shell -a "touch /tmp/test.txt"  //创建文件
node1 | CHANGED | rc=0 >>

补充:使用shell模块创建文件会有Warning警告提示属于正常,提示使用“file”模块来创建文件;

常见报错:

[root@control ansible]# ansible test -m command -a "ps | wc -l"    //报错

[root@control ansible]# ansible test -m command -a "ls &"    //报错

5)测试script模块及参数(脚本)

script模块会把-a后面的脚本拷贝到被管理端主机,并执行脚本,注意要拷贝的脚本的相对路径或绝对路径(相对路径为以识别配置文件的ansible路径)

格式:ansible 主机集合 -m script -a “要拷贝的脚本的相对路径或绝对路径”

[root@control ansible]# vim ~/ansible/test.sh
#!/bin/bash
dnf -y install httpd
systemctl start httpd
echo "ANSIBLE" > /var/www/html/index.html
[root@control ansible]# ansible test -m script -a "./test.sh"   //执行脚本
— 验证:
[root@node1 ~]# cat /var/www/html/index.html
ANSIBLE
[root@node1 ~]# curl 192.168.4.11
ANSIBLE
[root@node1 ~]# systemctl status httpd
[root@node1 ~]# ss -anptul | grep :80


示例2:Ansible ad-hoc应用二(针对文件)

案例要求:file、copy、fetch、lineinfile、replace

  • 1)远程目标主机新建文件和目录、修改文件或目录的权限
  • 2)在远程目标主机创建链接文件
  • 3)删除远程目标主机上的文件或目录
  • 4)将控制端本地的文件拷贝到被管理端
  • 5)从被管理端下载文件到本地
  • 6)修改远程目标主机上的文件内容

补充:很多ansible模块都具有幂等性的特征且更专业性。虽然command、shell、script为“万能模块”,但没有幂等性,每次执行已执行过的任务会报错;

幂等性:任意次执行所产生的影响均与一次执行的影响相同(对已执行过的任务不再执行)

1)file模块及参数

file模块可以创建/删除文件、目录、链接;修改权限与属性等(ansible-doc file)

语法:ansible 主机集合 -m file -a “参数”

参数:path  指定要创建的文件或目录的名称

参数:state=touch创建文件,state=directory创建目录,state=link创建链接

参数:owner=指定所有者,group=指定所属组,mode=指定要修改的权限

参数:state=absent代表删除,state=present代表创建(可忽略)

① 创建文件

[root@control ansible]# ansible test -m file -a "path=/tmp/file.txt state=touch"  //在node1中创建文件/tmp/file.txt
[root@control ansible]# ansible test -a "ls /tmp/file.txt"    //验证
node1 | CHANGED | rc=0 >>
/tmp/file.txt

解释:控制端主机ssh远程node1,将file.py脚本(file模块)拷贝到node1,在node1主机执行./file.py,参数:path=/tmp/file.txt state=touch;执行后控制端退出ssh。注意file.py脚本必须有参数才可执行,否着脚本执行无意义

② 创建目录

[root@control ansible]# ansible test -m file -a "path=/tmp/mydir state=directory"   //在node1中创建目录/tmp/mydir
[root@control ansible]# ansible test -a "ls -ld /tmp/mydir"       //验证
node1 | CHANGED | rc=0 >>
drwxr-xr-x. 2 root root 6 Apr 23 09:49 /tmp/mydir

解释:远程test组中所有主机创建目录,path后面指定要创建的目录的名称

③ 创建链接

[root@control ansible]# ansible test -m file -a "src=/etc/hosts path=/tmp/host.txt state=link"
[root@node1 ~]# ls -l /tmp/host.txt    //验证
lrwxrwxrwx. 1 root root 10 Apr 23 10:46 /tmp/host.txt -> /etc/hosts

解析:给/etc/hosts文件创建一个链接文件/tmp/host.txt(src指定源文件,path是软链接文件名 state=link 创建链接),相当于执行命令 ln -s /etc/hosts /tmp/host.txt

④ 修改权限

[root@control ansible]# ansible test -m file -a "path=/tmp/file.txt owner=sshd group=adm mode=0777"    //在node1对创建的文件修改归属关系和权限
[root@control ansible]# ansible test -a "ls -ll /tmp/file.txt"    //验证
node1 | CHANGED | rc=0 >>
-rwxrwxrwx. 1 sshd adm 0 Apr 23 09:31 /tmp/file.txt

解释:修改文件或目录权限,path后面指定要修改的文件名或目录名称,owner后面指定所有者,group后面所属组,mode后面指定要修改的权限(0777中第一个0代表的是无特殊权限,如SUID、SGID等)

⑤ 删除目录

[root@control ansible]# ansible test -m file -a "path=/tmp/mydir state=absent" //在node1中删除目录
[root@control ansible]# ansible test -a "ls /tmp/mydir"    //验证
node1 | FAILED | rc=2 >>
ls: cannot access '/tmp/mydir': No such file or directorynon-zero return code

解析:state=absent代表删除(删除目录)

⑥ 删除文件

[root@control ansible]# ansible test -m file -a "path=/tmp/file.txt state=absent"   //在node1中删除文件
[root@control ansible]# ansible test -a "ls /tmp/file.txt"    //验证
node1 | FAILED | rc=2 >>
ls: cannot access '/tmp/file.txt': No such file or directorynon-zero return code

解析:state=absent代表删除(删除文件)


常见报错:检查state的值是否有字母错误,例子中输入的是touc,不是touch。

[root@control ansible]# ansible test -m file -a "path=/tmp/file.txt state=touc"  
node1 | FAILED! => {… …"changed": false,"msg": "value of state must be one of: absent, directory, file, hard, link, touch, got: touc"
}
  • 问题分析:value(值),must(必须),be(是),of(…的),one(一个)

value of state must be one of:(state的值必须是后面给出的其中一个值)

常见错误:file模块不支持nmae这个参数

node1 | FAILED! => {… …"msg": "Unsupported parameters for (file) module: nmae Supported parameters include: _diff_peek, _original_basename, access_time, access_time_format, attributes, backup, content, delimiter, directory_mode,follow, force, group, mode, modification_time, modification_time_format, owner,path, recurse, regexp, remote_src, selevel, serole, setype, seuser, src, state,unsafe_writes"
}
  • 问题分析:unsupported不支持,parameters参数,supported支持的,include包括
  • 解决办法:检查模块的参数是否有字母错误,上面错误案例将name错写为nmae。

2)copy 模块及参数

copy模块可以将文件拷贝到远程主机 (ansible-doc copy)

格式:ansible 主机集合 -m copy -a “scr=源文件 dest=目标文件/目录”

参数:src代表源文件,dest代表目标文件

注意:若需要拷贝目录到被控制端主机,则需要将源目录打成压缩包再拷贝;

[root@control ansible]# echo AAA > ~/AJ.txt     //新建测试文件
[root@control ansible]# ansible test -m copy -a "src=~/AJ.txt dest=/root"
[root@control ansible]# ansible test -a "ls /root"    //验证
node1 | CHANGED | rc=0 >>
AJ.txt

解释:把管理端本机的测试文件AJ.txt拷贝到test组中node1主机的/root/目录,src代表源文件,dest代表目标文件;

[root@control ansible]# echo ABA > ~/AJ.txt    //重定向新的内容
[root@control ansible]# ansible test -m copy -a "src=~/AJ.txt dest=/root"
[root@control ansible]# ansible test -a "cat ~/AJ.txt" //验证
node1 | CHANGED | rc=0 >>
ABA

解释:修改管理端本机的测试文件AJ.txt拷贝到test组中node1主机的/root/目录,内容覆盖为新内容;

[root@control ansible]# ansible test -m copy -a "src=~/AJ.txt dest=/root/AJ2.txt"
[root@control ansible]# ansible test -a "ls /root"    //验证
node1 | CHANGED | rc=0 >>
AJ.txt
AJ2.txt

解释:把管理端本机的测试文件AJ.txt再次拷贝到test组中node1主机的/root/目录并将文件名改成AJ2.txt,没有该文件则创建;

3)fetch模块及参数

fetch模块与copy类似,但是作用相反,可以将其他主机的文件拷贝到本地(ansible-doc fetch)

格式:ansible 主机集合 -m fetch -a “src=下载文件路径 dest=目标文件/目录”

注意:不能下载目录,如果需要下载目录,可以先打包后再下载

[root@control ansible]# ansible all -m fetch -a "src=/etc/hostname dest=~/"
[root@control ansible]# cd
[root@control ~]# ls        //验证
AJ.txt           ansible       ansible_soft.tar.gz  node2  node4
anaconda-ks.cfg  ansible_soft  node1                node3  node5

解释:将远程test组中所有主机的hostname文件下载到本地家目录

4)lineinfile|replace模块及参数

修改单个文件的单行内容时可使用lineinfile模块,lineinfile会替换一整行(ansible-doc lineinfile)

格式:ansible 主机集合 -m lineinfile -a “path=指定文件 line=’添加单行的内容’”

参数:path=指定文件 line=添加单行的内容’

注意:基于幂等原则,重复执行,不会创建多行内容

[root@node1 ~]# cat /etc/issue   //修改前
\S
Kernel \r on an \m
[root@control ansible]# ansible test -m lineinfile -a "path=/etc/issue line='Hello world'"
[root@node1 ~]# cat /etc/issue    //验证
\S
Kernel \r on an \m
Hello world

解释:在/etc/issue文件中添加一行内容hello world,默认添加到最后,line后面跟的是需要添加的文件内容

5)修改单个文件的关键词,使用replace模块,可以替换关键词(ansible-doc replace)

格式:ansible 主机集合 -m replace -a “path=指定文件 regexp 旧内容 replace 新内容 ”

参数:regexp后面是需要替换的旧内容(正则);replace后面是需要替换的新内容

[root@node1 ~]# cat /etc/issue.net    //修改前
\S
Kernel \r on an \m
[root@control ansible]# ansible test -m replace -a "path=/etc/issue.net regexp=Kernel replace=Ocean"
[root@node1 ~]# cat /etc/issue.net     //验证
\S
Ocean \r on an \m

解释:将node1主机中/etc/issue.net文件全文所有的Kernel替换为Ocean


示例3:Ansible ad-hoc应用三

案例要求:user、yum_repository、yum、service、lvg、lvol

  • 1)远程目标主机创建、删除系统账户;设置系统账户属性、修改账户密码
  • 2)为目标主机创建、删除yum源配置文件;远程目标主机安装、卸载软件包
  • 3)使用service模块管理远程主机的服务
  • 4)创建、删除逻辑卷
1)user模块及参数

user模块可以实现Linux系统账户管理(ansible-doc user)

格式:ansible 主机集合 -m user -a “参数”

参数:name=指定用户

参数:uid指定用户ID号,group指定用户属于哪个基本组(基本组唯一),groups指定用户属于哪些附加组,home指定用户的家目录,password修改密码

① 添加用户

[root@node1 ~]# id tuser1   //修改前
id: 'tuser1': no such user
[root@control ansible]# ansible test -m user -a "name=tuser1"
[root@node1 ~]# id tuser1    //验证
uid=1000(tuser1) gid=1000(tuser1) groups=1000(tuser1)

解释:控制端主机SSH远程test组中的node1主机,将user.py脚本(user模块)拷贝到node1并执行./user.py name=tuser1,(相当于执行useradd tuser1,useradd没有参数则无意义),默认state的值为present,代表创建用户;执行后控制端退出SSH远程连接;

② 添加用户(指定uid、group基本组、groups附加组、home家目录)

[root@node1 ~]# id tuser2    //修改前
id: 'tuser2': no such user
[root@control ansible]# ansible test -m user -a "name=tuser2 uid=1010 group=adm groups=daemon,root home=/home/tuser2"
[root@node1 ~]# id tuser2     //验证
uid=1010(tuser2) gid=4(adm) groups=4(adm),2(daemon),0(root)

解释:创建账户并设置对应的账户属性,uid指定用户ID号,group指定用户属于哪个基本组,groups指定用户属于哪些附加组,home指定用户的家目录

③ 为用户创建密码

[root@control ansible]# ansible test -m user -a "name=tuser1 password=‘123’"
注意:该方式加密可以修改成功,但/etc/shadow能看到明文密码,所以需要对密码加密
[root@control ansible]# ansible test -m user -a "name=tuser1 password={{'abc' | password_hash('sha512')}}"
[root@node1 ~]# sed -n '/^tuser1/p' /etc/shadow
tuser1:$6$gY2CJSYKit3MP8k6$YMno1XfoZPtD8iLrqoreWv63WS3/SywIZAsPjcaUM6Ym1xpDf929l5L6Kks2H55dikxWDmflM5UxE1STIfxRe.:18740:0:99999:7:::
  • 注意:【password={{}}】,双花括号是固定语法
  • 注意:password无幂等性,执行多少次相同任务,都能成功执行;

解释:修改账户密码,用户名是tuser1,密码是abc,密码经过sha512加密

④ 删除用户

[root@control ansible]# ansible test -m user -a "name=tuser1 state=absent"
[root@control ansible]# id tuser1   //验证,用户tuser1已删除
id: 'tuser1': no such user
[root@node1 ~]# ls /home/    //删除了用户,但家目录还在
tuser1  tuser2

解释:删除账户tuser1,state=absent代表删除账户,name指定要删除用户名是什么

⑤ 删除用户(包括家目录、邮箱)

注意:不加remove=true参数,用户的家目录不会被删除,相当于执行userdel tuser1,若需要删除用户家目录,只能通过新建别的脚本或直接到tuser1的家目录进行删除等操作;

[root@control ansible]# ansible test -m user -a "name=tuser2 state=absent remove=true"
[root@node1 ~]# id tuser2    //验证,用户tuser2已删除
id: 'tuser2': no such user
[root@node1 ~]# ls /home/    //家目录已删除
tuser1
[root@node1 ~]# ls /var/spool/mail/    //用户邮箱已删除
tuser1

解释:删除tuser2账户同时删除家目录、邮箱,相当于执行userdel -r tuser2

补充:remote可以写true或yes,false或no

2)yum_repository模块

使用yum_repository可以创建或修改yum源配置文件(ansible-doc yum_repository)

格式:ansible 主机集合 -m yum_repository -a “name=仓库标识 description=描述 baseurl=yum源路径 gpgcheck=0 [enabled=1]”

① 新建一个yum源配置文件

[root@control ansible]# ansible test -m yum_repository -a "name=myyum description=hello baseurl=ftp://8.8.8.8/centos gpgcheck=0"
node1 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": true,"repo": "myyum","state": "present"
}
[root@control ansible]# ansible test -a "ls /etc/yum.repos.d/"    //验证
node1 | CHANGED | rc=0 >>
myyum.repo[root@node1 ~]# cat /etc/yum.repos.d/myyum.repo    //验证
[myyum]
name = hello
baseurl = ftp://8.8.8.8/centos
gpgcheck = 0

补充:可以不填写enabled=1,默认开启;gpgcheck可以写no或者0

② 基于幂等性,修改yum源文件内容

[root@control ansible]# ansible test -m yum_repository -a "name=myyum description=test baseurl=ftp://9.9.9.9/centos gpgcheck=1"
[root@node1 ~]# cat /etc/yum.repos.d/myyum.repo     //验证
[myyum]
baseurl = ftp://9.9.9.9/centos
gpgcheck = 1
name = test

③ 删除YUM源文件

[root@control ansible]# ansible test -m yum_repository -a "name=myyum state=absent"
[root@node1 ~]# cat /etc/yum.repos.d/myyum.repo     //验证
cat: /etc/yum.repos.d/myyum.repo: No such file or directory

④ 创建多个yum源

  • 方法1:可直接再创建repo的方式,最终拥有两个repo文件;
  • 方法2:相同repo写入两个仓库信息,使用参数“file=文件名”,文件名同名即可;
[root@control ansible]# ansible test -m yum_repository -a "file=myyum name=yum description=test baseurl=ftp://6.6.6.6/centos gpgcheck=1"
[root@node1 yum.repos.d]# cat myyum.repo    //验证
[myyum]
baseurl = ftp://9.9.9.9/centos
gpgcheck = 1
name = test[yum]
baseurl = ftp://6.6.6.6/centos
gpgcheck = 1
name = test

补充:修改同名的.repo文件,即可在一个仓库文件中创建多条仓库信息;

3)yum模块及参数

使用yum模块可以安装、卸载、升级软件包(ansible-doc yum)

格式:ansible 主机集合 -m yum -a “name=软件包 state=present/absent/latest”

参数:state=present安装 | absent卸载 | latest升级

① 安装软件包

[root@control ansible]# ansible test -m yum -a "name=unzip state=present"
[root@node1 ~]# rpm -q unzip   //验证
unzip-6.0-43.el8.x86_64

解释:安装unzip软件包,state默认为present(可忽略)

② 升级软件包 

[root@control ansible]# ansible test -m yum -a "name=unzip state=latest"

解释:升级unzip软件包,软件名称可以是*,代表升级所有软件包

③ 卸载软件包

[root@control ansible]# ansible test -m yum -a "name=unzip state=absent"
[root@node1 ~]# rpm -q unzip
package unzip is not installed

解释:调用yum模块,卸载unzip软件包,state=absent代表卸载软件

4)service模块及参数

service为服务管理模块启动、关闭、重启、开机自启服务等(ansible-doc service)

格式:ansible 主机集合 -m service -a “name=服务名 state=started/stopped/restarted”

格式:ansible 主机集合 -m service -a “name=服务名 enabled=yes/1/true”

参数:state:started启动 | stopped关闭 | restarted重启服务

参数:enabled:yes设置开机启动

补充:systemctl程序认start、enable;ansible认started、enabled(其它同理)

① 调用service模块,启动httpd服务

[root@control ansible]# ansible test -m yum -a "name=httpd"   //调用yum模块,安装httpd软件包
[root@control ansible]# ansible test -a "rpm -q httpd"
node1 | CHANGED | rc=0 >>
httpd-2.4.37-21.module+el8.2.0+5008+cca404a3.x86_64[root@control ansible]# ansible test -m service -a "name=httpd state=started"
[root@node1 ~]# systemctl status httpd    //验证
● httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor pres>Active: active (running) since Fri 2021-04-23 16:21:09 CST; 19s ago
...

② 调用service模块,关闭httpd服务

[root@control ansible]# ansible test -m service -a "name=httpd state=stopped"
[root@node1 ~]# systemctl status httpd     //验证
● httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor pres>Active: inactive (dead)
...

③ 调用service模块,重启httpd服务

[root@control ansible]# ansible test -m service -a "name=httpd state=restarted"

④ 调用service模块,设置httpd服务开机自启(enabled可以写yes、1、true)

[root@control ansible]# ansible test -m service -a "name=httpd enabled=yes"

5)逻辑卷相关模块lvg模块、lvol模块及参数

lvg模块,创建、删除卷组(VG),修改卷组大小(ansible-doc lvg)

格式:ansible 主机集合 -m lvg -a “vg=卷组名 pvs=单个或多个物理卷”

格式:ansible 主机集合 -m lvg -a “vg=卷组名 state=absent”

参数:state:present创建 | absent删除

例如:

1)实验前需给对应的被控制端主机添加额外磁盘并给磁盘创建2个空闲分区

[root@node1 ~]# parted /dev/vdb   //步骤省略
[root@node1 ~]# lsblk                                                     
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom  
vda    253:0    0   30G  0 disk
`-vda1 253:1    0   20G  0 part /
vdb    253:16   0   20G  0 disk
|-vdb1 253:17   0  3.7G  0 part
`-vdb2 253:18   0  3.7G  0 part

2)安装lvm2软件包,安装后才有pvcreate、vgcreate、lvcreate等命令

[root@control ansible]# yum provides lvcreate    //根据服务名查找对应软件包
lvm2-8:2.03.08-3.el8.x86_64
...
[root@control ansible]# ansible test -m yum -a "name=lvm2"   //安装lvm2
[root@node1 ~]# rpm -q lvm2      //验证查看
lvm2-2.03.08-3.el8.x86_64

① 创建名称为myvg的卷组,卷组由/dev/vdb1组成(分区名称要根据实际情况填写)

[root@control ansible]# ansible test -m lvg -a "vg=myvg pvs=/dev/vdb1"
[root@node1 ~]# vgs     //验证VG   #PV #LV #SN Attr   VSize VFreemyvg   1   0   0 wz--n- 3.72g 3.72g

② 修改卷组大小,通过卷组中添加一个设备/dev/sdb2,实现卷组的扩容

[root@control ansible]# ansible test -m lvg -a "vg=myvg pvs=/dev/vdb1,/dev/vdb2"
[root@node1 ~]# vgs      //验证VG   #PV #LV #SN Attr   VSize  VFreemyvg   2   0   0 wz--n- <7.45g <7.45g

lvol模块,创建、删除逻辑卷(LV),修改逻辑卷大小(ansible-doc lvol)

格式:ansible 主机集合 -m lvol -a “lv=逻辑卷名 vg=卷组名 size=大小”

格式:ansible 主机集合 -m lvol -a “lv=逻辑卷名 vg=卷组名 state=absent force=yes”

参数:state:present创建 | absent删除

① 使用myvg这个卷组创建一个名称为mylv的逻辑卷,大小为1G

[root@control ansible]# ansible test -m lvol -a "lv=mylv vg=myvg size=1G"
[root@node1 ~]# lvs     //验证LV   VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convertmylv myvg -wi-a----- 1.00g    
[root@node1 ~]# lvscanACTIVE            '/dev/myvg/mylv' [1.00 GiB] inherit

② 修改LV逻辑卷大小为3G

[root@control ansible]# ansible test -m lvol -a "lv=mylv vg=myvg size=3G"
[root@node1 ~]# lvs     //验证LV   VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convertmylv myvg -wi-a----- 3.00g

③ 删除逻辑卷,force=yes是强制删除(因Ansible认为逻辑卷还有数据,所以要强制)

[root@control ansible]# ansible test -m lvol -a "lv=mylv vg=myvg state=absent force=yes"

④ 删除卷组myvg(需要先删除逻辑卷才能删除卷组)

[root@control ansible]# ansible test -m lvg -a "vg=myvg state=absent"

思维导图:

小结:

本篇章节为【第二阶段】AUTOMATION-DAY4 的学习笔记,这篇笔记可以初步了解到 部署Ansible、Ansible基础命令(Ansible ad-hoc命令格式、Ansible-doc帮助)、Ansible模块常用:脚本与命令模块、文件与账户模块、软件与服务模块、逻辑卷模块。


Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/50952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3知识

目录 基础vue开发前的准备vue项目目录结构模板语法属性绑定条件渲染列表渲染通过key管理状态事件处理事件传参事件修饰符数组变化侦测计算属性Class绑定style绑定侦听器表单输入绑定模板引用组件组成组件嵌套关系组件注册方式组件传递数据Props(父传子)组件传递多种数据类型组件…

SpringBoot 数据访问操作

目录 一.SpringBoot整合Mybatis与Mybatis-Plus 二.SpringBoot切换druid数据源 3.1DRUID配置参数 3.2Druid监控平台 一.SpringBoot整合Mybatis与Mybatis-Plus 步骤&#xff1a; 1.坐标 <dependency><groupId>com.baomidou</groupId><artifactId>myb…

Android ConstraintLayout 约束布局

目录 1&#xff09;ConstraintLayout 约束布局是什么&#xff1f;为什么使用&#xff1f; 2&#xff09;如何使用 3&#xff09;可见性改变后的行为处理 4&#xff09;图形化界面的一些工具介绍 5&#xff09;Chains ( 链 ) 一、ConstraintLayout 约束布局是什么 Constraint…

【无人机】测绘行业新时代

【无人机】测绘行业新时代 无人机测绘主要指的是依托无人机系统为主要的信息接收平台&#xff0c;通过无人机机载遥感信息采集和处理设备&#xff0c;将最终所获取的遥感信息传输到测绘中心&#xff0c;经过数据技术处理&#xff0c;形成立体化的数字模型&#xff0c;以满足行…

JavaScript 输出

JavaScript 不提供任何内建的打印或显示函数。 JavaScript 显示方案 JavaScript 能够以不同方式“显示”数据&#xff1a; 使用 window.alert() 写入警告框使用 document.write() 写入 HTML 输出使用 innerHTML 写入 HTML 元素使用 console.log() 写入浏览器控制台 使用 in…

想要连接稳定的远程控软件吗?这4款软件不要错过

远程控制电脑是一种现代社会高效便捷的办公方式。这种方式可以不论时间不论地点都可以调用到办公电脑里的文件&#xff0c;如果你办公也有这个需求&#xff0c;那就看看我介绍的工具吧。 1.RL远程控制 直通车>>https://www.raylink.live 这个软件非常适合用来进行手机…

数据库安全综合治理方案(54页PPT)附下载

方案介绍&#xff1a; 数据库安全综合治理方案是一个综合性的策略&#xff0c;旨在确保数据库系统的完整性、保密性和可用性&#xff0c;防止未经授权的访问、数据泄露、篡改及滥用。该方案涉及多个层面&#xff0c;包括访问控制、数据加密、审计与监控、备份与恢复、以及安全…

Dreambooth on Stable Diffusion

Dreambooth on Stable Diffusion 1.DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation 2.[论文简析]DreamBooth: Fine Tuning Text-to-Image Diffusion Models…[2208.12242] 3.sd_dreambooth_extension 4.stable-dreambooth 对3-5张特定…

17.5【C语言】static的补充说明

static &#xff08;静态的) 作用&#xff1a;修饰局部变量&#xff0c;修饰全局变量&#xff0c;修饰函数 对比两段代码 #include <stdio.h> void test() {int a 5;a;printf("%d ", a); } int main() {int i 0;for(i0; i<5; i){test();}return 0; } …

HarmonyOS 质量、测试、上架速浏

1.应用质量要求&#xff1a; 1. 应用体验质量建议: 功能数据完备 功能完备 数据完备 基础体验要求 基础约束 兼容性 稳定性 性能 功耗 安全…

网格布局 HTML CSS grid layout demo

文章目录 页面效果代码 (HTML CSS)参考 页面效果 代码 (HTML CSS) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

高速传输新体验:探索最新USB-C移动硬盘盒的无限可能

在数字化时代&#xff0c;数据存储的重要性不言而喻&#xff0c;而硬盘盒作为连接外部硬盘与计算机的关键设备&#xff0c;其功能也在不断进化。近年来&#xff0c;随着技术的创新与发展&#xff0c;市场上出现了一种新型硬盘盒——它不仅能安全、高效地存储和传输数据&#xf…

安装VMware Workstation Pro

一、下载 通过百度网盘分享的文件&#xff1a;VMware-workstation-full-16.2.4-2008... 链接&#xff1a;https://pan.baidu.com/s/1mDnFhLQErBlpeX_KjsgtzA 提取码&#xff1a;0bw7 二、安装 &#xff08;1&#xff09;双击exe文件 &#xff08;2&#xff09;安装软件 &…

算法-bfs-八数码

题目一 解题思路 将每一串字符都想象成一个点&#xff0c;已知起点和终点,每一次更新相邻的节点&#xff0c;采用bfs得到到达终点的最短路径。 数据结构&#xff1a; unordered_map&#xff08;哈希表&#xff09;来存储每种字符串对应情况需要移动的次数。 queue(队列)存储…

刷题计划 day4 【双指针、快慢指针、环形链表】链表下

⚡刷题计划day4继续&#xff0c;可以点个免费的赞哦~ 下一期将会开启哈希表刷题专题&#xff0c;往期可看专栏&#xff0c;关注不迷路&#xff0c; 您的支持是我的最大动力&#x1f339;~ 目录 ⚡刷题计划day4继续&#xff0c;可以点个免费的赞哦~ 下一期将会开启哈希表刷题…

vuex学习day01-vuex简述、基于脚手架创建项目、基于脚手架创建项目

1、vuex简述 之所以采用vuex是因为当我们有多个公共状态的组件时&#xff0c;vue的简单性容易崩溃 &#xff08;1&#xff09;概念 Vuex 是Vue.js 应用程序的状态管理模式库。简单讲&#xff0c;vuex是vue的一个状态管理工具。 &#xff08;2&#xff09;作用 管理vue中的…

w30-python02-pytest入门

代码如下&#xff1a; import pytest class Test_Obj:"""测试类"""#用例级别前后置def setup(self):print(用例级别------的前置处理)def teardown(self):print("用例级别--------的后置处理")# 用例def test_case1(self):print(&quo…

自动驾驶-机器人-slam-定位面经和面试知识系列05之常考公式推导(02)

这个博客系列会分为C STL-面经、常考公式推导和SLAM面经面试题等三个系列进行更新&#xff0c;基本涵盖了自己秋招历程被问过的面试内容&#xff08;除了实习和学校项目相关的具体细节&#xff09;。在知乎和牛客&#xff08;牛客上某些文章上会附上内推码&#xff09;也会同步…

mfc100u.dll 文件缺失?两种方法快速修复丢失mfc100u.dll 文件难题

您的电脑是否遭遇了 mfc100u.dll 文件缺失的问题&#xff1f;这种情况通常由多种原因引起。在本文中&#xff0c;我们将介绍两种修复 mfc100u.dll 文件丢失问题的策略——一种是手动方法&#xff0c;另一种是自动修复的使用。我们将探讨如何有效地解决 mfc100u.dll 文件缺失的几…

vscode 调试web后端

1、调试环境配置 一、安装python环境管理器 其中要先在vscode选择对应的python环境&#xff0c;最方便的是按照环境管理器后从中选择。其中在【externsions】里面安装python即可。 如下&#xff1a; 二、编写launch.json文件 其中如下&#xff1a; {// Use IntelliSense …