赞
踩
目录
6.rpm -Uvh https://xxxx.rpm 提示连接失败问题
(1)架构
- 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)参数
(1)重构思路
用roles和不用roles的逻辑其实是一样的,要根据服务器的功能,先收集服务器所需要的文件,再进行安装,传输文件,启动服务或重启服务等操作。只是我们这次不必担心命名问题,因为不同的服务或不同功能的服务器所需要的配置文件会被放到不同的目录,不会冲突。
roles这个角色,可以根据同类服务器的功能定义,也可以通过服务去定义,因为我们是一键部署所有服务和项目,也不存在指定部署服务的需求,如果通过服务来定义,也容易出现需要很多when判断的情况,如果用同类功能的服务器定义角色,可能会出现同一条命令需要反复编写的情况,自行选择,我采取根据同类功能服务器去定义我们的roles角色。
(2)目录结构
(3)目录说明
playbook是是由一系列的play组成, 每个play由一个或者多个task组成, 一个task一般是一个ansible module, 三者的关系示意图如下:
(1)规划
通过ansible的roles角色去配置lnmp环境,nginx、php、mysql都使用源码编译安装
(2)架构
(3)部署Nginx角色
创建nginx角色所需要的工作目录:
- 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网页目录:
- vim /etc/ansible/playbook/roles/nginx/files/index.php
-
- <?php
- phpinfo();
- ?>
制作/etc/ansible/playbook/roles/nginx/files/nginx.repo源:
- 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的配置模板文件:
- 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文件:
- 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文件:
- - 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模板文:
- 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文件:
- 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角色所需要的工作目录:
- 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的网页文件:
- vim /etc/ansible/playbook/roles/php/files/index.php
-
- <?php
- phpinfo();
- ?>
制作/etc/ansible/playbook/roles/php/handlers/main.yml文件:
- 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文件:
- /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文件:
- 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角色所需要的工作目录:
- 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文件:
- 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文件:
- 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文件:
- vim /etc/ansible/playbook/roles/mysql/vars/main.yml
-
- service: mysqld.service
(5)启动安装分布式LNMP
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)环境
表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)报错
(2)原因分析
左端代码未对齐
(3)解决方法
修改前
修改后
(1) 报错
(2)原因分析
左端代码未对齐
(3)解决方法
修改前
修改后
(1)报错
(2)原因分析
nginx端查询
default.conf.j2 配置错误
未知的地址池
(3)解决方法
nginx端先移除多余配置文件
ansible端修改配置文件:
修改前:
修改后:
(1) 报错
(2)原因分析
[弃用警告]:只在通过squash_actions使用循环时调用“yum”一次是不赞成的。而不是如果使用循环提供多个项目并指定' name: "{{ item }}" ',请使用' name: '{{ ... }}' '并删除循环。这个特性将在2.11版本中删除。弃用的警告可以通过在ansible.cfg中设置deprecation_warnings=False来禁用。
(3)解决方法
这里先暂不修改yml文件
修改php端网卡:
关闭防火墙和安全机制
如还是报错,修改/etc/ansible/playbook/roles/php/tasks/main.yml文件,安装方式不采用with_items方式,直接以command模块方式运行
修改前:
修改后:
成功
(1)报错
遇见failure: repodata/repomd.xml from base: [Errno 256]错误
(2)原因分析
yum源
(3)解决方法
更新依赖包,重新安装发现没用
- yum clean all
- yum install -y epel-release
更新ca-certficates包
- yum clean all
- yum --disablerepo=epel -y update ca-certificates
将https转为http
- 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
- nameserver 8.8.8.8
- search localdomain
以上步骤执行完成后如果仍然失败,继续执行以下步骤:
查看yum的依赖包
- [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
删除依赖包
[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
将系统默认的yum功能删除
[root@localhost yum.repos.d]# rpm -aq|grep yum|xargs rpm -e --nodeps
查看本版和系统的位数
- [root@localhost yum.repos.d]# cat /etc/centos-release
- CentOS Linux release 7.9.2009 (Core)
- [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
下载yum包
- # 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
注意:要注意版本
在http://mirrors.kernel.org/centos/ 或者 http://mirrors.163.com/centos/里下载
下载完成执行以下命令
- # 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
进入 /etc/yum.repos.d/目录中,在http://mirrors.163.com/.help/centos.html,在里面下载对应版本的repo文件,我下载了CentOS-Base.repo
对此文件进行备份,以防修改错误还有的用
修改$releasever为自己的版本号(我的为7)
保存退出
(1)报错
(2)原因分析
域名解析失败
(3)解决方法
查询IP地址
通过What Is My IP Address? Free IP Lookup查询对应url ip地址:
修改hosts 文件,追加一下内容
- vim /etc/hosts
-
- 45.55.104.9(ip) webtatic.com(可自定义)
重新执行命令,访问对应地址成功
(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"
(2)原因分析
未忽视依赖关系
(3)解决方法
在后面加上--force --nodeps就可以了,nodeps的意思是忽视依赖关系。
- 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版本,要依据你们自己下载的版本改一下
修改前:
修改后:
成功
(1)报错
www.conf文件不存在
(2)原因分析
缺失文件
(3)解决方法
新建目录并上传文件
成功
(1)报错
ansible端
php端:
Failed to start php-fpm.service: Unit not found
(2)原因分析
系统中没有配置 php-fpm.service 文件
(3)解决方法
通过find / -name nginx.service 找到nginx.service 配置文件路径
- [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
创建软链接
[root@localhost php-fpm.d]# sudo ln -s /lib/systemd/system/php-fpm.service /etc/systemd/system/php-fpm.service
然后去到那个路径 新建一个php-fpm.service文件 保存下面这一段内容,php-fpm路径根据自己的实际情况修改
- [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
修改为:
- [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
(1)报错
(2)原因分析
缺少passwd.sh文件
(3)解决方法
新建文件
成功
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。