- 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_host | ansible连接节点时的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