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 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.
...

 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):
    node1
    node2
    node3
    node4
    node5

注意:必须切换到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 Server
   Loaded: 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 Server
   Loaded: 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 VFree
  myvg   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  VFree
  myvg   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 Convert
  mylv myvg -wi-a----- 1.00g    
[root@node1 ~]# lvscan
  ACTIVE            '/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 Convert
  mylv 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:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解

  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值