自动化运维:Ansible之playbook基于ROLES部署LNMP平台

目录

一、理论

1.playbook剧本

2.ROLES角色

3.关系

4.Roles模块搭建LNMP架构

二、实验

1.Roles模块搭建LNMP架构

三、问题

1.剧本启动php报错语法问题

2.剧本启动mysql报错语法问题

3.剧本启动nginx开启失败

4.剧本安装php失败

5.使用yum时报错

[6.rpm -Uvh https://xxxx.rpm 提示连接失败问题](#6.rpm -Uvh https://xxxx.rpm 提示连接失败问题)

7.依赖检测失败

8.剧本修改php失败

9.剧本启动php失败

10.剧本修改mysql脚本文件失败


一、理论

1.playbook剧本

(1)架构

bash 复制代码
vim  XXX.yaml
- name:                      #指定play名称
  hosts:                     #指定主机组
  remote_user:               #执行用户 
  gather_facts: true|false   #是否收集远程主机facts信息
  vars:                      #定义变量
  tasks:                     #定义task任务列表
  - name:                 #定义task任务名称
    模块:                 #定义任务使用的模块和参数
    with_items:           #定义循环列表
    when:                 #定义判断条件(== != >= > <= <),true则执行任务,否则不执行任务
	ignore_errors: true   #忽略任务失败
    notify:               #定义task任务changed状态时触发的任务名
    tags:                 #指定标签,ansible-playbook --tags 仅执行拥有指定 tags 标签的任务(always标签总会执行)
  handlers:                  #定义notify触发的任务列表

(2)核心元素

(3)参数

2.ROLES角色

(1)重构思路

用roles和不用roles的逻辑其实是一样的,要根据服务器的功能,先收集服务器所需要的文件,再进行安装,传输文件,启动服务或重启服务等操作。只是我们这次不必担心命名问题,因为不同的服务或不同功能的服务器所需要的配置文件会被放到不同的目录,不会冲突。

roles这个角色,可以根据同类服务器的功能定义,也可以通过服务去定义,因为我们是一键部署所有服务和项目,也不存在指定部署服务的需求,如果通过服务来定义,也容易出现需要很多when判断的情况,如果用同类功能的服务器定义角色,可能会出现同一条命令需要反复编写的情况,自行选择,我采取根据同类功能服务器去定义我们的roles角色。

(2)目录结构

(3)目录说明

3.关系

playbook是是由一系列的play组成, 每个play由一个或者多个task组成, 一个task一般是一个ansible module, 三者的关系示意图如下:

4.Roles模块搭建LNMP架构

(1)规划

通过ansible的roles角色去配置lnmp环境,nginx、php、mysql都使用源码编译安装

(2)架构

(3)部署Nginx角色

创建nginx角色所需要的工作目录:

bash 复制代码
mkdir -p /etc/ansible/playbook/roles/nginx
mkdir -p /etc/ansible/playbook/roles/nginx/defaults
mkdir -p /etc/ansible/playbook/roles/nginx/files
mkdir -p /etc/ansible/playbook/roles/nginx/handlers
mkdir -p /etc/ansible/playbook/roles/nginx/meta
mkdir -p /etc/ansible/playbook/roles/nginx/tasks
mkdir -p /etc/ansible/playbook/roles/nginx/templates
mkdir -p /etc/ansible/playbook/roles/nginx/vars

制作/etc/ansible/playbook/roles/nginx/files/index.php网页目录:

bash 复制代码
vim /etc/ansible/playbook/roles/nginx/files/index.php

<?php
phpinfo();
?>

制作/etc/ansible/playbook/roles/nginx/files/nginx.repo源:

bash 复制代码
vim /etc/ansible/playbook/roles/nginx/files/nginx.repo
# nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

制作/etc/ansible/playbook/roles/nginx/handlers/main.yml文件,加载nginx的配置模板文件:

bash 复制代码
vim /etc/ansible/playbook/roles/nginx/handlers/main.yml
- name: reload nginx
  service: name={{service}}  state=reloaded

制作/etc/ansible/playbook/roles/nginx/tasks/init.yml文件:

bash 复制代码
vim /etc/ansible/playbook/roles/nginx/tasks/init.yml
- name: disable firewalld
  service: name=firewalld  state=stopped  enabled=no
  ignore_errors: True

- name: disable selinux
  shell: "/usr/sbin/setenforce 0"
  ignore_errors: true

制作/etc/ansible/playbook/roles/nginx/tasks/main.yml文件:

bash 复制代码
- include: "init.yml"

- name: copy nginx yum repo file
  copy: src=nginx.repo  dest=/etc/yum.repos.d/

- name: install nginx
  yum: name={{pkg}}  state=latest

- name: copy index.php
  copy: src=index.php  dest={{root_dir}}

- name: copy nginx template configuration file
  template: src=default.conf.j2  dest=/etc/nginx/conf.d/default.conf
  notify: reload nginx

- name: start nginx
  service: name={{service}} state=started enabled=yes

制作/etc/ansible/playbook/roles/nginx/templates/default.conf.j2模板文:

bash 复制代码
vim /etc/ansible/playbook/roles/nginx/templates/default.conf.j2 

---修改2到8行-----------
       listen       {{http_port}};
       server_name  {{http_hostname}};
 
       #access_log  /var/log/nginx/host.access.log  main;
 
     location / {
         root   {{root_dir}};

---修改29到36行-----------
    location ~ \.php$ {
         root           {{root_dir}};
         fastcgi_pass   {{http_remote}};
         fastcgi_index  index.php;
         fastcgi_param  SCRIPT_FILENAME  {{root_dir}}$fastcgi_script_name;
        include        fastcgi_params;
     }

制作/etc/ansible/playbook/roles/nginx/vars/main.yml文件:

bash 复制代码
http_port: 192.168.204.69:80
http_hostname: www.david.com
root_dir: /usr/share/nginx/html
http_remote: 192.168.204.100:9000
pkg: nginx
service: nginx

(4) 部署PHP角色

创建php角色所需要的工作目录:

bash 复制代码
mkdir -p /etc/ansible/playbook/roles/php
mkdir -p /etc/ansible/playbook/roles/php/defaults
mkdir -p /etc/ansible/playbook/roles/php/files
mkdir -p /etc/ansible/playbook/roles/php/handlers
mkdir -p /etc/ansible/playbook/roles/php/meta
mkdir -p /etc/ansible/playbook/roles/php/tasks
mkdir -p /etc/ansible/playbook/roles/php/templates
mkdir -p /etc/ansible/playbook/roles/php/vars

制作/etc/ansible/playbook/roles/php/files/index.php的网页文件:

bash 复制代码
vim /etc/ansible/playbook/roles/php/files/index.php 

<?php
phpinfo();
?>

制作/etc/ansible/playbook/roles/php/handlers/main.yml文件:

bash 复制代码
vim /etc/ansible/playbook/roles/php/handlers/main.yml 

- name: reload php
  service: name={{service}} state=reloaded

制作/etc/ansible/playbook/roles/php/tasks/main.yml文件:

bash 复制代码
/etc/ansible/playbook/roles/php/tasks]# vim main.yml 

- name: install yum repo
  shell: "rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm && rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm"
  ignore_errors: True

- name: install php
  command: 'yum install -y php72w php72w-cli php72w-common php72w-devel php72w-embedded php72w-gd php72w-mbstring php72w-pdo php72w-xml p    hp72w-fpm php72w-mysqlnd php72w-opcache --skip-broken'

- name: create php user
  user: name={{user_name}}

- name: crate web root dir
  file: name={{root_dir}} state=directory

- name: copy index.php
  copy: src=index.php dest={{root_dir}}

- name: modify php configuration file
  replace: path=/etc/php.ini  regexp=";date.timezone ="  replace="date.timezone = Asia/Shanghai"
  notify: reload php

- name: modify username and groupname in www.conf
  replace: path=/etc/php-fpm.d/www.conf  regexp="apache"  replace="{{user_name}}"
    notify: reload php

- name: modify listen addr in www.conf
  replace: path=/etc/php-fpm.d/www.conf  regexp="127.0.0.1:9000"  replace="{{http_port}}"
  notify: reload php

- name: modify allowed client in www.conf
  replace: path=/etc/php-fpm.d/www.conf  regexp="127.0.0.1"  replace="{{remote_addr}}"
  notify: reload php

- name: start php
  service: name={{service}} state=started enabled=yes

制作/etc/ansible/playbook/roles/php/vars/main.yml文件:

bash 复制代码
vim /etc/ansible/playbook/roles/php/vars/main.yml 

timezone: Asia/Shanghai
user_name: php
http_port: 192.168.204.100:9000
remote_addr: 192.168.204.69
root_dir: /usr/share/nginx/html
service: php-fpm

(5) 部署MySQL角色

创建mysql角色所需要的工作目录:

java 复制代码
mkdir -p /etc/ansible/playbook/roles/mysql
mkdir -p /etc/ansible/playbook/roles/mysql/defaults
mkdir -p /etc/ansible/playbook/roles/mysql/files
mkdir -p /etc/ansible/playbook/roles/mysql/handlers
mkdir -p /etc/ansible/playbook/roles/mysql/meta
mkdir -p /etc/ansible/playbook/roles/mysql/tasks
mkdir -p /etc/ansible/playbook/roles/mysql/templates
mkdir -p /etc/ansible/playbook/roles/mysql/vars

制作/etc/ansible/playbook/roles/mysql/handlers/main.yml文件:

bash 复制代码
vim /etc/ansible/playbook/roles/mysql/handlers/main.yml 

- name: reload mysql
  service: name={{service}} state=reloaded

制作/etc/ansible/playbook/roles/mysql/tasks/main.yml文件:

bash 复制代码
vim /etc/ansible/playbook/roles/mysql/tasks/main.yml 

- name: remove mariadb
  shell: yum remove mariadb* -y
  ignore_errors: True

- name: install yum repo
  shell: "wget https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm --force --nodeps && rpm -ivh mysql57-commu    nity-release-el7-11.noarch.rpm --force --nodeps"
  ignore_errors: True

- name: modify gpgcheck
  replace: path=/etc/yum.repos.d/mysql-community.repo  regexp="gpgcheck=1"  replace="gpgcheck=0"

- name: install mysql
  yum: name=mysql-server state=latest

- name: start mysql
  service: name={{service}} state=started enabled=yes

- name: make passwd.sh
  script: /etc/ansible/playbook/roles/mysql/files/passwd.sh

制作/etc/ansible/playbook/roles/mysql/vars/main.yml文件:

bash 复制代码
vim /etc/ansible/playbook/roles/mysql/vars/main.yml 

service: mysqld.service

(5)启动安装分布式LNMP

bash 复制代码
vim /etc/ansible/playbook/lnmp.yml 

- name: nginx play
  hosts: webservers
  remote_user: root
  roles:
  - nginx

- name: php play
  hosts: phpservers
  remote_user: root
  roles:
  - php


- name: mysql play
  hosts: mysqlservers
  remote_user: root
  roles:
  - mysql

二、实验

1.Roles模块搭建LNMP架构

(1)环境

表1 主机

|-------|-----------------|---------|
| 主控端 | 192.168.204.199 | ansible |
| 受控端-1 | 192.168.204.69 | nginx |
| 受控端-2 | 192.168.204.186 | mysql |
| 受控端-3 | 192.168.204.100 | php |

(2) 配置主机

(3)部署Nginx角色

创建nginx角色所需要的工作目录:

制作/etc/ansible/playbook/roles/nginx/files/index.php网页目录:

制作/etc/ansible/playbook/roles/nginx/files/nginx.repo源:

制作/etc/ansible/playbook/roles/nginx/handlers/main.yml文件,加载nginx的配置模板文件:

制作/etc/ansible/playbook/roles/nginx/tasks/init.yml文件:

制作/etc/ansible/playbook/roles/nginx/tasks/main.yml文件:

制作/etc/ansible/playbook/roles/nginx/templates/default.conf.j2模板文:

制作/etc/ansible/playbook/roles/nginx/vars/main.yml文件:

(4) 部署PHP角色

创建php角色所需要的工作目录:

制作/etc/ansible/playbook/roles/php/files/index.php的网页文件:

制作/etc/ansible/playbook/roles/php/handlers/main.yml文件:

制作/etc/ansible/playbook/roles/php/tasks/main.yml文件:

制作/etc/ansible/playbook/roles/php/vars/main.yml文件:

(5) 部署MySQL角色

创建mysql角色所需要的工作目录:

​​​​​​​注意:需要提前创建passwd.sh

制作/etc/ansible/playbook/roles/mysql/handlers/main.yml文件:

制作/etc/ansible/playbook/roles/mysql/tasks/main.yml文件:

制作/etc/ansible/playbook/roles/mysql/vars/main.yml文件:

(6)启动安装分布式LNMP

启动:

nginx启动成功

php启动成功:

mysql启动成功:

访问浏览器成功

三、问题

1.剧本启动php报错语法问题

(1)报错

(2)原因分析

左端代码未对齐

(3)解决方法

修改前

修改后

2.剧本启动mysql报错语法问题

(1) 报错

(2)原因分析

左端代码未对齐

(3)解决方法

修改前

修改后

3.剧本启动nginx开启失败

(1)报错

(2)原因分析

nginx端查询

default.conf.j2 配置错误

未知的地址池

(3)解决方法

nginx端先移除多余配置文件

ansible端修改配置文件:

修改前:

修改后:

4.剧本安装php失败

(1) 报错

(2)原因分析

弃用警告\]:只在通过squash_actions使用循环时调用"yum"一次是不赞成的。而不是如果使用循环提供多个项目并指定' name: "{{ item }}" ',请使用' name: '{{ ... }}' '并删除循环。这个特性将在2.11版本中删除。弃用的警告可以通过在ansible.cfg中设置deprecation_warnings=False来禁用。 (3)解决方法 这里先暂不修改yml文件 修改php端网卡: ![](https://file.jishuzhan.net/article/1697095237186359297/bfd36094c98145aa87df2ed2611dbc88.png) ![](https://file.jishuzhan.net/article/1697095237186359297/ff1bf3447ca947f59c6658e3d490f070.png) 关闭防火墙和安全机制 ![](https://file.jishuzhan.net/article/1697095237186359297/e8039d3480704bc3afeca51039531a17.png) ![](https://file.jishuzhan.net/article/1697095237186359297/0c5e1de6c719486ca2195f7e0527e962.png) 如还是报错,修改/etc/ansible/playbook/roles/php/tasks/main.yml文件,安装方式不采用with_items方式,直接以command模块方式运行 修改前: ![](https://file.jishuzhan.net/article/1697095237186359297/fd5e25f478e040cbba6bbd55b2aa0313.png) 修改后: ![](https://file.jishuzhan.net/article/1697095237186359297/5be9a67fe0934da5b6a8c4683744d68c.png) 成功 ![](https://file.jishuzhan.net/article/1697095237186359297/c3c94d4a022e4aa2962982831b9453d9.png) ## **5.使用yum时报错** (1)报错 遇见failure: repodata/repomd.xml from base: \[Errno 256\]错误 ![](https://file.jishuzhan.net/article/1697095237186359297/ac3b0db51bdc47c2a17177e9a3e25b86.png) (2)原因分析 yum源 (3)解决方法 更新依赖包,重新安装发现没用 ```bash yum clean all yum install -y epel-release ``` 更新ca-certficates包 ```bash yum clean all yum --disablerepo=epel -y update ca-certificates ``` 将https转为http ```bash cp /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.bak sed -i 's#https://#http://#g' /etc/yum.repos.d/epel.repo ``` 更改resolv.conf文件,然后重启network服务:service network restart ```bash nameserver 8.8.8.8 search localdomain ``` 以上步骤执行完成后如果仍然失败,继续执行以下步骤: 查看yum的依赖包 ```bash [root@localhost yum.repos.d]# rpm -qa|grep yum PackageKit-yum-1.1.10-2.el7.centos.x86_64 yum-plugin-fastestmirror-1.1.31-54.el7_8.noarch yum-langpacks-0.4.2-7.el7.noarch yum-metadata-parser-1.1.4-10.el7.x86_64 yum-utils-1.1.31-54.el7_8.noarch yum-3.4.3-168.el7.centos.noarch ``` ![](https://file.jishuzhan.net/article/1697095237186359297/a681a0df40e547acb96f829186230e18.png) 删除依赖包 ```bash [root@localhost yum.repos.d]# rpm -e yum-plugin-fastestmirror-1.1.31-54.el7_8.noarch --nodeps yum-metadata-parser-1.1.4-10.el7.x86_64 yum-3.4.3-168.el7.centos.noarch ``` ![](https://file.jishuzhan.net/article/1697095237186359297/8d585ddf91414186b9dfe0b982bb2dd3.png) 将系统默认的yum功能删除 ```bash [root@localhost yum.repos.d]# rpm -aq|grep yum|xargs rpm -e --nodeps ``` ![](https://file.jishuzhan.net/article/1697095237186359297/3ad77870ad744e70a112010fa4ab8d75.png) 查看本版和系统的位数 ```bash [root@localhost yum.repos.d]# cat /etc/centos-release CentOS Linux release 7.9.2009 (Core) ``` ![](https://file.jishuzhan.net/article/1697095237186359297/6580c4ed76bd456493a75ed1e30db37f.png) ```bash [root@localhost yum.repos.d]# file /bin/ls /bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=c8ada1f7095f6b2bb7ddc848e088c2d615c3743e, stripped ``` ![](https://file.jishuzhan.net/article/1697095237186359297/ef58f594666041a097caf9b6c2927a3c.png) 下载yum包 ```bash # wget http://vault.centos.org/7.2.1511/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-34.el7.noarch.rpm # wget http://vault.centos.org/7.2.1511/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm # wget http://vault.centos.org/7.2.1511/os/x86_64/Packages/yum-3.4.3-132.el7.centos.0.1.noarch.rpm ``` ![](https://file.jishuzhan.net/article/1697095237186359297/19086efd0cf44dd18f841990a2cfd601.png) ![](https://file.jishuzhan.net/article/1697095237186359297/8ca924045f0048b28ea043b760cddbce.png) 注意:要注意版本 在http://mirrors.kernel.org/centos/ 或者 http://mirrors.163.com/centos/里下载 下载完成执行以下命令 ```bash # rpm -ivh --nodeps yum-plugin-fastestmirror-1.1.31-34.el7.noarch.rpm # rpm -ivh --nodeps yum-metadata-parser-1.1.4-10.el7.x86_64.rpm # rpm -ivh --nodeps yum-3.4.3-132.el7.centos.0.1.noarch.rpm ``` ![](https://file.jishuzhan.net/article/1697095237186359297/5f7f13cd7f6a458e9493fe621bf6365d.png) 进入 /etc/yum.repos.d/目录中,在http://mirrors.163.com/.help/centos.html,在里面下载对应版本的repo文件,我下载了CentOS-Base.repo 对此文件进行备份,以防修改错误还有的用 修改$releasever为自己的版本号(我的为7) 保存退出 ## 6.rpm -Uvh https://xxxx.rpm 提示连接失败问题 (1)报错 ![](https://file.jishuzhan.net/article/1697095237186359297/b0b99962ade5447286f52db27a8bdc86.png) (2)原因分析 域名解析失败 (3)解决方法 查询IP地址 通过[What Is My IP Address? Free IP Lookup](https://www.ipaddress.com/ "What Is My IP Address? Free IP Lookup")查询对应url ip地址: ![](https://file.jishuzhan.net/article/1697095237186359297/249fd8c15d2e49ff90d61efc8ae34ca7.png) 修改hosts 文件,追加一下内容 ```bash vim /etc/hosts 45.55.104.9(ip) webtatic.com(可自定义) ``` 重新执行命令,访问对应地址成功 ## 7.依赖检测失败 (1)报错 "警告:/var/tmp/rpm-tmp.cw1TWT: 头V4 RSA/SHA256 Signature, 密钥 ID 352c64e5: NOKEY\\n\\t软件包 epel-release-7-14.noarch 已经安装", "stderr_lines": \["警告:/var/tmp/rpm-tmp.cw1TWT: 头V4 RSA/SHA256 Signature, 密钥 ID 352c64e5: NOKEY" ![](https://file.jishuzhan.net/article/1697095237186359297/009050c92b394ff49854d7cbbd8d176a.png) (2)原因分析 未忽视依赖关系 (3)解决方法 在后面加上--force --nodeps就可以了,nodeps的意思是忽视依赖关系。 ```bash rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm --force --nodeps && rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm --force --nodeps // 以上是我个人下载的erlang版本,要依据你们自己下载的版本改一下 ``` 修改前: ![](https://file.jishuzhan.net/article/1697095237186359297/af5421137a70488dac5eb59d50cd3eef.png) 修改后: ![](https://file.jishuzhan.net/article/1697095237186359297/1a93b2b0966f47209ca8d7bf53e22959.png) 成功 ![](https://file.jishuzhan.net/article/1697095237186359297/e4a8aab66d6543f3b60710fd9484fbfa.png) ## 8.剧本修改php失败 (1)报错 www.conf文件不存在 ![](https://file.jishuzhan.net/article/1697095237186359297/74fdc8f9e416442387cc9c47f5d6f2d3.png) (2)原因分析 缺失文件 (3)解决方法 新建目录并上传文件 ![](https://file.jishuzhan.net/article/1697095237186359297/85eec076b0b54578b004ab441196284a.png) 成功 ![](https://file.jishuzhan.net/article/1697095237186359297/f78b81d1e0e1423887d3913f4180db42.png) ## 9.剧本启动php失败 (1)报错 ansible端 ![](https://file.jishuzhan.net/article/1697095237186359297/fcab14fce2aa45d6ad445d3bf86616a0.png) php端: Failed to start php-fpm.service: Unit not found ![](https://file.jishuzhan.net/article/1697095237186359297/d4ea1540eee844f28264bfc4aebfcdfe.png) (2)原因分析 系统中没有配置 php-fpm.service 文件 (3)解决方法 通过find / -name nginx.service 找到nginx.service 配置文件路径 ```bash [root@localhost php-fpm.d]# find /lib/systemd/system -name "php-fpm.service" [root@localhost php-fpm.d]# find /etc/systemd/system -name "php-fpm.service" /etc/systemd/system/php-fpm.service ``` ![](https://file.jishuzhan.net/article/1697095237186359297/af145ea0a0144e6a8c190ec0f3d4587d.png) 创建软链接 ```bash [root@localhost php-fpm.d]# sudo ln -s /lib/systemd/system/php-fpm.service /etc/systemd/system/php-fpm.service ``` ![](https://file.jishuzhan.net/article/1697095237186359297/e7af7f3d6ae94d628930cc75ea24686b.png) 然后去到那个路径 新建一个php-fpm.service文件 保存下面这一段内容,php-fpm路径根据自己的实际情况修改 ```bash [Unit] Description=The PHP FastCGI Process Manager After=syslog.target network.target [Service] Type=simple PIDFile=/run/php-fpm.pid ExecStart=/usr/local/php/sbin/php-fpm(你的php-fpm路径) --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf(你的php-fpm配置文件路径) ExecReload=/bin/kill -USR2 $MAINPID ExecStop=/bin/kill -SIGINT $MAINPID [Install] WantedBy=multi-user.target ``` 修改为: ```bash [Unit] Description=The PHP FastCGI Process Manager After=syslog.target network.target [Service] Type=simple PIDFile=/run/php-fpm.pid ExecStart=/etc/systemd/system --nodaemonize --fpm-config /etc/php-fpm.d/www.conf ExecReload=/bin/kill -USR2 $MAINPID ExecStop=/bin/kill -SIGINT $MAINPID [Install] WantedBy=multi-user.target ``` ![](https://file.jishuzhan.net/article/1697095237186359297/dad2add380a544bda14c0de3e38027db.png) ## 10.剧本修改mysql脚本文件失败 (1)报错 ![](https://file.jishuzhan.net/article/1697095237186359297/9493f30d141f45b6a32a051b224b4ce4.png) (2)原因分析 缺少passwd.sh文件 (3)解决方法 新建文件 ![](https://file.jishuzhan.net/article/1697095237186359297/6952f90099bf46758f62ad3f56dd60ed.png) 成功 ![](https://file.jishuzhan.net/article/1697095237186359297/dd23a3bcf9b3473a8bf3940f166ab9d4.png)

相关推荐
wei_work@29 分钟前
【linux】简单的shell脚本练习
linux·运维·服务器
我才是鳴海步1 小时前
基于docker技术的单主机环境模拟测试批量客户端
运维·docker·容器
conkl2 小时前
Apache网页优化实战指南 - 让网站加载速度提升
linux·运维·服务器·开发语言·阿里云·apache
thinkMoreAndDoMore2 小时前
linux驱动开发(9)- 信号量
linux·运维·驱动开发
海天胜景3 小时前
nginx 配置返回 文件大小
运维·nginx
五阿哥爱跳舞3 小时前
【环境配置】解决linux每次打开终端都需要source .bashrc文件的问题
linux·运维·服务器
时央1234563 小时前
C#使用Tuple方法实现OpreateResultModel功能
运维·开发语言·c#
爱学习的白杨树3 小时前
Spring Cloud Gateway 介绍
java·运维·开发语言
网易独家音乐人Mike Zhou4 小时前
【Linux应用】Linux系统日志上报服务,以及thttpd的配置、发送函数
linux·运维·服务器·mcu·物联网·嵌入式·iot
bingbingyihao5 小时前
服务自动添加实例工具
linux·运维·bash