Ansible之 模板,条件测试,循环语句 使用

1  概述



本文将结合例子介绍模块,条件测试和循环语句的使用



2  模板



模块和模板的区别,template模块是将模板文件里的变量以实际的值重新生成后文件后,复制到远程主机上

模块:template

基于模板(以后缀.j2结尾的文件)方式生成一个文件复制到远程主机,调用ansible的收集到的内建变量,变量的嵌入代码的标志是双花括号

*src=

*dest=

owner=

group=

mode=

模板:templates

文本文件,嵌套有脚本(使用模板编程语言Jinja2编写)

字面量:

字符串:使用单引号或双引号;

数字:整数,浮点数;

列表:[item1, item2, ...]

元组:(item1, item2, ...)

字典:{key1:value1, key2:value2, ...}

布尔型:true/false

算术运算:

+, -, *, /, //, %, **

比较操作:

==, !=, >, >=, <, <=

逻辑运算:

and, or, not

例一:

安装redis软件,配置redis的配置文件为模板

修改配置模板文件,以.j2结尾

vim /root/redis.conf.j2

maxmemory {{ ansible_memtotal_mb / 2 }}mb

注意,template不能再命令行执行,即不能在命令里用-m指定模块为template执行,需要定义在脚本里,用playbook执行脚本

vim /root/ansible/installvar.yml 
- hosts: websrvs
  remote_user: root
  vars:
  - pkgname: redis
  tasks:
  - name: install package
    yum: name={{ pkgname }} state=latest
  - name: install redis conf
    template: src=/root/redis.conf.j2 dest=/etc/redis.conf owner=redis group=root mode=644

执行脚本如下

ansible-playbook installvar.yml

则websrvs组里的主机安装redis后配置文件配置的maxmemory为ansible_memtotal_mb / 2 的值

例二:

安装nginx,把nginx配置文件配置为模板

vim /root/ansible/instnginx.yml
    - hosts: websrvs
    remote_user: root
    tasks:
    - name: install nginx
     yum: name=nginx state=present
    - name: install conf file
     template: src=/root/nginx.conf.j2 dest=/etc/nginx/nginx.conf
     notify: restart nginx
     tags: instconf
    - name: start nginx service
     service: name=nginx state=started
     handlers:
    - name: restart nginx
     service: name=nginx state=restarted

模板配置文件 :nginx.conf.j2

    worker_processes {{ ansible_processor_vcpus }};
    server_name   {{  ansible_fqdn }};


3  条件测试



如被管控的主机系统不一样,执行的语句可能会不一样,需要做条件的判定

when语句:在task中使用,jinja2的语法格式

例子:

在centos6和centos7上安装nginx,判断对应主机系统版本,实现不一样的配置

vim instnginx.yml
- hosts: nginx
  remote_user: root
  tasks:
  - name: install nginx package
    yum: name=nginx state=latest
    tags: instpkg
  - name: install conf file6
    template: src=/root/nginx.conf.c6.j2 dest=/etc/nginx/nginx.conf
    when: ansible_distribution_major_version == "6" 
    notify: restart nginx
  - name: install conf file7
    template: src=/root/nginx.conf.c7.j2 dest=/etc/nginx/nginx.conf
    when: ansible_distribution_major_version == "7" 
    notify: restart nginx
  - name: start nginx service
    service: name=nginx enabled=true state=started
  handlers:
  - name: restart nginx
    service: name=nginx state=restarted

运行

ansible-playbook instnginx.yml

例子:

根据主机的ip,拷贝不同的文件到对应的主机

vim   cpfile.yml
- hosts: nginx
  remote_user: root
  tasks:
  - name: copy file6
    copy: src=/root/nginx.conf.c6.j2 dest=/tmp/
    when: ansible_default_ipv4['address'] == '172.18.50.63'
  - name: copy file7
    copy: src=/root/nginx.conf.c7.j2 dest=/tmp/
    when: ansible_default_ipv4['address'] == '172.18.50.75'

执行

ansible-playbook cpfile.yml



4  循环



迭代,需要重复执行的任务;

1 对迭代项的引用,固定变量名为”item“

2 然后在task中使用with_items给定要迭代的元素列表;

列表方法:

字符串

字典:元素可以是字典,复制多个文件时,可以直接使用copy模块

例子:

通过迭代的方法安装服务包和创建用户

vim iteration.yml
- hosts: dbsrvs
  remote_user: root
  vars: 
  - jdk_version: 1.8.0
  tasks:
  - name: install {{ item }} package
    yum: name={{ item.name }}-{{ item.version }} state=latest
    with_items:
    - { name: 'nginx',version: '1.10.2' }
    - { name: 'tree',version: '1.5.3' }
  - name: copy nginx conf
    copy: src={{ item.file }} dest={{ item.conf }}
    with_items:
    - { file: '/root/nginx.conf.os6',conf: '/etc/nginx.conf' }
  - name: install {{ item }} package
    yum: name={{ item }} state=latest
    with_items:
    - java-{{ jdk_version }}-openjdk
    - tomcat
    - tomcat-webapps
    - tomcat-docs-webapp
    - tomcat-admin-webapps
  - name: add some groups
    group: name={{ item }} state=present
    with_items:
    - ansigrp1
    - ansigrp2
  - name: add some users
    user: name={{ item.name }} group={{ item.group }} state=present
    with_items:
    - { name: 'ansiuser1', group: 'ansigrp1' }
    - { name: 'ansiuser2', group: 'ansigrp2' }


Ansible之 模板,条件测试,循环语句 使用

时间: 2024-10-11 06:01:30

Ansible之 模板,条件测试,循环语句 使用的相关文章

shell脚本中用到的条件和循环语句

本博文介绍一下shell脚本中常用的条件和循环语句: 条件语句: 循环语句: 示例: if语句: eg1. eg2. 2.case语句: 简单的case语句: 配合循环的case语句: 3.for语句: 简单的for语句:eg1. eg2. 和case搭配的for语句:eg3. 4.while语句: eg1. eg2. 5.util语句: 6.select语句:

Python 2.7 学习笔记 条件与循环语句

本文介绍下python条件和循环语句的语法 一.if条件语句 语法格式如下: if 表达式: .... elif 表达式: .... elif 表达式: .... else: ..... 说明:与其它语言的语法区别是,表达式或else后面要加 冒号 结尾. 语句块没有用一些标识符括起来,而是靠缩进来标记. 二.while循环 语法格式是: while 表达式: ........ 三.for循环 for循环用于遍历一个集合,语法格式是: for  元素  in  集合 ........ 举例如下:

awk 条件及循环语句

条件语句 if(条件表达式) 动作1 else if(条件表达式) 动作2 else 动作3 循环语句: while循环: while(条件表达式) 动作 do while循环: do 动作 while(条件表达式) for循环: for(初始化计数器;计数器测试;计数器变更) 动作 以:为分隔符,只打印/etc/passwd中第3个字段的数值在50-100范围内的行信息 awk 'BEGIN{FS=":"}{if($3>50 && $3<100) prin

Javascript语法,变量类型,条件,循环语句,函数,面向对象

1.JavaScript代码革两种存在形式: <!-- 方式一 --> <script type='txt/javascript' src='/js/comment.js'></script> <!-- 方式二 --> <script type='txt/javascript'> js代码内容 </script> 方式一可以有效提高代码的重用性 2.JavaScript代码存放位置 HTML的head中 HTML的body代码块底部(

Python 的条件与循环语句

Python 条件语句:        if 语句的判断条件可以用>(大于).<(小于).==(等于).>=(大于等于).<=(小于等于)来表示其关系.        如果判断需要多个条件需同时判断时,可以使用 or (或),表示两个条件有一个成立时判断条件成功:使用 and (与)时,表示只有两个条件同时成立的情况下,判断条件才成功     1.if语句用于控制程序的执行:          if 条件:               代码块          else:     

python条件及循环语句

1.条件语句 2.循环语句 3.迭代器 4.列表解析 5.生成器表达式 1.条件语句 最简单的条件语句: if expression: expr_true_suite 如上,if是关键字,expression是条件表达式,条件表达式支持多重条件判断,可以用布尔操作符and.or和not连接,expr_true_suite是代码块,expression为true时执行,代码块如果只有一行,上面的整个条件语句便可全部写到一行,但可读性差. 带elif和else的条件语句: if expression

Python之条件、循环语句

1.条件语句 #语法: if <条件判断1>: <执行1> elif <条件判断2>: <执行2> elif <条件判断3>: <执行3> else: <执行4> if 语句执行有个特点,它是从上往下判断,如果在某个判断上是 True,把该判断对应的语句执行后,就忽略掉剩下的 elif 和 else 当 if 有多个条件时可使用括号来区分判断的先后顺序,括号中的判断优先执行,此外 and 和 or 的优先级低于>(大

python基础(3)--条件判断循环语句与列表解析,生成器

判断循环语句语法说明: 1,if if boolean_expression: ... elif boolean_expression: ... else ... 2,while while boolean_expression: while_suite if boolean_expression2: continue if boolean_expression3: break else: else_suite 3,for for expression in object: for_suite

集合与条件、循环语句

集合 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 集合操作符和关系符号: 常用操作 s = set([3,5,9,10]) #创建一个数值集合 t = set("Hello") #创建一个唯一字符的集合 a = t | s # t 和 s的并集 b = t & s # t 和 s的交集 c = t – s # 求差集(项在t中,但不在s中) d = t ^ s # 对称差集(

条件及循环语句

(1) IF 条件: 执行内容一 else: 执行内容二 (2) if 条件: 代码块一 elif条件: 代码块二 else: 代码块三 (3) 循环: while 条件: 代码块 break continue break:用于跳出所有循环,break后面的代码不在执行 continue:用于跳出本次循环,继续下次循环 (4)代码案例: #!/usr/bin/env python #-*-coding:utf-8-*- #一个等号是赋值,两个等号是比较 if 1!=1: print ("1111