开发者学堂课程【自动化运维工具 Ansible 实战: Ansible 实现 role 运维自动化高级用法】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/577/detail/7981
Ansible 实现 role 运维自动化高级用法
内容介绍
一、创建账号
二、部署软件
三、实现主配置文件
四、使用角色
五、调用多个角色
六、综合案例
七、增加标签
八、整除
一、创建账号
NJINX 角色的基本使用,实现了一个 NJINX 的角色,如果有多个角色,通过角色 NJS 中定义了多个任务,包括模板的使用。
nginx_role.yml
roles
httpd
memcache
mysql
nginx
tasks
group.yml
main.yml
restart.yml
start.yml
templ.yml
user.yml
yum.yml
templates
nginx.conf.j2
如果定义别的角色,例如实现 httpd 角色。
代码如下:
Cd httpd/
Bash:cd:httpd/:No such file or directory
Cd roles/httpd/
1s
//在 httpd 角色中搭建实现 httpd 服务,但是 httpd 服务和 NJINX 服务是同类型的,一个是提供 web 服务,httpd 也是一样的 web 服务,所以通常,在同一个主机上不会实现两个服务,一般实现的都是不同的服务。httpd 也类似的实现这样的功能,比如建立 httpd 的用户,把包装上,装上之后通过启动服务配置 httpd。
//建立独立的文件夹
Mkdir tasks
Cd tasks
Is
//在 tasks 中实现基本的任务,比如创建 apache 账户,先查看当前的机器是否有 apache 账户
Getent passwd apache
Apache:x:48:48:apache:/usr/share/httpd:/sbin/nologin
//这表示当前的机器已经有 apache 账户,如果有应该先卸载 web 服务
ansible all -m shell -a ‘yum -y remove httpd’
//卸载完成以后对应的用户账号,如果用对应的 user模块管理,应该删除账号
ansible all -m shell -a ‘name=apache,state=absent’
//如果有加目录,一些数据需要删除应该书写。
Remove=yes
现在对于这台主机,服务和账号都不存在了。
//通过定义 user 的一个剧本,建一个创建用户的剧本。
-name:create user
//创建用户使用 user ,为了使创建的用户具有系统的一些信息,需要指定系统属性。这里不需要指定 id 和组,组会自动创建好。
User:name=apache system=yes shell=/sbin/nologin
二、部署软件
创建完账号后,需要再部署软件。通常 apache 软件可以用 yml 安装,如果生产中要编译安装,不需要在每个 yml 中都编译,可以找一个系统一模一样的,比如在 Sentinels 某一个版本上创建好编译安装的所有数据,然后把安装目录整个打包传到目标主机上就可以了。目标主机的版本应该是一样的。比说这边是 Sentinel7.2,那边也是7.2。这样传过去之后直接启动程序就可以了。
//模拟场景,假设已经有了一些文件,已经生成了。把相应的文件复制过去,代码如下:
vim copyfile.yml
//假设在磁盘上有一些文件已经生成了,用 file 模块把它们传过去
name:copy files
copy:src=
//src 后面跟文件路径,如果放在专门的files目录下,就不用写路径。所以这里直接放在对应的目录下,比如直接先准备好文件。
cd ansible/roles/httpd/
ls
tasks
//建一个文件夹,在里面建文件就即可。
mkdir files
//查看是否有对应的包
rpm -qa httpd
httpd-2.4.6-67.e17.centos.x86_64
//复制web服务的,httpd 服务的配置文件,复制到 files 目录下,这就相当于要复制的文件
cp/etc/httpd/conf/httpd.conf files/
//由于已经放置到 files 目录下,所以可以直接写文件名,复制到目标,比如 dest ,复制到对应的目录下。Copy 模块是复制文件的,复制过去以后,把所有者输出组,比如把所有者改为 apache 。因为前面已经创建了 apache 账户,这样复制过去就可以了。
name:copy files
copy:src=httpd.conf dest=/data/ owner=apache
一般后面还有启动服务之类的,具体介绍见上节课,这里不作详细解释。
三、实现主配置文件
这就是服务的基本操作,接下来是实现主配置文件。一个主的剧本文件,这个剧本文件定义了如何去调用 copyfile.yml user.yml 这两个剧本文件,定义谁是前后。
//定义名为 main 的剧本文件。
vim main. yml
//在剧本文件中,指定它的执行次序,定义完之后就有次序了,执行代码时就会按照次序执行。
-include:user.yml
-Include:copfile.yml.
//以下是 httpd 角色具有的相关文件:
files:
httpd.conf// 这是将来要复制的文件
tasks:
copyfile.yml//这是对应的使用到的剧本文件
main. yml
user. Yml
四、使用角色
//编辑一个创建使用角色的文件
Vim httpd_role.yml
//定义每个机器来调用这个角色
-hosts:websrvs
Remote_user:root
Roles:
-httpd
//这样就可以调用引用此角色。检查能否正常使用
ansible-playbook httpd_role.yml
执行效果如下:表示成功
//验证之前创建的账号是否成功复制进去文件。
Ansible all -m shell -a ‘ls -1/data/’
执行结果如下:表示成功
//验证账号是否生成
Ansible all -m shell -a ‘getent passwd apache’
执行效果。
这里没有账号生成是因为之前是在 webservice 中生成的。
如下所示,目前拥有两个角色,相当于针对不同的企业服务器定义了两个角色,一个是 httpd,一个是 nginx,memcache 和 mysql 还未创建,是空的。
Roles
n
Httpd
u
Files
l
httpd.conf
u
Tasks
l
copyfile.yml
l
main.yml
l
user.yml
n
Mcache
n
Mysql
n
Nginx:
u
tasks:
l
group.yml
l
main.yml
l
restart.yml
l
templ.yml
l
user.yml
l
yum.yml
u
templates:
lnginx.conft.j2
五、调用多个角色
如果要在一个角色中跨项目调用角色,之前调用的是一个角色,如果要调用另外一个角色,如果调用的是另外一个角色,其中另外一个角色中可能有一些相应的任务,比如要求在一个角色中调用其中一个命令,调用 copy ,这是可行的。在一个角色中调用另一个角色或者调用多个角色都是可以的。
举例,同时使用两个角色,在两台多个服务器上把 httpd nginx 角色都应用起来,通常 httpd 角色和 nginx 角色应该是不同功能的。现在假设,网络中有两个功能完全不同的角色,一个是 httpd 的服务,是提供 web 服务,另外一个是提供 pvd 服务,是完全不一样的,需要把这两个角色同时设置在同一组服务器上。
实现这个要求,需要把之前的操作都清除。
ansible all -m user -a ‘name=apachestate=absent’
//删除目录
ansible all -m shell -a ‘rm -rf/data/’
//删除 apache
ansible all -m shell -a ‘yum -y remove nginx’
//删除用户,直接使用 userdel 删除
ansible all -m shell -a ‘userdel -r nginx’
调用两个角色是很简单的操作。
Is
Httpd_role.yml nginx_role.yml roles
//复制 ngx ,调用多个角色
Cp nginx_role.yml some_role.yml
Vim some_role.yml
//只需要再添加一个 role ,这样就实现了定义多个角色,在 websrvs 服务器上将应用两个角色,这两个角色假设是不同类型的服务。因为实际上中 httpd 和 nginx 都是提供 web 服务的,是不合理的,这里是假设。
-hosts:websrvs
Remote_user:root
Roles:
-role:httpd
-role:nginx
//测试能否同时把多个角色应用在一个服务器上
ansible-playbook some_role.yml
执行效果如下:两个角色都完成了。
//查看数据
ll/data/
执行如下:表示成功
total 12
-rw-r—r 1 apache root 11753 May 30 14:17 httpd.conf
//查看对应的服务
ss -ntl
执行如下:表示成功
结果中有两个80,第一个表示是 ipv4 的地址,第二个80表示是 ipv6 的地址,两个不冲突。
调用另外一个角色的一些任务。
//在一个角色中调用另外一个角色中的任务,比如 nginx 中有一个 tasks ,它引用的都是本服务器本角色中的各种任务。
vim role/nginx/tasks/main.yml
-include:group.yml
-include:user.yml
-include:yum.yml
-include:templ.yml
-include:start yml
//现在要引用另外一个角色,比如之前的 httpd 角色,httpd 角色中有一些其他的任务。在 nginx 里借调 httpd 中的 copyfile.yml 任务,不需要重新写一份代码,也不需要拷贝文件,直接调用就可以。
具体做法如下:
vim role/nginx/tasks/main.yml
-include:group.yml
-include:user.yml
-include:yum.yml
-include:templ.yml
-include:start yml
-include:Roles/httpd/tasks copyfile.yml
//表示原来的继续使用,还要再调用别人的任务。调用时,角色的路径很重要。指定是 Roles/httpd/tasks copyfile.yml,这就是跨项目调用别的角色中的任务。如果在同一个角色直接写文件即可,不同的角色需要指定路径。
//为了查看效果,删除之前的文件。
ansible all -m shell -a ‘rm -rf/data/’
//删除之后随便查找机器检查是否删除干净,下面的表示删除干净了。
ll/data/
total 0
//前面已经有了 ngx 角色,这里只需重新执行一遍就可以了。这个角色本身已经包含了之前调用的别的角色中的任务,因为已经把 main 文件修改了,修改了 ngx 中的 main 文件,它除了调用本角色中的任务,还可以调用别的角色中的任务,所以执行 ngx ,调用 ngx 中的角色,自然的就既调用了本角色里的任务,也执行了别的角色中的任务。
cat nginx_role.yml
-hosts:websrvs
Remote_user:root
Roles:
-role:nginx
//由于之前已经做过了用户账号,安装包,这里不会再执行,但是复制文件可能会执行。
运行代码发现出错了,是因为要复制的文件出现了问题,copyfile 文件的路径是在 http 目录下,不是在 ngx 目录下,是文件路径存在问题。复制文件不在一个目录下可能会存在问题,可以通过写绝对路径解决这个问题。
之前在 vim roles/httpb/tasks/copyfile.yml 中书写的是相对路径,修改为绝对路径。
copy:src=/etc/httpd/conf/httpd.conf dest=/data/ owner=apache
执行效果如下,表示成功
//检查文件是否复制过来。如下表示成功。
ll /data/
total 12
-rw-r—r 1 apache root 11753 May 30 14:17 httpd.conf
以上就是跨角色调用另外一个角色中的任务,要注意文件的问题,如果文件是相对路径,跨角色会找不到文件路径。
六、增加标签
针对角色中定义相关的一些 target 也就是标签。针对不同的角色加标签。比如之前有两个角色,可以再调用它们的 paybook 中加对应的标签。这里出现了 nginx_roe.retry 是由于失败生成的,失败就会生成这个日志。
//创建两个角色,打开对应的剧本文件,在这里针对两个或者多个角色起标签。标签的方法是加 {role:httpd,tags:} 相当于字典,键值对。
标签是一个列表,可以起多个标签。比如 {role:httpd,tags: [‘web’,’httpd’] },这是相当于给 role 运行时添加了标签,属于 web,也属于 httpd。类似的实现 nginx -{role:nginx,tags: [‘web’,’nginx’] }
Vim some_role.yml
-hosts:websrvs
Remote_uesr:root
Roles:
-{role:httpd,tags:[‘web’,’httpd’]
-{role:nginx,tags:[‘web’,’nginx’]
//这是对当前的角色起标签,这就意味着在将来执行剧本时可以挑一些标签执行。标签是给对应的内容加一些标签,就可以挑选性的执行标签。在这里挑 web 相当全部执行,挑 nginx 就只执行 nginx 标签。
//为了查看效果,专门构建一个 app 角色。在目录中查看到新建的 app 角色。
其中 app 角色名称只是一个 App ,它不是由多个元素组合成,只有一个值。
Cp -r nginx/app/
vim some_role,yml
-hoets:websrvs
Remote_uesr:root
Roles:
-{role:httpd,tags:[‘web’,’httpd’]}
-{role:nginx,tags:[‘web’,’nginx’]}
-{role:app,tags:[‘app’]}
//这里标签定义完之后,如果只运行 web 而不运行 app
Ansible-playbook -t web some_role.yml
虽然 some 中定义了很多角色,但这里是挑 web 执行,所以就只会运行 {role:httpd,tags:[‘web’,’httpd’]}
{role:nginx,tags:[‘web’,’nginx’]}
。运行结果中 httpd 和 nginx 的任务都执行了,app 的角色没有被执行。
//还可以加入一些条件判断,只有在特定的情况下采取执行,比如在特定的情况下执行 ngx ,添加单独的 when 语句。比如在版本是只有7的情况下才可以执行。
判断版本6和7用 ansible_distrubution_。为了看效果把 hoets:websrvs改为 hoets:all
-hoets:all
Remote_uesr:root
Roles:
-{role:httpd,tags: [‘web’,’httpd’]
{role:nginx,tags:[‘web,’nginx],when:ansible_distribution_major_version==”7”}
-{role:app,tags: [“app”] }
//这次不需要添加标签,加标签也可以,执行的是 web’’httpd’
对于
{role:nginx,tags:[‘web,’nginx],when:ansible_distribution_major_version==”
7”}角色不会针对 sentinels 6执行,对于 {role:httpd,tags:’app’} sentinels6和sentinels 7 都会执行,因为没有制定条件。
执行效果如下:
httpd的角色执行完,nginx 的角色跳过了,103本身就是 sentinel6 ,app 也继续执行了。App 是复制的所以和 nginx 是内容是相同的,这就是模拟了一个过程。
因为在前面已经执行过,所以有些结果是绿色的,在 sentinels6 上没有执行所以是黄色的,有的代码出错是因为启动时出现了问题,在 {role:nginx,tags:[‘web,’nginx],when:ansible_distribution_major_version==7}已经在 sentinel7 把 ngx 服务已经启动了,结果由于 {role:httpd,tags:’app’} 中的 app 和 ngx 完全一样,所以 app 也尝试启动服务,这样由于它们都是80端口,nginx 先启动了,所以就会报错提示错误103失败。
//检测103失败是否是因为有 httpd 服务
ss -ntl
执行结果中没有80端口,因为使用的是7的版本,直接复制代码过去,格式对不上,这个错误是由于版本问题不同出现的。在 app 目录下调用了 nginx 模板,模板使用的是 sentinel7,复制到 sentinel6 使用会出现问题,是由于版本问题不同导致的,不是语句有问题。
这是介绍的 ngx ,包含各种角色,在生产中可以考虑针对不同的服务器定义成不同的角色,在调用时非常方便。
七、综合案例
综合之前所学的内容实现一个问题,包括前面所学的 handler,文件,模板都可以使用。
//建立一个新的应用,名为 app,app 中定义的内容综合了创建账号,组,模板,handler 等知识。
mkdir app
cd app
ls
//这次用 http 服务实现,先建一些文件夹,在 APP 目录下,这本身是一个角色,建立一些相关的文件夹,比如说 tasks,模板 template,变量 vars ,handlers 触发器,如果有文件也要建立文件。
Pwd
/root/ansible/roles/app
Mkdir tasks templates vars handlers files
这样就建立了一个完整的架构。 app 是模拟应用,以 http 服务器软件为例,http 服务器,首先建立对应的用户,在 tasks 中加入创建账号的内容。
//先清理数据,删除用户,卸载服务。
ansible all -m shell -a ‘rm -rf/data/’
ansible all -m shell -a ‘undel -r appache ’
ansible all -m shell -a ‘yum -y remove httpd’
//假设有一个应用程序,要部署一个角色,先在 tasks 中准备相关任务,首先根据前面的流程,创建账号,创建组,包括在其中准备一些必要的模板,文件复制,变量等等
cd tasks
ls
//创建组,命名为 app ,指定为系统组。在这个组中没有 share。这里是模拟应用,所以用 app 代称。
Vim group .yml
-name :create group
Group:name=app system=yes gid=123
//创建用户,指定用户的组和系统,指定shell,一般服务使用的是 shell=/sbin/nologin ,也可以指定 uid 地址,查找一个未被使用过的 uid 地址:ansible all -m shell -a ‘getet passwd|grep 123’,123没有被使用过。组也要统一加上 gid=123 地址
Vim user .yml
-name :create user
user:name=app system=yes shell=/sbin/nologin uid=123
//创建完用户后进行装包,用 http 包模拟装包。
Vim yum.yml
-name: install package
Yum: name=httpd
//装完包之后,拷贝模版,查看本机的模板文件是否安装了 http 服务,如果 http 服务已经装上,就可以在此基础上进行修改之后当模板。
Vim/etc/httpd/conf/httpd.conf
//没有发现适合当模板的地方,再查看是否有调动模版的比较合适的位置。
rpm -ql httpd
rpm -ql httpd|less
//把复制/etc/httpd/conf/httpd.conf..过去当模版,复制到 templates 的目录下,改名为
conf.j2
cp/etc/httpd/conf/httpd.conf../templates/httpd.conf.j2
vim../templates/httpd.conf.j2
//尝试调用一个变量,在监听端口处,监听端口默认是80,改为用一个变量表示。假设用刚才的 CPU 数据,目前是两个 cpu,这里改为 cpu*10。4个cpu*10是40,Cpu 的个数是 processor-vcpus
Listen {{ansible-processor-vcpus*10}},
//用变量实现用户,变量用刚才创建好的两个用户,但是暂时先不定义用户,用变量实现。
User{{username}}
Group{{groupname}}
//准备变量文件,在之前已经规划好一个文件夹 vars,在 vars 下建 main.myl,在 main 中定义变量,变量的内容直接赋值就可以。定义完变量之后,将来就可以使用。
Vim vars/main.yml
-Username:app
-groupname:app
//拷贝模板
Vim tasks/templ.yml
name:copy conf
Template:src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
Notify: restart service
//触发一个 Notify, 重启服务,触发的 handler 应该放在专门的一个目录中。
//创建 handler,handler 放在专门的一个目录中。之前已经创建好了 handler ,这里只需在 handler 中创建对应的 handler。要求名字必须叫 retart service
Vim handlers/restart.yml/
name: retart service
service: name=http state=restarted
//按照任务列表目前还缺少服务启动,建立服务启动。
Vim tasks/start.yml
name: start service
service: name=httpd state=started enabled=yes//
设置为开机启动
这样就实现了初步的设置。检查格式是否有问题。
缺少 files 文件
//拷贝一个配置文件过去,假设建一个文件,这也属于配置文件。在 tasks 中建文件。加一个新任务,用 copy 模块实现。Copy 模块对应的 src 文件在 files 目录中,不用书写。
复制到/etc/httpd/conf.d/下。权限用 ngx ,更改权限 owner=app,所有者是 app。
Touch files/vhosts.conf/
vim tasks/copyfile.yml
name:copy config
Copy: src=vhosts.cof dest=/etc/httpd/conf.d/ owner=app
//这样就初步建好了文件,进到 tasks 中定义次序。定义先执行 group,第二步 user ,第三步 yum,第四步 templ,之后拷贝文件,最后是 start
cd tasks
ls
Copyfile.yml group.yml start.yml user.yml yum.yml
vim main.yml
-Include: group.yml
-Include: user.yml
-Include: yum.yml
-Include: templ.yml
-Include:copyfile.yml
-Include:satart.yml
//检查能否运行,验证是否正确。服务不一定可以启动,因为这里定义的是 app 。yml 安装完后默认把文件夹所有者配置为 apache。这里创建的服务是 app ,所以服务可能存在问题。
先查看是否有属于 apache 的目录的文件,发现没有,可以尝试运行是否能成功。因为把默认的 apache 账户改为 app 了。
//创建一个角色,角色修改为 app
Cd httpd_role.yml app_role.yml
-hosts:websrvs
Remote_users:root
Roles:
-app
//测试当前编写的 paybook 能否正常运行。
ansible-paybook-c app_role.yml
//测试语法结果报错,修改格式。把”-“删除
Vim roles/apps/vars/main.yml
Username:app
groupname:app
//再次测试报错,查看路径,restart.yml 应该是main.yml 。进到角色中,修改文件名,内容不进行修改。
Cd roles/app/handlers
is
restarts.yml
mv restart.yml main.yml
//再次测试,检查语法,运行成功。
ansible-paybook -c app_role.yml
//正式执行,查看两个主机服务是否起来了
ansible-paybookapp_role.yml
ss-ntl
//有80端口,在检查是不是由 app 账户启动,可以根据 cpu 个数进行判断,发现执行的 cpu 个数是40,所以确定是以 app 的身份运行的。
Ss -ntlp grep app
执行结果
//检查文件是否拷贝过来,文件是空文件,是举的一个例子,检查发现成功复制过来。
ls /etc/httpd/conf.d/
以上运用所学知识解决了一个有规模的项目,可以在搭建服务器时借助这行批量署。
八、整除
小技巧:在模板中讲解过加减乘除的知识,还有整除的知识未讲解。
比如有个角色是空的没有建,memcache 改名为 memcached,给这个角色建两个文件夹。
两个文件夹建好以后,借助一个模板设置此 Memcached 的服务。Memcached 的服务是当作缓存使用的。先在本机安装 Memcached,安装好后,拿 Memcached 的配置文件当模板使用。
Mv memcache/memcached
Cd Memcached
Mkdir tasks templates
Yum install Memcached
//查看 Memcached 的配置文件,在 /etc/sysconfig/Memcached 中定义了一些东西
Rpm -ql Memcached
//查看
/etc/sysconfig/Memcached
Cat /etc/sysconfig/Memcached
PORT="11211"
USER= " memcached"
MAXCONN=" 1024”
CACHESIZE= "64”
OPTIONS=""
//Memcached 是内存当缓存使用的,CACHESIZE="64”就是缓存占用空间大小,是以兆为单位,Memcached 装完后在内存中会占用固定大小的64兆的作为缓存,64兆对于大型服务器来说不够使用,所以需要根据物理内存的大小来决定此内存的缓存大小。
比如要占用物理内存的四分之一,实现这个要求就需要用 template 中的整除知识。目前两个机器物理内存的大小都是 1G,所以增加内存使其不一样,一个改为2G。在两台主机上部署 Memcached,部署的 Memcached 在启动后占用内存是物理空间的四分之一。
Memcached 的配置文件中 PORT="11211" “11211”是 Memcached 在的端口号,如果 Memcached 的端口号”11211”启动了就代表服务器就起来了。而且可以看到 /user/lib/systemd/system/Memcached.service 是 Memcached 的服务名。学了这些知识以后,拿到一个新模板,可以知道它的一些特性。
//把 Memcached 作为模板,复制到 templates 文件夹中,文件名是 j2。
Cp /etc/sysconfig/ Memcached templates/ Memcached.j2
//修改文件中的 CACHESIZE= "64”,用 ansible_memtotal_mb 除,如果使用”“除会有小数。所以使用”//”整除。
Vim templates/Memcached.j2
PORT="11211"
USER= " memcached"
MAXCONN=" 1024”
CACHESIZE= "ansible_memtotal_mb//4”
OPTIONS=""
//查看物理内存的四分之一可以用以下代码:
Ansible all -m setup -a “filter=”memtotal
//建立 tasks 双包的文件。包名是 memcached
Vim tasks /yum.yml
-name install package
Yum:name=memcached
//建一个启动服务的代码
-name: start service
service: name=memcached state=started enabled=yes
//补充一个模板文件,模板文件放在当前目录下所以只写文件名就可以。
Vim tasks/templ.yml
-name:copy conf
template: src=memcached.j2 dest=/etc/sysconfig/Memcached
//准备一个 main 文件引用。
Vim tasks/main.yml
-include:yum.yml
-include:templ.yml
-include:start.yml
//检验是否成功。
Tree
Tasks:main.yml
Start.yml
templ.yml
yum.yml
temlates:
Memcached.j2
表示成功。
//调用脚本,调用剧本
Vim Memcached_role.yml
-hosts: websrvs
Remote-user: root
Roles:
-memcached
//测试没有错误显示。
Ansible-paybook -c Memcached_role.yml
//正式执行。
Ansible-paybook Memcached_role.yml
//检查是否成功,检查服务是否已经启动,检查到有端口是11211表示成功。
Ansibe all -m shell -a ‘ss -ntlpe’
//检查复制过去的文件,里面应各不相同
Ansible-all -m shell -a ‘cat’/etc/sysconfig/memcached”
//结果报错,检查模板
Vim roles. Memcached/templates/ memcached.j2
PORT="11211"
USER= " memcached"
MAXCONN=" 1024”
CACHESIZE= "{{ansible_memtotal_mb//4}}”
OPTIONS=""
把文件拷贝过去就可以了。
//再次执行,正常是 handler 触发一下,配置文件重拷,应该重启服务。
Ansible-paybook Memcached_role.yml
//再次查看
Ansible-all -m shell -a ‘cat’/etc/sysconfig/memcached”
结果分别是 CACHESIZE= "524”, CACHESIZE= "268”, CACHESIZE= "524 是两个 G 的四分之一,CACHESIZE= "268”是一个 G 的四分之一。这就是角色的使用。