Ansible Inventory主机清单和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|false
  vars:                 #设置自定义变量
  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 firewalld
       service: name=firewalld state=stopped enabled=no
     - name: disable selinux
       command: '/usr/sbin/setenforce 0 '
       ignore_errors: yes
     - name: local.repo
       copy: src=/etc/yum.repos.d/nginx.repo dest=/etc/yum.repos.d/nginx.repo
     - name: install nginx by yum
       yum: name=nginx state=latest
     - name: start nginx service
       service: name=nginx state=started enabled=yes

3.运行剧本
ansible-playbook test.yaml

在这里插入图片描述

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

systemctl status nginx

在这里插入图片描述

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

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

2.编写剧本
---
 - name: second play for install httpd
   gather_facts: false
   hosts: dbservers
   remote_user: root 
   tasks:
#关闭防火墙
     - name: disabled firewalld
       service: name=firewalld state=stopped enabled=no
#关闭 selinux
     - name: disable selinux
       command: '/sbin/setenforce 0 '
       ignore_errors: yes
     - name: disabled selinux forever
       replace: 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 repos
       archive: path=/etc/yum.repos.d/*.repo dest=/etc/yum.repos.d/repo_bak.tar.gz format=gz remove=yes
     - name: copy local yum repo file
       copy: src=/etc/yum.repos.d/repo.bak/local.repo dect=/etc/yum.repos.d/local.repo
     - name: mount cdrom
       mount: src=/dev/sr0 path=/mnt fstype=iso9660 state=mounted
     - name: install httpd by local yum
       yum: name=httpd state=latest
       
#使用本地准备的配置文件启动httpd服务
     - name: copy httpd config file
       copy: src=/opt/httpd.conf dest=/etc/httpd/conf/http.conf
       notify: "reload httpd"
     - name: start httpd
       service: name=httpd state=started enabled=yes
#设置notify触发的任务       
   handlers:
     - name: reload httpd
       service: 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 httpd
   gather_facts: false
   hosts: dbservers
   remote_user: root 
   tasks:
#关闭防火墙
     - name: disabled firewalld
       service: name=firewalld state=stopped enabled=no
#关闭 selinux
     - name: disable selinux
       command: '/sbin/setenforce 0 '
       ignore_errors: yes
     - name: disabled selinux forever
       replace: path=/etc/selinux/config regexp=enforcing  replace=disabled after=loaded
       
#安装依赖包
     - name: mount cdrom
       mount: src=/dev/sr0 path=/mnt fstype=iso9660 state=mounted
     - name: install pkgs
       yum: name=pcre-devel,zlib-devel,openssl-devel,gcc,gcc-c++,make  state=latest
       
#创建运行用户
     - name: create nginx user
       user: name=nginx create_home=no shell=/sbin/nologin
      
#解压软件包并安装
     - name: unarchive nginx package
       unarchive: copy=yes src=/etc/ansible/playbook/nginx-1.24.0.tar.gz dest=/opt/
     - name: install nginx with source
       shell: 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 nginx
       file: 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 nginx
       service: 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: 值2
  tasks:  #在任务列表中引用变量
    -name:
     module: {{变量1}}
5.1 在yaml文件中定义和引用
---
 - name: first play for install nginx
   gather_facts: true
   hosts: dbservers
   remote_user: root
   vars:
   - svcname: firewalld
   tasks:
   - name: disabled firewalld
     service: name={{svcname}} state=stopped enabled=no
   - name: copy ipv4 info
     copy: 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/sudoers

wyx ALL=/sbin/*, /bin/*, !/sbin/reboot, !/sbin/poweroff, !/sbin/init

(1)先编写剧本

---
- name: first play for install nginx
  gather_facts: true
  hosts: dbservers
  remote_user: wyx            
  become: yes	                 #2.6版本以后的参数,之前是sudo,意思为切换用户运行
  become_user: root              #指定sudo用户为root
  vars:
   - svcname: firewalld
   tasks:
   - name: disabled firewalld
     service: 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 nginx
   gather_facts: true
   hosts: all
   remote_user: root
   vars:
   - svcname: firewalld
   tasks:
   - name: disabled firewalld
     service: name={{svcname}} state=stopped enabled=no
     when: 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 nginx
   gather_facts: true
   hosts: dbservers 
   remote_user: root
   vars:
   - svcname: firewalld
   tasks:
   - name: disabled firewalld
     with_items: 
     - firewalld
     - nfs
     - crond
     service: 
       name: "{{item}}" 
       state: stopped 
       enabled: no
#执行剧本
ansible-playbook test4.yaml

在这里插入图片描述

---
 - name: fifth play for 
   gather_facts: false
   hosts: dbservers 
   remote_user: root
   vars:
     myusers: 
     - myname: wyx
       mygroup: 111
     - myname: www
       mygroup: 222
     - myname: yyy
       mygroup: 333
   tasks:
   - name: create groups
     with_items: "{{myusers}}"
     group: 
       name: "{{item.mygroup}}"
     
   - name: create users and join into group
     with_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 httpd
   gather_facts: yes
   hosts: dbservers:webservers
   remote_user: root 
   vars: 
   - root_dir: /var/www/html
   tasks:
#关闭防火墙
     - name: disabled firewalld
       service: name=firewalld state=stopped enabled=no
#关闭 selinux
     - name: disable selinux
       command: '/sbin/setenforce 0 '
       ignore_errors: yes
     - name: disabled selinux forever
       replace: path=/etc/selinux/config regexp=enforcing  replace=disabled after=loaded
       
#安装依赖包
     - name: mount cdrom
       mount: src=/dev/sr0 path=/mnt fstype=iso9660 state=mounted
     - name: install pkgs
       with_items: [pcre-devel,zlib-devel,openssl-devel,gcc,gcc-c++,make]
       yum: name={{item}} state=latest
       
#创建运行用户
     - name: create nginx user
       user: name=nginx create_home=no shell=/sbin/nologin
      
#解压软件包并安装
     - name: unarchive nginx package
       unarchive: copy=yes src=/etc/ansible/playbook/nginx-1.24.0.tar.gz dest=/opt/
     - name: install nginx with source
       shell: 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 nginx
       file: 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 nginx
       service: name=nginx state=started enabled=yes
       
#创建网页根目录
     - name: create root dir
       file: path={{root_dir}} state=directory
#创建网页文件
     - name: create index.html for accp.com
       copy: content="<h1>this is accp test web page</h1>" dest={{root_dir}}/index.html
       when: ansible_default_ipv4.address == "192.168.210.102"
     - name: create index.html for benet.com
       copy: content="<h1>this is benet test web page</h1>" dest={{root_dir}}/index.html
       when: ansible_default_ipv4.address == "192.168.210.103"
       
#生成配置文件
     - name: copy nginx config file with template
       template: src=/etc/ansible/playbook/nginx.conf.j2 dest=/usr/local/nginx/conf/nginx.conf
       notify: "reload nginx"
     handlers: 
     - name: reload nginx
       service: name=nginx state=reloaded 
ansible-playbook test6.yaml

在这里插入图片描述

#查看dbservers和webservers主机
vim /usr/local/nginx/conf/nginx.conf 

cat /var/www/html/index.html

netstat -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: webservers
  remote_user: root
  roles:
     - httpd
- hosts: dbservers
  remote_user: root
  roles:
     - 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} -p

touch /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.yml

nginx_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 firewalld
  service: name=firewalld state=stopped enabled=no
- name: disable selinux
  command: '/usr/sbin/setenforce 0'
  ignore_errors: true
- name: copy nginx repo
  copy: src=nginx.repo dest=/etc/yum.repos.d/
- name: install nginx
  yum: name={{pkg}} state=present
- name: create root dir
  file: path={{root_dir}} state=directory
- name: prepare nginx config file
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  notify: "reload nginx"
- name: start nginx
  service: name={{svc}} state=started enabled=yes
vim /etc/ansible/roles/nginx/handlers/main.yml

- name: reload nginx
  service: 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.rpm

cp /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 mariadb
  yum: name=mariadb* state=absent
- name: copy mysql repo
  copy: src=/etc/yum.repos.d/mysql-community.repo dest=/etc/yum.repos.d/
- name: modify mysql repo
  replace: path=/etc/yum.repos.d/mysql-community.repo regexp="gpgcheck=1" replace="gpgcheck=0"
- name: install mysql
  yum: name={{pkg}} state=present
- name: start mysql
  service: name={{svc}} state=started enabled=yes
- name: init mysql
  shell: 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 firewalld
  service: name=firewalld state=stopped enabled=no
- name: disable selinux
  command: '/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 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
  yum: 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 user
  user: name={{user_name}} shell=/sbin/nologin create_home=no
- name: modify php config file
  replace: path=/etc/php.ini regexp=";date.timezone =" replace="date.timezone = Asia/Shanghai"
  notify: "reload php-fpm"
- name: modify user and group in www.conf
  replace: path=/etc/php-fpm.d/www.conf regexp="apache" replace="{{user_name}}"
  notify: "reload php-fpm"
- name: modify listen addr in www.conf
  replace: 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.conf
  replace: path=/etc/php-fpm.d/www.conf regexp="127.0.0.1" replace="{{nginx_addr}}"
  notify: "reload php-fpm"
- name: start php-fpm
  service: name={{svc}} state=started enabled=yes
- name: create php root dir
  file: path=/var/www/html state=directory
- name: mount nfs
  mount: 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-fpm
  service: name={{svc}} state=reloaded
3.4.5 编写playbook并运行
vim /etc/ansible/playbook/test7_roles.yaml
- name: install nginx
  hosts: webservers
  remote_user: root
  roles:
  - nginx
  
- name: install mysql
  hosts: dbservers
  remote_user: root
  roles:
  - mysql
  
- name: install php
  hosts: phpservers
  remote_user: root
  roles:
  - php
  
ansible-playbook test7_roles.yaml
http://192.168.210.102/index.php
  • 18
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值