Ansible Inventory主机清单和playbook 剧本

  • Ansible Inventory主机清单+playbook 剧本
    • 一、inventory主机清单管理
      • 1、主机与组
      • 2、变量
        • 2.1 主机变量
        • 2.2 组变量
        • 2.3 组嵌套
        • 2.4 别名
      • 3、inventory 中的变量
    • 二、Ansible 的脚本 --- playbook 剧本
      • 1、playbook的组成
      • 2、如何定义playbook ?
        • 2.1 基本格式
        • 2.2 语句的横向/纵向写法
      • 3、Playbook实例
        • 3.1 编写yum安装nginx的playbook
        • 3.2 本地yum源安装apache
        • 3.3 源码编译安装nginx
      • 4、运行playbook
        • 4.1 补充参数
      • 5、变量的定义和引用
        • 5.1 在yaml文件中定义和引用
        • 5.2 在命令行定义
      • 6、指定远程主机sudo切换用户
      • 7、条件判断
      • 8、迭代(循环结构)
    • 三、Playbook的模块
      • 1、Templates 模块
        • 1.1 实例
      • 2、tags 模块
      • 3、Roles 模块
        • 3.1 roles 的目录结构
        • 3.2 roles 内各目录含义解释
        • 3.3 在一个 playbook 中使用 roles 的步骤
        • 3.4 示例
          • 3.4.1 创建各角色的目录和`main.yaml`文件
          • 3.4.2 编写nginx模块
          • 3.4.3 编写mysql模块
          • 3.4.4 编写php模块
          • 3.4.5 编写playbook并运行

Ansible Inventory主机清单+playbook 剧本

Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内。

一、inventory主机清单管理

主机清单配置文件 /etc/ansible/hosts

Ansible Inventory 文件是一个纯文本文件,用于定义 Ansible 执行命令的目标主机和组,以及这些主机和组的变量和属性。

1、主机与组

  • 主机:一个主机就是目标机器,可以是 IP 地址、域名或在 SSH 配置中定义的别名,也可以使用 ansible_host 指定。
  • 组:可以将多个主机划分到同一个组中,并可以对组进行操作。
[WebServer]
192.168.210.101
192.168.210.102
192.168.210.103[DatabaseServer]
192.168.210.104
192.168.210.105

注意:组名不能包含空格,并且主机和组名必须放在方括号中。

2、变量

2.1 主机变量

为单个主机指定变量,使用主机名或 IP 地址作为标识符,变量可以设置为一个或多个值。

[ServerA]
192.168.210.101 http_port=80 https_port=443[ServerB]
serverb.example.com ansible_user=admin ansible_password=1234
2.2 组变量

在组名之后,使用 vars 关键字设置变量,可以在组间共享变量。

#所有主机指定 `ansible_ssh_user` 变量,这意味着每个主机都具有该变量。
#为每个主机定义唯一的 `name` 变量。
[WebServer]
192.168.210.101 name=webserver1
192.168.210.102 name=webserver2
192.168.210.103 name=webserver3[DatabaseServer]
192.168.210.104 name=dbserver1
192.168.210.105 name=dbserver2[all:vars]
ansible_ssh_user=centos
2.3 组嵌套

将一个组嵌套到另一个组中,在 Inventory 文件中使用 :children 关键字。

#将 `WebServer` 和 `DatabaseServer` 组嵌套到 `Production` 组中。
[WebServer]
192.168.210.101
192.168.210.102
192.168.210.103[DatabaseServer]
192.168.210.104[Production:children]
WebServer
DatabaseServer
2.4 别名

使用 Alias(别名)来引用 Inventory 中的主机。

#为 `WebServer` 和 `DatabaseServer` 组定义别名,并将它们作为两个分离的组 `Web` 和 `Db` 的成员
#创建了一个名为 `Production` 的组,该组由这两个组的别名组成。
[WebServer]
192.168.210.101
192.168.210.102
192.168.210.103[DatabaseServer]
192.168.210.104[Web:children]
WebServer[Db:children]
DatabaseServer[Production]
@Web
@Db

3、inventory 中的变量

hosts 文件中为主机或组定义变量,在 playbook 中可以直接调用变量。

Inventory变量名含义
ansible_hostansible连接节点时的IP地址
ansible_port连接对方的端口号,ssh连接时默认为22
ansible_user连接对方主机时使用的用户名。不指定时,将使用执行ansible或ansible-playbook命令的用户
ansible_password连接时的用户的ssh密码,仅在未使用密钥对验证的情况下有效
ansible_ssh_private_key_file指定密钥认证ssh连接时的私钥文件
ansible_ssh_common_args提供给ssh、sftp、scp命令的额外参数
ansible_become允许进行权限提升
ansible_become_method指定提升权限的方式,例如可使用sudo/su/runas等方式
ansible_become_user提升为哪个用户的权限,默认提升为root
ansible_become_password提升为指定用户权限时的密码

二、Ansible 的脚本 — playbook 剧本

1、playbook的组成

(1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行
(2)Variables:变量
(3)Templates:模板
(4)Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作
(5)Roles:角色

2、如何定义playbook ?

2.1 基本格式
vim XXX.yaml  XXX.yml
---
- name:                 #设置play的名称hosts:                #指定执行此play的远程主机组remote_user:          #指定执行此play的用户#become:              #设置是否sudo切换#become_user:         #指定sudo切换的用户gather_facts:         #设置是否收集facts信息 yes|no|true|falsevars:                 #设置自定义变量tasks:                #指定此play的任务列表- name:                  #定义任务的名称模块名: 模块参数       #定义任务要使用的模块和参数(键值对格式)- name:  模块名: 模块参数ignore_errors: true    #忽略此任务的失败- name:  模块名: 模块参数notify: '任务名'       #定义此任务执行结果为changed状态时要触发的handlers任务- name:  模块名: 模块参数when:                  #定义条件表达式(== != > >= < <=),条件成立时执行此task任务,否则不执行此任务- name:  模块名: 模块参数={{item}}with_items:            #定义循环列表- name:  模块名: 模块参数tags:                  #定义任务的标签,ansible-playbook --tags="标签" 可实现仅执行拥有指定标签的任务(拥有always标签的任务总是执行)- 标签1- 标签2....handlers:- name: 任务名模块名: 模块参数

Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler。

这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。

2.2 语句的横向/纵向写法

横向写法一般是数组类型

纵向写法一般是列表类型

task任务的模块语法格式
横向格式:
模块名: 参数1=值 参数2={{变量名}} ...纵向格式:
模块名:参数1: 值参数2: "{{变量名}}"...with_items 和 vars 的语法格式
横向格式:
with_items: ["值1", "值2", "值3", ...]值为对象(键值对字段)时:
with_items:
- {key1: "值1", key2: "值2"}
- {key1: "值3", key2: "值4"}
...纵向格式:
with_items:
- 值1
- 值2
- 值3
...值为对象(键值对字段)时:
with_items:
- key1: "值1"key2: "值2"
- key1: "值3"key2: "值4"
...

3、Playbook实例

3.1 编写yum安装nginx的playbook
1.先更新主机清单

在这里插入图片描述

2.编写剧本
cd /etc/ansible
mkdir playbook
cd playbook/
#编写yaml文件,安装nginx的剧本
vim test.yaml---- name: first play for install nginx  #设置play的名称gather_facts: false                 #设置不收集facts信息hosts: dbservers                    #指定执行此play的远程主机组remote_user: root                   #指定此play的任务列表tasks:- name: disabled firewalldservice: name=firewalld state=stopped enabled=no- name: disable selinuxcommand: '/usr/sbin/setenforce 0 'ignore_errors: yes- name: local.repocopy: src=/etc/yum.repos.d/nginx.repo dest=/etc/yum.repos.d/nginx.repo- name: install nginx by yumyum: name=nginx state=latest- name: start nginx serviceservice: name=nginx state=started enabled=yes
3.运行剧本
ansible-playbook test.yaml

在这里插入图片描述

4.查看db服务器组的主机
systemctl status firewalld
getenforcesystemctl status nginx

在这里插入图片描述

3.2 本地yum源安装apache
1.在ansible主yum安装一个httpd,然后修改端口和主机名cp /etc/httpd/conf/httpd.conf /opt/

在这里插入图片描述
在这里插入图片描述

2.编写剧本
---- name: second play for install httpdgather_facts: falsehosts: dbserversremote_user: root tasks:
#关闭防火墙- name: disabled firewalldservice: name=firewalld state=stopped enabled=no
#关闭 selinux- name: disable selinuxcommand: '/sbin/setenforce 0 'ignore_errors: yes- name: disabled selinux foreverreplace: path=/etc/selinux/config regexp=enforcing  replace=disabled after=loaded#关闭和删除nginx- name: disabled nginx service: name=nginx state=stopped enabled=no- name: remove nginx yum: name=nginx state=absent #准备本地yum仓库,安装httpd- name: archive yum reposarchive: path=/etc/yum.repos.d/*.repo dest=/etc/yum.repos.d/repo_bak.tar.gz format=gz remove=yes- name: copy local yum repo filecopy: src=/etc/yum.repos.d/repo.bak/local.repo dect=/etc/yum.repos.d/local.repo- name: mount cdrommount: src=/dev/sr0 path=/mnt fstype=iso9660 state=mounted- name: install httpd by local yumyum: name=httpd state=latest#使用本地准备的配置文件启动httpd服务- name: copy httpd config filecopy: src=/opt/httpd.conf dest=/etc/httpd/conf/http.confnotify: "reload httpd"- name: start httpdservice: name=httpd state=started enabled=yes
#设置notify触发的任务       handlers:- name: reload httpdservice: name=httpd state=reloaded
3.查看db服务器组的主机
#运行剧本
ansible-playbook test2.yaml

在这里插入图片描述

systemctl status httpd
systemctl is-enabled httpd
netstat -lntp | grep httpd

在这里插入图片描述

3.3 源码编译安装nginx
---- name: third play for install httpdgather_facts: falsehosts: dbserversremote_user: root tasks:
#关闭防火墙- name: disabled firewalldservice: name=firewalld state=stopped enabled=no
#关闭 selinux- name: disable selinuxcommand: '/sbin/setenforce 0 'ignore_errors: yes- name: disabled selinux foreverreplace: path=/etc/selinux/config regexp=enforcing  replace=disabled after=loaded#安装依赖包- name: mount cdrommount: src=/dev/sr0 path=/mnt fstype=iso9660 state=mounted- name: install pkgsyum: name=pcre-devel,zlib-devel,openssl-devel,gcc,gcc-c++,make  state=latest#创建运行用户- name: create nginx useruser: name=nginx create_home=no shell=/sbin/nologin#解压软件包并安装- name: unarchive nginx packageunarchive: copy=yes src=/etc/ansible/playbook/nginx-1.24.0.tar.gz dest=/opt/- name: install nginx with sourceshell: chdir=/opt/nginx-1.24.0/ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install#创建软链接并启动服务- name: create link file for nginxfile: state=link src=/usr/local/nginx/sbin/nginx path=/usr/local/sbin/nginx- name: create nginx sevice file                            copy: src=nginx.service dest=/lib/systemd/system/nginx.service- name: start nginxservice: name=nginx state=started enabled=yes
#运行剧本
ansible-playbook test3.yaml

在这里插入图片描述

systemctl status nginx
netstat -lntp | grep nginx

在这里插入图片描述

4、运行playbook

#执行playbook
ansible-playbook xx.yaml/yml [参数]
4.1 补充参数
常用参数描述
–syntax-check检查yaml文件的语法是否正确
–list-task检查tasks任务
–list-hosts检查生效的主机
–start-at-task=‘install httpd’指定从某个task开始运行一般用于剧本较长且不想从头重复执行的场景
-k(–ask-pass)用来交互输入ssh密码
-K(-ask-become-pass)用来交互输入sudo密码
-u指定用户
#检查yaml文件的语法是否正确
ansible-playbook test3.yaml --syntax-check

在这里插入图片描述

#检查tasks任务
ansible-playbook test3.yaml --list-task   

在这里插入图片描述

#检查生效的主机
ansible-playbook test3.yaml --list-hosts      

在这里插入图片描述

#指定从 nginx install 开始运行
ansible-playbook test3.yaml --start-at-task='start nginx'

在这里插入图片描述

5、变量的定义和引用

  vars:   #自定义变量,只能在当前play有效- 变量1: 值1  #格式为key: value- 变量2: 值2tasks:  #在任务列表中引用变量-name:module: {{变量1}}
5.1 在yaml文件中定义和引用
---- name: first play for install nginxgather_facts: truehosts: dbserversremote_user: rootvars:- svcname: firewalldtasks:- name: disabled firewalldservice: name={{svcname}} state=stopped enabled=no- name: copy ipv4 infocopy: content={{ansible_default_ipv4.address}} dest=/opt/ipv4_address.txt#使用 {{ansible_default_ipv4.address}} 获取主机的 IPv4 地址
ansible-playbook test4.yaml

在这里插入图片描述

#在dbservers主机上查看
cat /opt/ipv4_address.txt

在这里插入图片描述

5.2 在命令行定义
ansible-playbook test4.yaml -e "svcname=crond"    #在命令行里定义变量

在这里插入图片描述
在这里插入图片描述

6、指定远程主机sudo切换用户

使用-k-K 参数实现。

在dbservers主机上创建一个新用户
useradd wyx
echo 123456 | passwd --stdin wyx
#把用户添加到sudoers 文件中
vim /etc/sudoerswyx ALL=/sbin/*, /bin/*, !/sbin/reboot, !/sbin/poweroff, !/sbin/init

(1)先编写剧本

---
- name: first play for install nginxgather_facts: truehosts: dbserversremote_user: wyx            become: yes	                 #2.6版本以后的参数,之前是sudo,意思为切换用户运行become_user: root              #指定sudo用户为rootvars:- svcname: firewalldtasks:- name: disabled firewalldservice: name={{svcname}} state=stopped enabled=no

(2)执行剧本

ansible-playbook test4.yml -k -K 

在这里插入图片描述

7、条件判断

在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。

(1)编写剧本,使用条件判断语句

#如果条件判断成功,则对应主机关机
vim test3.yaml---- name: first play for install nginxgather_facts: truehosts: allremote_user: rootvars:- svcname: firewalldtasks:- name: disabled firewalldservice: name={{svcname}} state=stopped enabled=nowhen: ansible_default_ipv4.address == "192.168.210.103"      #when指令中的变量名不需要手动加上 {{}}
或 when: inventory_hostname == "<主机名>"

(2)执行剧本

#执行剧本
ansible-playbook test4.yaml

在这里插入图片描述

8、迭代(循环结构)

Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环。

---- name: first play for install nginxgather_facts: truehosts: dbservers remote_user: rootvars:- svcname: firewalldtasks:- name: disabled firewalldwith_items: - firewalld- nfs- crondservice: name: "{{item}}" state: stopped enabled: no
#执行剧本
ansible-playbook test4.yaml

在这里插入图片描述

---- name: fifth play for gather_facts: falsehosts: dbservers remote_user: rootvars:myusers: - myname: wyxmygroup: 111- myname: wwwmygroup: 222- myname: yyymygroup: 333tasks:- name: create groupswith_items: "{{myusers}}"group: name: "{{item.mygroup}}"- name: create users and join into groupwith_items: "{{myusers}}"user: name: "{{item.myname}}" groups: "{{item.mygroup}}" state: present
#执行剧本
ansible-playbook test5.yaml

三、Playbook的模块

1、Templates 模块

Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。

1.1 实例

1.先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量

cp /usr/local/nginx/conf/nginx.conf /etc/ansible/playbook/nginx.conf.j2
vim /etc/ansible/playbook/nginx.conf.j2
listen {{ip_port}}				#36行,修改
ServerName {{server_name}}			#37行,修改
root "{{root_dir}}"          #44行,修改

在这里插入图片描述

2.修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量

vim /etc/ansible/hosts       
[webservers]
192.168.210.102 ip_port=192.168.210.102:6666 server_name=www.accp.com [dbservers]
192.168.210.103 ip_port=192.168.210.103:8888 server_name=www.benet.com

在这里插入图片描述

3.编写 playbook

---- name: third play for install httpdgather_facts: yeshosts: dbservers:webserversremote_user: root vars: - root_dir: /var/www/htmltasks:
#关闭防火墙- name: disabled firewalldservice: name=firewalld state=stopped enabled=no
#关闭 selinux- name: disable selinuxcommand: '/sbin/setenforce 0 'ignore_errors: yes- name: disabled selinux foreverreplace: path=/etc/selinux/config regexp=enforcing  replace=disabled after=loaded#安装依赖包- name: mount cdrommount: src=/dev/sr0 path=/mnt fstype=iso9660 state=mounted- name: install pkgswith_items: [pcre-devel,zlib-devel,openssl-devel,gcc,gcc-c++,make]yum: name={{item}} state=latest#创建运行用户- name: create nginx useruser: name=nginx create_home=no shell=/sbin/nologin#解压软件包并安装- name: unarchive nginx packageunarchive: copy=yes src=/etc/ansible/playbook/nginx-1.24.0.tar.gz dest=/opt/- name: install nginx with sourceshell: chdir=/opt/nginx-1.24.0/ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install#创建软链接并启动服务- name: create link file for nginxfile: state=link src=/usr/local/nginx/sbin/nginx path=/usr/local/sbin/nginx- name: create nginx sevice file                            copy: src=nginx.service dest=/lib/systemd/system/nginx.service- name: start nginxservice: name=nginx state=started enabled=yes#创建网页根目录- name: create root dirfile: path={{root_dir}} state=directory
#创建网页文件- name: create index.html for accp.comcopy: content="<h1>this is accp test web page</h1>" dest={{root_dir}}/index.htmlwhen: ansible_default_ipv4.address == "192.168.210.102"- name: create index.html for benet.comcopy: content="<h1>this is benet test web page</h1>" dest={{root_dir}}/index.htmlwhen: ansible_default_ipv4.address == "192.168.210.103"#生成配置文件- name: copy nginx config file with templatetemplate: src=/etc/ansible/playbook/nginx.conf.j2 dest=/usr/local/nginx/conf/nginx.confnotify: "reload nginx"handlers: - name: reload nginxservice: name=nginx state=reloaded 
ansible-playbook test6.yaml

在这里插入图片描述

#查看dbservers和webservers主机
vim /usr/local/nginx/conf/nginx.conf cat /var/www/html/index.htmlnetstat -lntp | grep nginx

在这里插入图片描述
在这里插入图片描述

2、tags 模块

可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用–tags选项能实现仅运行指定的tasks。
playbook还提供了一个特殊的tags为always。作用就是当使用always作为tags的task时,无论执行哪一个tags时,定义有always的tags都会执行.

3、Roles 模块

roles用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令引入即可。
简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷的include它们的一种机制。roles一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。主要使用场景代码复用度较高的情况下。

假如我们现在有3个被管理主机,第一个要配置成httpd,第二个要配置成haproxy服务器,第三个要配置成MySQL(mariadb)服务器。我们如何来定义playbook?
第一个play用到第一个主机上,用来构建httpd,第二个play用到第二个主机上,用来构建haproxy。这些个play定义在playbook中比较麻烦,将来也不利于模块化调用,不利于多次调用。比如说后来又加进来一个主机,这第3个主机既是httpd服务器,又是haproxy服务器,我们只能写第3个play,上面写上安装httpd和haproxy。这样playbook中的代码就重复了。
为了避免代码重复,可以定义一个角色叫httpd,第二个角色叫haproxy,并使用roles实现代码重复被调用。

3.1 roles 的目录结构
cd /etc/ansible/
tree roles/
roles/
├── web/    #相当于 playbook 中的 每一个 play 主题
│   ├── files/
│   ├── templates/
│   ├── tasks/
│   ├── handlers/
│   ├── vars/
│   ├── defaults/
│   └── meta/
└── db/├── files/├── templates/├── tasks/├── handlers/├── vars/├── defaults/└── meta/
3.2 roles 内各目录含义解释
目录含义
files用来存放由 copy 模块或 script 模块调用的文件。
templates用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。
tasks此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。
handlers此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。
vars此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。
defaults此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。
meta此目录应当包含一个 main.yml 文件,用于定义此角色的元数据信息及其依赖关系。
3.3 在一个 playbook 中使用 roles 的步骤

(1)创建以 roles 命名的目录

mkdir /etc/ansible/roles/ -p    #yum装完默认就有

(2)创建全局变量目录(可选)

mkdir /etc/ansible/group_vars/ -p
touch /etc/ansible/group_vars/all     #文件名自己定义,引用的时候注意

(3)在 roles 目录中分别创建以各角色名称命名的目录,如 httpd、mysql

mkdir /etc/ansible/roles/httpd
mkdir /etc/ansible/roles/mysql

(4)在每个角色命名的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建

mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}

(5)在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名

touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml

(6)修改 site.yml 文件,针对不同主机去调用不同的角色

vim /etc/ansible/site.yml
---
- hosts: webserversremote_user: rootroles:- httpd
- hosts: dbserversremote_user: rootroles:- mysql

(7)运行 ansible-playbook

cd /etc/ansible
ansible-playbook site.yml
3.4 示例
3.4.1 创建各角色的目录和main.yaml文件
mkdir /etc/ansible/roles/nginx/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -ptouch /etc/ansible/roles/nginx/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml
3.4.2 编写nginx模块

(1)编写main.yml文件

vim /etc/ansible/roles/nginx/vars/main.ymlnginx_addr: 192.168.210.102
nginx_port: 80
server_name: www.wyx.com
root_dir: /var/www/html
php_addr: 192.168.210.107
php_port: 9000
pkg: nginx
svc: nginx
vim /etc/ansible/roles/nginx/tasks/main.yml- name: disable firewalldservice: name=firewalld state=stopped enabled=no
- name: disable selinuxcommand: '/usr/sbin/setenforce 0'ignore_errors: true
- name: copy nginx repocopy: src=nginx.repo dest=/etc/yum.repos.d/
- name: install nginxyum: name={{pkg}} state=present
- name: create root dirfile: path={{root_dir}} state=directory
- name: prepare nginx config filetemplate: src=nginx.conf.j2 dest=/etc/nginx/nginx.confnotify: "reload nginx"
- name: start nginxservice: name={{svc}} state=started enabled=yes
vim /etc/ansible/roles/nginx/handlers/main.yml- name: reload nginxservice: name={{svc}} state=reloaded

(2)准备相关配置文件

cp /etc/yum.repos.d/nginx.repo /etc/ansible/roles/nginx/files/
cp /etc/ansible/playbook/nginx.conf.j2 /etc/ansible/roles/nginx/templates/
#修改jinjia2配置文件
vim /etc/ansible/roles/nginx/templates/nginx.conf.j2

在这里插入图片描述
在这里插入图片描述

(3)在/etc/ansible/hosts文件中添加组

vim /etc/ansible/hosts
[webservers]
192.168.210.102
[dbservers]
192.168.210.103
[phpservers]
192.168.210.107

在这里插入图片描述

#在webservers主机查看
netstat -lntp | grep nginx#查看nginx.conf文件是否修改

在这里插入图片描述

3.4.3 编写mysql模块

(1)在ansible主机操作

wget https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm
rpm -ivh mysql57-community-release-el7-11.noarch.rpmcp /etc/yum.repos.d/mysql-community.repo /etc/ansible/roles/mysql/files/

(2)编写main.yml文件

vim /etc/ansible/roles/mysql/vars/main.yml- pkg: mysql-server
- svc: mysqld
vim /etc/ansible/roles/mysql/tasks/main.yml- include: "init.yml"
- name: remove mariadbyum: name=mariadb* state=absent
- name: copy mysql repocopy: src=/etc/yum.repos.d/mysql-community.repo dest=/etc/yum.repos.d/
- name: modify mysql reporeplace: path=/etc/yum.repos.d/mysql-community.repo regexp="gpgcheck=1" replace="gpgcheck=0"
- name: install mysqlyum: name={{pkg}} state=present
- name: start mysqlservice: name={{svc}} state=started enabled=yes
- name: init mysqlshell: passd=$(grep "password" /var/log/mysqld.log | awk '{print $NF}') && mysql -uroot -p"$passd" --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'Admin@123';" && mysql -uroot -pAdmin@123 -e "grant all privileges on *.* to root@'%' identified by 'Admin@123' with grant option;"ignore_errors: true
vim /etc/ansible/roles/mysql/tasks/init.yml- name: disable firewalldservice: name=firewalld state=stopped enabled=no
- name: disable selinuxcommand: '/usr/sbin/setenforce 0'ignore_errors: true
3.4.4 编写php模块
vim /etc/ansible/roles/php/vars/main.yml- user_name: php
- php_addr: 192.168.210.107:9000
- nginx_addr: 192.168.210.102
- svc: php-fpm
cp /etc/ansible/roles/mysql/tasks/init.yml /etc/ansible/roles/php/tasks/
cd /var/www/html
vim index.php
<?php
phpinfo();
?/>vim /etc/exports
/var/www/html/ 192.168.210.0/24(ro)systemctl enable --now rpcbind nfs
showmount -e
vim /etc/ansible/roles/php/tasks/main.yml- include: "init.yml"
- name: install php reposhell: rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm && rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpmignore_errors: true
- name: install phpyum: name=php72w,php72w-cli,php72w-common,php72w-devel,php72w-embedded,php72w-gd,php72w-mbstring,php72w-pdo,php72w-xml,php72w-fpm,php72w-mysqlnd,php72w-opcache state=present
- name: create php useruser: name={{user_name}} shell=/sbin/nologin create_home=no
- name: modify php config filereplace: path=/etc/php.ini regexp=";date.timezone =" replace="date.timezone = Asia/Shanghai"notify: "reload php-fpm"
- name: modify user and group in www.confreplace: path=/etc/php-fpm.d/www.conf regexp="apache" replace="{{user_name}}"notify: "reload php-fpm"
- name: modify listen addr in www.confreplace: path=/etc/php-fpm.d/www.conf regexp="127.0.0.1:9000" replace="{{php_addr}}"notify: "reload php-fpm"
- name: modify allowed_clients in www.confreplace: path=/etc/php-fpm.d/www.conf regexp="127.0.0.1" replace="{{nginx_addr}}"notify: "reload php-fpm"
- name: start php-fpmservice: name={{svc}} state=started enabled=yes
- name: create php root dirfile: path=/var/www/html state=directory
- name: mount nfsmount: src="192.168.210.102:/var/www/html" path=/var/www/html fstype=nfs state=mounted opts="defaults,_netdev"
vim /etc/ansible/roles/php/handlers/main.yml- name: reload php-fpmservice: name={{svc}} state=reloaded
3.4.5 编写playbook并运行
vim /etc/ansible/playbook/test7_roles.yaml
- name: install nginxhosts: webserversremote_user: rootroles:- nginx- name: install mysqlhosts: dbserversremote_user: rootroles:- mysql- name: install phphosts: phpserversremote_user: rootroles:- phpansible-playbook test7_roles.yaml
http://192.168.210.102/index.php

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

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

相关文章

云计算科学与工程实践指南--章节引言收集

云计算科学与工程实践指南–章节引言收集 //本文收集 【云计算科学与工程实践指南】 书中每一章节的引言。 我已厌倦了在一本书中阅读云的定义。难道你不失望吗&#xff1f;你正在阅读一个很好的故事&#xff0c;突然间作者必须停下来介绍云。谁在乎云是什么&#xff1f; 通…

使用 Mendix 中的 OIDC 模块集成 Azure AD SSO

前言 在当今快速发展的数字化世界中&#xff0c;企业追求高效率和灵活性已成为常态。Mendix&#xff0c;作为一个先进的低代码开发平台&#xff0c;正是企业快速响应市场需求、加速数字化转型过程的利器。通过其直观的可视化开发环境&#xff0c;即使是非技术背景的用户也能设…

技术小知识:云计算服务下的IaaS,PaaS,SaaS⑥

一、云计算 云计算起源仿照天空的云朵聚集&#xff0c;意为对大量服务器的远程管理。以便能对服务器做空间、资源的最大动态协调利用和降低操作执行命令的复杂度。 二、云计算衍生下的服务 在服务器以一种云的形式存在&#xff0c;衍生除了很多服务提供&#xff0c;以便用户可以…

crossover2023激活码分享crossover免费升级2024 crossover24更新内容

CrossOver是一款功能强大的系统兼容软件&#xff0c;它能够让Mac和Linux用户在不安装Windows操作系统的情况下直接运行Windows应用程序。以下是关于CrossOver的更多信息&#xff1a; 一、工作原理 CrossOver的工作原理是通过在Mac或Linux系统上模拟Windows应用程序所需的运行…

循序渐进丨MogDB 数据库新特性之SQL PATCH绑定执行计划

1 SQL PATCH 熟悉 Oracle 的DBA都知道&#xff0c;生产系统出现性能问题时&#xff0c;往往是SQL走错了执行计划&#xff0c;紧急情况下&#xff0c;无法及时修改应用代码&#xff0c;DBA可以采用多种方式针对于某类SQL进行执行计划绑定&#xff0c;比如SQL Profile、SPM、SQL …

Python基础三

一、模块&#xff08;model&#xff09; 1、定义 以.py 结尾的文件&#xff0c;包含了Python对象定义和Python语句 如下&#xff1a;包含了两个模块&#xff0c;分别为 main.py 和 model.py 2、特点 模块让你能够有逻辑地组织你的Python 代码段。把相关的代码分配到一个模块…

Linux: 预备

计算机结构基础 操作系统: 内核 (管理软硬件) shell(给用户使用操作系统的方式) 操作系统的目标 对硬件抽象 原因:操作系统是对软硬件资源管理的应用软件抽象:内存管理, 进程管理, 文件管理, 驱动管理软件:驱动程序(给软件提供访问硬件的软件)硬件:磁盘(对应文件), 网卡等隔离…

基于SpringBoot的医疗资源共享平台设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 SpringBoot框架 3 1.2 MyBatis框架 3 1.3 WebSocket技术 4 1.4 Selenium技术 5 1.5 EL-ADMIN技术 5 1.6 Ajax技术 5 1.7 本章小结 6 2 系统分析 7 2.1 功能需求分析 7 2.2 非功能需求 9 2.3 本章小结 10 3 系统设计 11 3.…

解锁安卓开发利器:深度探析ADB【安卓开发】

引言 在安卓开发与维护过程中&#xff0c;我们经常会遇到一些限制&#xff0c;比如无法直接访问某些系统功能&#xff0c;或者在某些定制系统中 受到限制 。为了解决这些问题&#xff0c;我们需要一种有效的工具来管理和调试安卓设备&#xff0c;而这时候ADB&#xff08;Andro…

poetry库:依赖管理和打包工具

这个工具是在群里看见别人说好用的&#xff0c;所以了解一下。 1.poetry初始 官网&#xff1a;https://python-poetry.org/ 项目仓库&#xff1a;https://github.com/python-poetry 或 https://github.com/python-poetry/poetry 教程&#xff1a;https://python-poetry.org/…

css学习心得

css 通过内嵌样式表来选择文本字体的大小和颜色 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><style>p{font-size:16px;color: blue;}</style></head><body><!-- px 像素…

如何在Linux系统安装SVN并配置固定公网地址远程访问【内网穿透】

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

牛客小白月赛88

E.多重映射 解题思路 对集合进行整体操作&#xff0c;集合大小只增不减&#xff0c;问最后集合标号维护集合&#xff0c;考虑并查集但直接用并差集维护会有以下问题&#xff1a;当前集合变标号&#xff0c;可能会和之前标号相同&#xff0c;则进行并查集操作时&#xff0c;会接…

ai语音克隆:用AI大模型开发点亮你的创作天地!

在当今快速发展的科技时代&#xff0c;人工智能技术已经深入到我们生活的方方面面。AI语音克隆作为其中的一种应用&#xff0c;正在逐渐走进人们的视野&#xff0c;为人们的创作提供了全新的可能性。 人类创作的过程往往是一个灵感迸发、思绪飞扬的过程。但有时候&#xff0c;…

数据结构——堆的应用 堆排序详解

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

网上近来都有哪些有关李小璐及其女儿甜馨的恶评?作为网民应怎样规避恶语中伤或网暴?

网上近来都有哪些有关李小璐及其女儿甜馨的恶评&#xff1f;作为网民应怎样规避恶语中伤或网暴&#xff1f; 近日&#xff0c;#李小璐发文鼓励女儿甜馨不要受恶评影响#登上热搜&#xff0c;网上都有哪些关于李小璐及其女儿的恶评&#xff1f;作为普通网民应怎样规避恶评或网暴&…

JVM——执行引擎

文章目录 1、概述2、计算机语言的发展史2.1、机器码2.2、汇编语言2.3、高级语言2.4、字节码 3、Java代码编译和执行过程4、解释器5、JIT编译器5.1、为什么HotSpot VM同时存在JIT编译器和解释器5.2、热点代码探测确定何时JIT5.3、设置执行模式5.4、C1编译器和C2编译器 6、AOT编译…

搜狐新闻Hybrid AI引擎端侧离线大语言模型探索

本文字数&#xff1a;3027字 预计阅读时间&#xff1a;20分钟 01 一、导读 • LLM 以及移动平台落地趋势 • 搜狐AI引擎内建集成离线可运行的GPT模型 • Keras 定制预训练模型 • TensorFlow Lite converter 迁移到移动设备 02 二、LLM 1.1什么是LLM L…

国产硅片膜厚检测仪

硅片膜厚检测仪是半导体行业中一种至关重要的设备&#xff0c;用于精确测量硅片上薄膜的厚度。在半导体制造工艺中&#xff0c;薄膜厚度的控制对于保证器件性能和可靠性具有决定性的作用。因此&#xff0c;硅片膜厚检测仪的研发和应用对于推动半导体技术的发展具有重要意义。 一…

问卷调查|在线问卷调查系统|基于Springboot的在线问卷调查系统设计与实现(源码+数据库+文档)

在线问卷调查系统目录 目录 基于Springboot的在线问卷调查系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、问卷管理 2、 问卷调查管理 3、题目管理 4、 用户管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐…