ansible之判断语句jinja2模板的使用 与roles角色的配置使用
ansible之判断语句的用法
判断语句:
实践案例1: 根据不同操作系统,安装相同的软件包
Centos: httpd
Ubuntu: httpd2
[root@centos7 project1]# cat when.yml - hosts: webserverstasks:- name: Install httpd Serveryum: name=httpd state=presentwhen: ansible_distribution == "CentOS"- name: Install httpd serverapt: name=httpd2 state=presentwhen: ansible_distribution == "Ubuntu"
2. 所有web主机名的添加到阿里云仓库, 其余的都跳过添加: 可以用and 和or 做多次条件判断
# is match 是做匹配的意思
[root@centos7 project1]# cat when2.yml --- - hosts: alltasks:- name: Add Nginx Reposyum_repository:name: nginx_tetdescription: EPEL YUM repobaseurl: http://mirrors.cloud.aliyuncs.com/epel/7/$basearch gpgcheck: nowhen: (ansible_hostname is match "web*") or (ansible_hostname is match "lb*")
3. 循环语句:
实践案例一: 使用循环启动多个服务
#注意: {{ item }} 是变量的意思
with_items: 是上面变量里面的内容! 这里的意思就是启动httpd 和mariadb2个服务,如果还要启动samba就是 - samba
[root@centos7 project1]# cat when3.yml - hosts: webserverstasks:- name: Start httpdsystemd: name={{ item }} state=startedwith_items:- httpd- mariadb
实践二:批量安装软件包的方法: 这里也可以使用上面用到的{{ item }} 这个变量来实现
[root@centos7 project1]# cat 5.yml - hosts: webserverstasks:- name: ensure a list of packages installedyum: name= "{{ packages }}" state=presentvars:packages:- httpd- httpd-tools
4.
实践案例三: 使用字典循环方式创建用户和批量拷贝文件 (重要!!!)
#注意!!! name={{ item.name }} 不能有空格,不然就无法成功
#注意, 批量的时候item.name 就等于下面的循环列表中的name
[root@centos7 project1]# cat 6.yml - hosts: webserverstasks:- name: Add Usersuser: name={{ item.name }} groups={{ item.groups }} state=presentwith_items:- { name: 'testuser1', groups: 'bin' }- { name: 'testuser2', groups: 'root' }[root@centos7 project1]# cat with4.yml - hosts: webserverstasks:- name: Copy Rsync configure and Rsync passwdcopy: src={{ item.src }} dest={{ item.dest }} mode={{ item.mode }}with_items:- { src: "./rsyncd.conf", dest: "/etc/rsyncd.conf", mode: "0644" }- { src: "./rsync.passwd", dest: "/tmp/etc/rsync.passwd", mode: "0600" }
5.handlers注意事项
#无论多少个task通知了相同的handlers handlers仅会在所有tasks结束后运行一次
# 只有task发生改变了才会通知handlers 没有改变则不会出发handlers
# 不能使用handlers替代tasks
[root@centos7 project1]# cat han.yml - hosts: webserversvars:- http_port:8083tasks:- name: Install Http Serveryum: name=httpd state=present- name: Configure httpd servertemplate: src=./httpd.conf.j2 dest=/etc/httpd/conf/httpd.confnotify:- Restart Httpd Server- Restart PHP Server- name: start httpd serverservice: name=httpd state=started enabled=yeshandlers:- name: Restart Httpd Serversystemd: name=httpd start=restarted- name: Restart PHP Serversystemd: name=php-fpm start=restarted
handlers的使用
6. tags标签(用于调试的场景下)
[root@centos7 project1]# cat tag.yml - hosts: webserversvars:- http_port:8083tasks:- name: Install Http Serveryum: name=httpd state=presenttags:- install_httpd- httpd_server- name: Configure httpd servertemplate: src=./httpd.conf.j2 dest=/etc/httpd/conf/httpd.confnotify:- Restart Httpd Server- Restart PHP Servertags:- confiure_httpd- httpd_server- name: start httpd serverservice: name=httpd state=started enabled=tags: service_httpdhandlers:- name: Restart Httpd Serversystemd: name=httpd start=restarted- name: Restart PHP Serversystemd: name=php-fpm start=restarted[root@centos7 project1]# ansible-playbook tag.yml --list-tags #查看tag.yml内有几个标签 [root@centos7 project1]# ansible-playbook tag.yml -t httpd_server #运行一个标签内的任务 [root@centos7 project1]# ansible-playbook tag.yml -t httpd_server,service_httpd #运行多个标签内的任务,注意用逗号隔开就行了
tags标签的使用
7. include的用法,就是吧每个yml写成单独的一个功能,方便调用和规范化
include_tasks
[root@centos7 project1]# cat task.yml - hosts: webserversvars:- http_port: 8081tasks:- include_tasks: task_install.yml- include_tasks: task_start.yml[root@centos7 project1]# cat task_install.yml - name: Install http serveryum: name=httpd state=present[root@centos7 project1]# cat task_start.ym - name: start httpd serversservice: name=httpd state=started enabled=yes
ansible 之jinja2模板的使用
jinja2的模板可以用变量和for的循环语句, 他的语法和ajax的语法一样
1. 案例: 使用变量 + for循环的方式实现功能
[root@gukai project1]# cat jinja_nginx.yml - hosts: webserversvars: - http_port: 80- server_name: www.oldboy.comtasks:- name: copy nginx configuretemplate: src=./oldboy.conf.j2 dest=/etc/nginx/conf.d/oldboyedu_proxy.conf[root@gukai project1]# cat oldboy.conf.j2 upstream {{ server_name }} { {% for i in range(1,10) %}server 172.16.1.{{i}}:{{http_port}}; {% endfor %}server {listen {{ http_port }};server_name {{ server_name }};location / {proxy_pass http://{{ server_name }}; proxy_set_header Host $http_host;} }[root@gukai project1]# ansible-playbook jinja_nginx.yml #最后执行任务推送过去
1. 案例: 使用变量 + for循环的方式实现功能
2.案例:############jinja2版本,通过if else 判断语句生成不同的模板keeplive方法
[root@gukai project1]# cat kee.conf.j2 global_defs {route_id {{ ansible_hostname }} }vrrp_instance VI_1 { {% if ansible_hostname =="web01" %}state MASTERpriority 150 {% elif ansible_hostname == "web02" %}state BACKUPpriority 100 {% endif %}
3. 案例:
###########使用ansible jinja IF 生成不同的mysql配置文件(自定义变量)
#注意,使用jinja模板 发送配置文件到目标主机上需要使用template 命令
[root@gukai project1]# cat jinja_mysql.yml - hosts: webserversgather_facts: novars:PORT: 13306#PORT: falsetasks:- name: Coyp mysql confiuretemplate: src=./my.cnf.j2 dest=/tmp/my.cnf[root@gukai project1]# cat my.cnf.j2 # This is mysql co configure{% if PORT %} bind-address=0.0.0.0:{{ PORT }} {% else %} bind-address=0.0.0.0:3306 {% endif %}[root@gukai project1]# ansible-playbook jinja_mysql.yml
ansible 之role的使用方法
[root@gukai ~]# cd /etc/ansible/roles/[root@gukai roles]# mkdir nfs/{tasks,handlers,templates} -pv mkdir: 已创建目录 "nfs" mkdir: 已创建目录 "nfs/tasks" mkdir: 已创建目录 "nfs/handlers" mkdir: 已创建目录 "nfs/templates"
#这个就是创建角色 [root@gukai roles]# cat site.yml #对那个目录下的功能起作用 - hosts: webserversroles:- nfs
[root@gukai tasks]# cat config.yml #配置服务 - name: configure nfs-utils servertemplate: src=./exports.j2 dest=/etc/exports owner=root group=root mode=0644notify: Restart NFS Server[root@gukai tasks]# cat install.yml #安装服务 - name: Install NFS-utils Serveryum: name=nfs-utils state=present[root@gukai tasks]# cat start.yml #启动服务 - name: Start NFS serversystemd: name=nfs state=started enabled=yes
[root@gukai tasks]# cat main.yml #main.yml是主函数的意思下面包含了各个功能的 - include_tasks: install.yml #- include_tasks: config.yml - include_tasks: start.yml#include_tasks 是包含使用那些yml文件,目的是吧每个功能都单独区分开来[root@gukai tasks]# ansible-playbook site.yml #运行playbook
#######################安装memcache
[root@gukai roles]# mkdir memcached/{tasks,handlers,templates} -pv mkdir: 已创建目录 "memcached" mkdir: 已创建目录 "memcached/tasks" mkdir: 已创建目录 "memcached/handlers" mkdir: 已创建目录 "memcached/templates"
[root@gukai roles]# tree memcached/ #目录结构 memcached/ ├── handlers │ └── main.yml ├── tasks │ ├── config.yml │ ├── install.yml │ ├── main.yml │ └── start.yml └── templates└── redis.j2
[root@gukai roles]# cat memcached/handlers/main.yml - name: restart redis serversystemd: name=redis state=restarted
[root@gukai roles]# cat memcached/tasks/config.yml - name: copy redis server configuretemplate: src=redis.j2 dest=/tmp/redis.confnotify: restart redis server[root@gukai roles]# cat memcached/tasks/start.yml - name: start redis serversystemd: name=redis state=started enabled=yes[root@gukai roles]# cat memcached/tasks/install.yml - name: Install memcached serveryum: name=redis state=present#############以上是功能的模块[root@gukai roles]# cat memcached/tasks/main.yml - include_tasks: install.yml - include_tasks: config.yml - include_tasks: start.yml #主函数,包含以上功能代码
tasks
[root@gukai roles]# cat memcached/templates/redis.j2 PORT="12333" USER="redis" CACHESIZE="{{ ansible_memtotal_mb //2 }}" #套用jinja2的模板语法和变量的语法实现特定的信息[root@gukai roles]# cat site.yml - hosts: webserversroles:- nfs - hosts: webserversroles:- memcached#加载进去memcached模块[root@gukai roles]#ansible-playbook site.yml
##############将功能整合到一起的写法
[root@gukai roles]# tree rsync/ rsync/ ├── handlers │ └── main.yml ├── tasks │ └── main.yml └── templates├── rsyncd.conf.j2└── rsyncd.password.j2
[root@gukai roles]# cat rsync/handlers/main.yml - name: restart rsync serversystemd: name=rsyncd state=restarted[root@gukai roles]# cat rsync/tasks/main.yml - name: install rsync serveryum: name=rsync state=present- name: configure rsync servertemplate: src={{ item.src }} dest={{ item.dest }} mode={{ item.mode }}with_items:- { src: 'rsyncd.conf.j2', dest: '/tmp/rsync.conf', mode: '0644' }- { src: 'rsyncd.password.j2', dest: '/tmp/rsync.conf', mode: '777' }notify: restart rsync server- name: systemd rsync serversystemd: name=rsyncd state=started enabled=yes[root@gukai roles]# cat rsync/templates/rsyncd.conf.j2 uid=www gid=www port=873[root@gukai roles]# cat site.yml #- hosts: webservers # roles: # - nfs #- hosts: webservers # roles: # - memcached- hosts: webserversroles:- rsync
转载于:https://www.cnblogs.com/gukai/p/10816336.html
ansible之判断语句jinja2模板的使用 与roles角色的配置使用相关推荐
- Ansible Jinja2 模板
1.jinja2渲染NginxProxy配置文件 jinja2 房屋建筑设计固定的? jinja2模板与Ansible关系 Ansible如何使用jinja2模板 template模块 拷贝文件? t ...
- 模板上 php dede,织梦CMS模板中dede标签使用php和if判断语句的方法
今天我们织梦模板团来说说织梦模板中dede标签使用php和if判断语句的方法: 先来看看下面这个标签: 下面来说说具体的方法: 方法一: 用个if判断语句,判断一个字段是否有东西,有就输出1,没有则就 ...
- 模板上 php dede,DEDE模板中使用php和if判断语句实例
这篇文章主要为大家详细介绍了DEDE模板中使用php和if判断语句实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴. 今天刚刚在给用户用织梦CMS二次开发站点的 ...
- Flask_day_2渲染Jinja2模板和传参(if判断、for循环、过滤器、继承和block、URL链接)
***Flask渲染Jinja2模板和传参: 1.如何渲染模板 *模板放在'templates'文件夹下 *在'flask'中导入'render_template' *在视频函数中,用'render_ ...
- ansible之when条件语法、处理任务失败、jinja2模板和项目管理
目录 一.item---loop 1.给定数据如下: 使用loop来输出 My name is zhangsan/lisi My age is 18/20 2.给定数据Services,要求使用loo ...
- Jinja2模板引擎语法
模板案例 eg: <!doctype html> <title>Hello template</title> {% if name %}<h1>Hell ...
- Flask框架基础Jinja2模板
Flask框架基础Jinja2模板-- 潘登同学的flask学习笔记 文章目录 Flask框架基础Jinja2模板-- 潘登同学的flask学习笔记 return 模板 Template 模板的使用 ...
- 四、Ansible文件模块库与模板
一.Ansible描述文件模块 files模块库的引入 模块库:根据文档中的功能以及系统上的安装时间进行分组后的模块的集合 Files模块库包含的模块允许您完成与Linux文件管理相关的大多数任务,如 ...
- Jinja2模板基本语法
当下学Jinja2的语法只是为了能展示网页,所以这里只介绍其基本语法.后续若有更高需求,会持续补充 Jinja2是基于python的模板引擎,是Flask作者开发的一个模板系统.起初是仿djang ...
- Python 之 jinja2模板
Web框架把我们从WSGI中拯救出来了.现在,我们只需要不断地编写函数,带上URL,就可以继续Web App的开发了. 但是,Web App不仅仅是处理逻辑,展示给用户的页面也非常重要.在函数中返回一 ...
最新文章
- 前后端分离的探索(一)
- python多线程和多进程的使用_python多线程与多进程
- Oracle锁表 行级锁 表级锁 行级锁
- django修改服务器名称,django部署和服务器配置教程
- Python基础:02数字
- 单例模式(singleton)解析例子
- java 输入流关闭顺序_Java IO流中先关闭输出流还是先关闭输入流?为什么?
- 深度相机(三)--三种方案对比
- SpringBoot中 pagehelper插件使用
- Mssql高级注入笔记.txt (转自:慕容小雨BLOG)
- springboot mybatis常见异常及处理方法
- 90%做tiktok运营都存在的误区?
- JQuery Ajax 解析
- 自动生成光纤测试资料的软件,光缆测试资料生成模板
- matlab矩阵求和速度慢,matlab – 将完整矩阵转换为完整矩阵的速度很慢?
- 解决:return _compile(pattern, flags).search(string) TypeError: expected string or buffer
- markdown文档插入表情符号支持的英文单词大全 官方
- windows文件同步备份软件-文件夹同步工具哪个好?
- 视频教程-Unity网络游戏架构设计-Unity3D
- 什么是SAN网络?SAN网络上的存储备份和恢复怎么操作?SAN 测试网络存储与服务器架构架构优化
热门文章
- python根据时间序列画折线图_时间序列模型的python实现
- python startswith正则表达式_Python 正则表达式
- 客户细分——RFM模型
- 将ttc改为otf_Font Renamer字体更名、重命名工具_支持ttf、ttc、otf、pfb字体 V3.0 下载...
- 基于TTP223金属触摸开关电路模块原理图和PCB工程文件
- 实验吧:天网管理系统
- 调试基础知识0(串口调试助手对比 丁丁 大傻 友善)
- 易捷行云EasyStack携新一代私有云亮相中国电子信息博览会
- win10系统优化---持续整理中
- mac不显示安装的程序