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角色的配置使用相关推荐

  1. Ansible Jinja2 模板

    1.jinja2渲染NginxProxy配置文件 jinja2 房屋建筑设计固定的? jinja2模板与Ansible关系 Ansible如何使用jinja2模板 template模块 拷贝文件? t ...

  2. 模板上 php dede,织梦CMS模板中dede标签使用php和if判断语句的方法

    今天我们织梦模板团来说说织梦模板中dede标签使用php和if判断语句的方法: 先来看看下面这个标签: 下面来说说具体的方法: 方法一: 用个if判断语句,判断一个字段是否有东西,有就输出1,没有则就 ...

  3. 模板上 php dede,DEDE模板中使用php和if判断语句实例

    这篇文章主要为大家详细介绍了DEDE模板中使用php和if判断语句实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴. 今天刚刚在给用户用织梦CMS二次开发站点的 ...

  4. Flask_day_2渲染Jinja2模板和传参(if判断、for循环、过滤器、继承和block、URL链接)

    ***Flask渲染Jinja2模板和传参: 1.如何渲染模板 *模板放在'templates'文件夹下 *在'flask'中导入'render_template' *在视频函数中,用'render_ ...

  5. ansible之when条件语法、处理任务失败、jinja2模板和项目管理

    目录 一.item---loop 1.给定数据如下: 使用loop来输出 My name is zhangsan/lisi My age is 18/20 2.给定数据Services,要求使用loo ...

  6. Jinja2模板引擎语法

    模板案例 eg: <!doctype html> <title>Hello template</title> {% if name %}<h1>Hell ...

  7. Flask框架基础Jinja2模板

    Flask框架基础Jinja2模板-- 潘登同学的flask学习笔记 文章目录 Flask框架基础Jinja2模板-- 潘登同学的flask学习笔记 return 模板 Template 模板的使用 ...

  8. 四、Ansible文件模块库与模板

    一.Ansible描述文件模块 files模块库的引入 模块库:根据文档中的功能以及系统上的安装时间进行分组后的模块的集合 Files模块库包含的模块允许您完成与Linux文件管理相关的大多数任务,如 ...

  9. Jinja2模板基本语法

    当下学Jinja2的语法只是为了能展示网页,所以这里只介绍其基本语法.后续若有更高需求,会持续补充   Jinja2是基于python的模板引擎,是Flask作者开发的一个模板系统.起初是仿djang ...

  10. Python 之 jinja2模板

    Web框架把我们从WSGI中拯救出来了.现在,我们只需要不断地编写函数,带上URL,就可以继续Web App的开发了. 但是,Web App不仅仅是处理逻辑,展示给用户的页面也非常重要.在函数中返回一 ...

最新文章

  1. 前后端分离的探索(一)
  2. python多线程和多进程的使用_python多线程与多进程
  3. Oracle锁表 行级锁 表级锁 行级锁
  4. django修改服务器名称,django部署和服务器配置教程
  5. Python基础:02数字
  6. 单例模式(singleton)解析例子
  7. java 输入流关闭顺序_Java IO流中先关闭输出流还是先关闭输入流?为什么?
  8. 深度相机(三)--三种方案对比
  9. SpringBoot中 pagehelper插件使用
  10. Mssql高级注入笔记.txt (转自:慕容小雨BLOG)
  11. springboot mybatis常见异常及处理方法
  12. 90%做tiktok运营都存在的误区?
  13. JQuery Ajax 解析
  14. 自动生成光纤测试资料的软件,光缆测试资料生成模板
  15. matlab矩阵求和速度慢,matlab – 将完整矩阵转换为完整矩阵的速度很慢?
  16. 解决:return _compile(pattern, flags).search(string) TypeError: expected string or buffer
  17. markdown文档插入表情符号支持的英文单词大全 官方
  18. windows文件同步备份软件-文件夹同步工具哪个好?
  19. 视频教程-Unity网络游戏架构设计-Unity3D
  20. 什么是SAN网络?SAN网络上的存储备份和恢复怎么操作?SAN 测试网络存储与服务器架构架构优化

热门文章

  1. python根据时间序列画折线图_时间序列模型的python实现
  2. python startswith正则表达式_Python 正则表达式
  3. 客户细分——RFM模型
  4. 将ttc改为otf_Font Renamer字体更名、重命名工具_支持ttf、ttc、otf、pfb字体 V3.0 下载...
  5. 基于TTP223金属触摸开关电路模块原理图和PCB工程文件
  6. 实验吧:天网管理系统
  7. 调试基础知识0(串口调试助手对比 丁丁 大傻 友善)
  8. 易捷行云EasyStack携新一代私有云亮相中国电子信息博览会
  9. win10系统优化---持续整理中
  10. mac不显示安装的程序