Ansible-playbook-------Template,tags,roles模块

Template模块

Jinja模板架构,通过模板可以实现向模板文件传参(python转义)把占位符参数传到配置文件中去

生成一个目标文本文件,传递变量到需要配置文件当中。(web开发)

template其实可以理解为外部传参

我们可以用Template模块,远程安装部署httpd,nginx

通过Template模块远程部署HTTP和NGINX

首先在本地yum安装一个httpd
对本机httpd的配置文件进行复制后修改
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2

j2为Temlpate可识别的后缀
httpd.conf.j2 在文件中配置的是占位符(声明的变量)

接下来就是对httpd.conf.j2配置文件进行修改

line  42

Ansible-playbook-------Template,tags,roles模块_第1张图片

line 95

Ansible-playbook-------Template,tags,roles模块_第2张图片

line 119

然后配置/etc/ansible/hosts

/etc/ansible/hosts 配置了主机的占位符名称和j2文件中的占位符一致(定义参数:占位符的参数的参数声明好)playbook当中,template模块来吧模块参数传给的目标的配置文件

[webservers]

20.0.0.20 port=20.0.0.20:80 server_name=www.zzr.com:80 root_dir=/etc/httpd/htdocs

其中 port,server_name,root_dir都是httpd.conf.j2里面指定的内容

!!!注意,名称要一一对应!!!

[dbservers]
20.0.0.30 port=20.0.0.20:80 server_name=www.zzr.com:80 root_dir=/etc/httpd/htdocs

在目标主机上部署httpd

Ansible-playbook-------Template,tags,roles模块_第3张图片

最后一步,编写playbook

- hosts: all
  remote_user: root
  vars:
    - package: httpd
    - service: httpd
  tasks:
    - name: install httpd
      yum: name={{package}}
      

    - name: install configure file
      template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
使用template模板
      notify:
        - restart httpd

    - name: create root_dir
      file:
        path: /etc/httpd/htdocs
        state: directory

    - name: start httpd
      service: name={{service}} enabled=true state=started
  handlers:
    - name: restart httpd
      service: name={{service}} state=restarted

Ansible-playbook-------Template,tags,roles模块_第4张图片

Ansible-playbook-------Template,tags,roles模块_第5张图片

httpd.conf.j2 在文件中配置的是占位符(声明的变量)

/etc/ansible/hosts 配置了主机的占位符名称和j2文件中的占位符一致(定义参数:占位符的参数的参数声明好)

playbook当中,template模块来吧模块参数传给的目标的配置文件

该脚本运行之后,成功之后就可以去目标主机去查看

vim /etc/httpd/conf/httpd.conf

Ansible-playbook-------Template,tags,roles模块_第6张图片

到此,httpd就部署完成

我们也可以用相同的方法去部署nginx

首先在本机yum安装一个nginx
对本机的nginx进行修改
cp /etc/nginx/nginx.conf /opt/nginx.conf.j2

Ansible-playbook-------Template,tags,roles模块_第7张图片

然后对/etc/ansible/hosts修改

Ansible-playbook-------Template,tags,roles模块_第8张图片

配置yml文件
vim nginx.yml

- hosts: all
  remote_user: root
  vars:
    - package: nginx
    - service: nginx
  tasks:
    - name: install nginx
      yum: name={{package}}


    - name: install configure file
      template: src=/opt/nginx.conf.j2 dest=/etc/nginx/nginx.conf
      notify:
        - restart nginx

    - name: create root_dir
      file:
        path: /opt/nginx/html
        state: directory

    - name: start nginx
      service: name={{service}} enabled=true state=started
  handlers:
    - name: restart nginx
      service: name={{service}} state=restarted

wq

ansible-playbook nginx.yml

Ansible-playbook-------Template,tags,roles模块_第9张图片

Ansible-playbook-------Template,tags,roles模块_第10张图片

最后一步去目标主机查看

Ansible-playbook-------Template,tags,roles模块_第11张图片

到此,nginx部署完成

tags标签模块

标签模块,可以在playbook当中为任务设定标签(tags),我们在运行playbook时,可以通过指定任务标签,来实现只运行的标签任务。

和 --start-at 相似但又不完全相同

--start-at 和 --tags 的区别

--start-at:是指定位置之后全部运行
--tags:是运行指定部分

任务标签的种类:

  • always:不管你是否指定了运行标签,任务都会执行
  • never:即使运行了指定标签,该任务也不会执行
  • debug:调试任务
  • setup:收集主机信息

自定义标签:

  • per_tasks:指定标签之前的任务
  • port_tasks:运行指定标签之后的任务

我们用一串简单的代码来展示一下标签的用法

- hosts: all
  remote_user: root
  tasks:
   - name: tag debug
     debug:
       msg: "this is test1"
     tags:
       - debug

   - name: tag setup
     setup:
     tags:
       - setup

   - name: tag always
     debug:
       msg: "run"
     tags:
       - always
   - name: tag never
     debug:
       msg: "never run"
     tags:
       - never

在目标主机 touch guoqi.txt 标签always

在目标主机复制文件 /opt/abc.txt 标签never

第一次运行playbook不指定标签,查看文件生成情况。指定标签为never,再查看文件生成情况

Ansible-playbook-------Template,tags,roles模块_第12张图片

ansible-playbook tag.yml --tag="never"

ansible-playbook tag.yml --tag="always"

never标签,选中也不执行。

Ansible-playbook-------Template,tags,roles模块_第13张图片

我们修改标签

Ansible-playbook-------Template,tags,roles模块_第14张图片

Ansible-playbook-------Template,tags,roles模块_第15张图片

因为有always(不管你是否指定了运行标签,任务都会执行 )的原因,他还是会执行前面内容

Ansible-playbook-------Template,tags,roles模块_第16张图片

Ansible-playbook-------Template,tags,roles模块_第17张图片

运行完之后,他只会运行你已经选择的标签

Roles模块

又叫角色

ansible层次化,结构化的组织playbook,使用了rolse(角色)

可以根据层次的结构,自动装载变量文件,task,以及handlers等等

rolse:分别把变量 文件 任务 模块 以及处理器,防止单独的目录当中,使用rolse模块来一键调用这些文件。(类似于docker-compose)

rolse的结构图

-----------web------总目录,角色

files    存放copy和script模块调用的文件

templates  存放j2的模板文件

tasks  包含任务的目录

------main.yml  角色运行的任务

handlers   包含处理器的目录

----------main.yml

vars:存放变量的目录

---------main.yml

defaults  包含默认变量的目录

----------main.yml

meta    #包含元信息的目录

---------------main.yml

site.yml用来调用所有的配置文件。

相当于每一层都有一个main.yml

实验部署

通过roles来同时部署httpd,mysql,php


实验架构:

Ansible-playbook-------Template,tags,roles模块_第18张图片

在  /etc/ansible/roles 下创建httpd  mysql   php  三个目录

每个目录都创建  defaulte , files , meta , tasks , vars , handlers ,.并且每个目录下都有main.yml文件

1.httpd/tasks/main.yml

- name: install httpd
  yum: name={{pkg}}
- name: start httpd
  service: enabled=true name={{svc}} state=started

Ansible-playbook-------Template,tags,roles模块_第19张图片

1.2httpd/vars/main.yml

pkg: httpd
svc: httpd

2.mysql/tasks/main.yml

- name: install mysql
  yum: name={{pkg}}
- name: start mysql
  service: enabled=true name={{svc}} state=started

Ansible-playbook-------Template,tags,roles模块_第20张图片

2.2mysql/vars/main.yml

pkg:
  - mariadb
  - mariadb-server
svc: mariadb

Ansible-playbook-------Template,tags,roles模块_第21张图片

3.php/tasks/main.yml

- name: install php
  yum: name={{pkg}}
- name: start php-fpm
  service: enabled=true name={{svc}} state=started

Ansible-playbook-------Template,tags,roles模块_第22张图片

3.2 php/vars/main.yml

pkg:
  - php
  - php-fpm
svc: php-fpm

Ansible-playbook-------Template,tags,roles模块_第23张图片

最后我们在roles目录下创建site,yml文件

- hosts: 20.0.0.50
  remote_user: root
  roles:
   - httpd
   - mysql
   - php

Ansible-playbook-------Template,tags,roles模块_第24张图片

即可。

roles这个模块。site.yml相当于电影的总导演,他来选择哪个软件上场表演(安装/操作),而httpd,mysql,php相当于电影中的演员,只有被导演选中才能上场,就算没被选中,该软件的配置内容也不能少。

你可能感兴趣的:(ansible)