ansible-playbook剧本进阶篇——templates、tags、roles模块详解

ansible-playbook剧本进阶篇

  • 1、templates模块(模板)
    • jinjia2模板
    • 举个栗子
  • 2、tags模块
    • 举个栗子
  • 3、roles模块(角色管理)
    • 概念
    • roles目录结构
    • 举个栗子

1、templates模块(模板)

jinjia2模板

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格式

ansible-playbook剧本进阶篇——templates、tags、roles模块详解_第1张图片
ansible-playbook剧本进阶篇——templates、tags、roles模块详解_第2张图片
二、给变量赋值

[root@master ~]# vim /etc/ansible/hosts
找到对应的主机后,给变量赋值

ansible-playbook剧本进阶篇——templates、tags、roles模块详解_第3张图片
三、写playbook剧本

[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 

在这里插入图片描述
ansible-playbook剧本进阶篇——templates、tags、roles模块详解_第4张图片

2、tags模块

在一个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

3、roles模块(角色管理)

概念

1、Ansible roles是为了层次化、结构化地组织Playbook。
2、roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。
3、roles一般用于基于主机构建服务的场景中,在企业复杂业务场景中应用的频率很高。
4、以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;相当于函数的调用把各个功能切割成片段来执行。

roles目录结构

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   

你可能感兴趣的:(ansible,playbook,templates,roles,tags)