jinjia模板是在ansible中建立的一类模板文件,通常以 “ .j2 ” 结尾标识。模板的内容含有多个变量,使原本固定的某个文件配置,通过参数的改变,变得可以复用,提高了使用效率。
一、创建模板,定义变量
[root@master ~]# scp root@20.0.0.12:/etc/httpd/conf/httpd.conf ./ #从节点1上复制模板到当前目录下
httpd.conf 100% 11KB 3.7MB/s 00:00
[root@master ~]# vim httpd.conf #编写模板,定义变量
1、搜索Listen,修改
2、搜索ServerName,修改
3、添加MaxClients
[root@master ~]# mv httpd.conf httpd.conf.j2 #把模板转化为.j2格式
[root@master ~]# vim /etc/ansible/hosts
找到对应的主机后,给变量赋值
[root@master ~]# vim apache.yaml #写剧本
- hosts: webserver
remote_user: root
vars:
- bao: httpd
- fuwu: httpd
tasks:
- name: check latest
yum: name={
{
bao}} state=latest
- name: configure apache
template: src=/root/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf #把本地的模板定义给节点上
notify:
- restart httpd
- name: start httpd
service: name={
{
fuwu}} enabled=true state=started
handlers:
- name: restart httpd
service: name={
{
fuwu}} state=restarted
[root@master ~]# ansible-playbook apache.yaml --syntax-check #检查语法
[root@master ~]# ansible-playbook apache.yaml #执行剧本
此时,去节点对应目录下,查看对应参数,是否生效
[root@node1 ~]# vi /etc/httpd/conf/httpd.conf
在一个playbook中,我们一般会定义很多个task,如果我们只想执行其中的某一个或者多个task时就可以使用tags标签功能了(如果多个标签中,出现任务名一样,则同时执行)
[root@master ~]# vim file.yaml #写一个剧本
- hosts: webserver
remote_user: root
tasks:
- name: copy hosts file
copy: src=/etc/hosts dest=/opt/host1 #任务1:复制出1个host1的文件
tags:
- aaa #定义标签:aaa
- name: touch file #任务2:创建1个host2的空文件
file: path=/opt/host2 state=touch
[root@master ~]# ansible-playbook file.yaml --tags="aaa" #执行该脚本上的有“aaa”标签的任务1
去对应节点服务器验证
[root@node1 ~]# cd /opt
[root@node1 opt]# ls #有host1,没有host2文件
111.txt host1 num.txt rh
特殊情况:当tags标签名定义为:always时,不管执行哪个标签,该标签都默认执行
[root@node1 opt]# rm -rf host1 #先把host1删除(防止影响以下验证效果)
[root@node1 opt]# ls
111.txt num.txt rh
[root@master ~]# vim file.yaml #修改该剧本
- hosts: webserver
remote_user: root
tasks:
- name: copy hosts file
copy: src=/etc/hosts dest=/opt/host1
tags:
- aaa
- name: touch file
file: path=/opt/host2 state=touch
tags: #定义标签:always
- always
[root@master ~]# ansible-playbook file.yaml --tags="aaa" #还是执行该脚本上的有“aaa”标签的任务1
去对应节点服务器验证
[root@node1 ~]# cd /opt
[root@node1 opt]# ls
[root@node1 opt]# ls #不仅有hosts1,还有host2
111.txt host1 host2 num.txt rh
1、Ansible roles是为了层次化、结构化地组织Playbook。
2、roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。
3、roles一般用于基于主机构建服务的场景中,在企业复杂业务场景中应用的频率很高。
4、以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;相当于函数的调用把各个功能切割成片段来执行。
files:存放copy或script等模块调用的函数
tasks:定义各种task,要有main.yml,其他文件include包含调用
handlers:定义各种handlers,要有main.yml,其他文件include包含调用
vars:定义variables,要有main.yml,其他文件include包含调用
templates:存储由template模块调用的模板文本
meta:定义当前角色的特殊设定及其依赖关系,要有main.yml的文件
defaults:要有main.yml的文件,用于设定默认变量
一、实验需求:给webserver节点配置lamp架构
二、实验思路:
1、先把lamp架构拆分成三部分:apache、mysql、php
2、通过roles模块,创建这三部分的功能模块以及main.yml文件
3、通过配置这三部分所需模块的main.yml文件,来完善模块实现的功能
4、配置脚本,通过roles模块来调用这三部分,完成架构的部署
三、实验部署:
1、创建这三部分的roles的功能模块
[root@master ~]# cd /etc/ansible/roles/
[root@master roles]# mkdir /etc/ansible/roles/httpd/{
files,templates,tasks,handlers,vars,defaults,meta} -p
[root@master roles]# mkdir /etc/ansible/roles/mysql/{
files,templates,tasks,handlers,vars,defaults,meta} -p
[root@master roles]# mkdir /etc/ansible/roles/php/{
files,templates,tasks,handlers,vars,defaults,meta} -p
[root@master roles]# ls
httpd mysql php
[root@master httpd]# ls
defaults files handlers meta tasks templates vars
2、创建各模块的main.yml文件(文件内容为空)
[root@master httpd]# touch /etc/ansible/roles/httpd/{
defaults,vars,tasks,meta,handlers}/main.yml
[root@master httpd]# touch /etc/ansible/roles/mysql/{
defaults,vars,tasks,meta,handlers}/main.yml
[root@master httpd]# touch /etc/ansible/roles/php/{
defaults,vars,tasks,meta,handlers}/main.yml
3、配置这三部分所需模块的main.yml文件
(1)apache部分(httpd)
[root@master defaults]# cd /etc/ansible/roles/httpd/tasks/
[root@master tasks]# vim main.yml
- name: install apache
yum: pkg={
{
servername}} state=latest #引用变量
[root@master tasks]# cd /etc/ansible/roles/httpd/vars/
[root@master vars]# ls
[root@master vars]# vim main.yml
servername: httpd #定义变量
(2)mysql模块
[root@master vars]# cd /etc/ansible//roles/mysql/tasks/
[root@master tasks]# ls
[root@master tasks]# vim main.yml
- name: install mysqld
yum: pkg={
{
servername}} state=latest
[root@master tasks]# vim ../vars/main.yml
servername: mariadb* #mariadb为数据库的一种(比mysql要简便)
(3)php模块
[root@master tasks]# cd ../../php/tasks/
[root@master tasks]# ls
[root@master tasks]# vi main.yml
- name: install php
yum: pkg={
{
servername}} state=latest
[root@master tasks]# cd ../vars/
[root@master vars]# vim main.yml
servername: php
4、编写脚本,通过roles模块调用这三部分
[root@master vars]# cd /etc/ansible/
[root@master ansible]# vim lamp.yml
- hosts: mysql node1
remote_user: root
roles:
- httpd
- mysql
- php
[root@master ansible]# ansible-playbook lamp.yml
PLAY [webserver] ***************************************************************
TASK [Gathering Facts] *********************************************************
Enter passphrase for key '/root/.ssh/id_rsa':
ok: [20.0.0.12]
TASK [httpd : install apache] **************************************************
ok: [20.0.0.12]
TASK [install mysqld] **********************************************************
ok: [20.0.0.12]
TASK [install php] *************************************************************
changed: [20.0.0.12]
PLAY RECAP *********************************************************************
20.0.0.12 : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0