Ansible - - Templates 模块管理
1,templates 使用规则
- 文本文件,嵌套有脚本(使用模板编程语言编写)
- Jinja2 语言,使用字面量,有下面形式
- 字符串:使用单引号或双引号
- 数字:整数,浮点数
- 列表:[item1,item2,...]
- 元组:(item1,item2,....)
- 字典:{key1:value1,key2:value2,...}
- 布尔型:true/false
 
- 算术运算:+ , - , * , / , // , % , **
- 比较操作:==, != , > , >= , <
- 逻辑运算:and, or, not
- 流表达式:For if When
2, when
- 条件测试:如果需要根据变量、facts 或此前任务的执行结果来做为某 task 执行与否的前提时要用到条件测试,通过 when 语句实现,在 task 中使用,jinja2 的语法格式
- when 语句
- 在 task 后添加 when 子句即可使用条件测试;when 语句支持 jinja2 表达式语法
- 示例
- name: "shutdown RedHat flavored systems"
  command: /sbin/shutdown -h now
  when: ansible_os_family == "RedHat"
- 示例2:如果操作系统版本为 centos7 或 6,copy 对应文件
---
- hosts: websrvs
  remote_user: root
  tasks:
    - name: add user nginx
      user: name=nginx state=present group=nginx
    - name: Install Nginx
      yum: name=nginx state=present
    - name: copy conf file to centos7
      template: src=nginx.conf.c7.j2 dest=/etc/nginx/nginx.conf
      when: ansible_distribution_major_version == "7"
    - name: copy conf file to centos6
      template: src=nginx.conf.c6.j2 dest=/etc/nginx/nginx.conf
      when: ansible_distribution_major_version == "6"
    - name: start  Nginx
      service: name=nginx state=started enabled=ture
3, 迭代:with_items
- 
迭代:当有需要重复执行的任务时,可以使用迭代机制 - 对迭代项的引用,固定变量名为 item
- 要在 task 中使用 with_items给定要迭代的元素列表
- 列表格式:
- 字符串
- 字典
 
 
- 对迭代项的引用,固定变量名为 
- 
示例 
---
- hosts: websrvs
  remote_user: root
  tasks:
    - name: create some files
      file: name=/tmp/{{ item }}  state=touch
      with_items:
        - file1
        - file2
        - file3
- 迭代嵌套子变量
---
- hosts: websrvs
  remote_user: root
  tasks:
    - name: add some groups
      group: name={{ item }} state=present
      with_items:
        - group1
        - group2
        - group3
    - name: add some users
      user: name={{ item.name }} group={{ item.group }} state=present
      with_items:
        - { name: 'user1', group: 'group1' }  
        - { name: 'user2', group: 'group2' }  
        - { name: 'user3', group: 'group3' }  
4,Playbook 中 template for if
{% for vhost in nginx_vhosts %}
server{
    listen {{ vhost.listen | default('80 default_server') }};
    {% if vhost.server_name is defined %}
    server_name {{ vhost.server_name }};
    {% endif %};
    {% if vhost.root is defined %}
    root {{ vhost.root }};
    {% endif %}
}
{% endfor %}
4.1 for 示例
- 列表方式
// testfor1.yml
---
- hosts: websrvs
  remote_user: root
  vars:
    ports:
      - 81
      - 82
  tasks:
    - name: copy conf
      template: src=for1.conf.j2 dest=/tmp/for1.conf
// templates/for1.conf.j2
{% for port in ports %}
server {
	listen {{ port }}
}
{% endfor %}
// 执行结果
server {
	listen 81
}
server {
	listen 82
}
- 字典方式
// testfor2.yml
---
- hosts: websrvs
  remote_user: root
  vars:
    ports:
      - listen_port: 83
      - listen_port: 84
  tasks:
    - name: copy conf
      template: src=for1.conf.j2 dest=/tmp/for2.conf
// templates/for2.conf.j2
{% for port in ports %}
server {
	listen {{ port.listen_port }}
}
{% endfor %}
// 执行结果
server {
	listen 83
}
server {
	listen 84
}
- 多个键值对
// testfor3.yml
---
- hosts: websrvs
  remote_user: root
  vars:
    ports:
      - web1:
        port: 85
        name: web1.test.com
        rootdir: /data/website1
      - web2:
        port: 86
        name: web2.test.com
        rootdir: /data/website2
  tasks:
    - name: copy conf
      template: src=for3.conf.j2 dest=/tmp/for3.conf
// templates/for3.conf.j2
{% for i in ports %}
server {
	listen {{ i.port }}
	servername: {{ i.name }}
	documentroot: {{ i.rootdir }}
}
{% endfor %}
// 执行结果
server {
	listen 85
	servername: web1.test.com
	documentroot: /data/website1
}
server {
	listen 86
	servername: web2.test.com
	documentroot: /data/website2
}
4.1 if 示例
- for 嵌套 if
// testfor4.yml
---
- hosts: websrvs
  remote_user: root
  vars:
    ports:
      - web1:
        port: 85
        name: web1.test.com
        rootdir: /data/website1
      - web2:
        port: 86
       # name: web2.test.com
        rootdir: /data/website2
  tasks:
    - name: copy conf
      template: src=for4.conf.j2 dest=/tmp/for4.conf
// templates/for4.conf.j2
{% for i in ports %}
server {
        listen {{ i.port }}
        {% if i.name is defined %}
        servername: {{ i.name }}
        {% endif %}
        documentroot: {{ i.rootdir }}
}
{% endfor %}
// 执行结果
server {
	listen 85
		servername: web1.test.com
		documentroot: /data/website1
}
server {
	listen 86
		documentroot: /data/website2
}
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号