0
点赞
收藏
分享

微信扫一扫

ansible权威指南笔记(三)—— playbook高级用法


一、 模板 templates

本质是嵌套有脚本(使用模板编程语言Jinja2编写)的文本文件,借助模板生成真正的配置文件。

1. Jinja2语言

使用字面量,有下面形式:

  • 字符串:使用单引号或双引号
  • 数字:整数,浮点数
  • 列表:[item1, item2, ...]
  • 元组:(item1, item2, ...)
  • 字典:{key1:value1, key2:value2, ...}
  • 布尔型:true/false
  • 算术运算:+, -, *, /, // 整除, %, **
  • 比较操作:==, !=, >, >=, <, <=
  • 逻辑运算:and,or,not
  • 流表达式:For,If,When

2. template 的使用

  • template文件必须存放于templates目录下,且命名为 .j2 结尾
  • yaml/yml 文件需和templates目录平级,目录结构如下:

├── temnginx.yml
└── templates
   └── nginx.conf.j2

示例:利用template 同步nginx配置文件

  • 准备模板文件(从nginx原配置文件复制)

cp nginx.conf templates/nginx.conf.j2
• 替换nginx.conf.j2中某些参数值为变量
worker_processes {{ ansible_processor_vcpus }};
也可以用运算操作,例如
worker_processes {{ ansible_processor_vcpus**2 }};
 worker_processes {{ ansible_processor_vcpus+2 }};• 编写playbook
vim temnginx.yml
---
 - hosts: websrvs
   remote_user: root
   
   tasks:
     - name: template config to remote hosts
       template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

其中 template部分含义就是将nginx.conf.j2参数的变量值替换后,复制到目标主机并更名为nginx.conf。例如本例是将worker_processes参数值根据各目标主机cpu数 {{ ansible_processor_vcpus }} 值进行替换并生成Nginx配置文件。

二、 条件判断 when

在task后添加when子句即可使用条件判断

tasks:
   - name: "shutdown RedHat flavored systems"
     command: /sbin/shutdown -h now
     when: ansible_os_family == "RedHat" 多个条件判断
tasks:
   - name: install conf file to centos7
     template: src=nginx.conf.c7.j2 dest=/etc/nginx/nginx.conf
    when: ansible_distribution_major_version == "7"
   - name: install conf file to centos6
     template: src=nginx.conf.c6.j2 dest=/etc/nginx/nginx.conf
    when: ansible_distribution_major_version == "6"

三、 循环 with_items

当有需要重复性执行的任务时,可以使用循环。对循环项的引用,固定变量名为"item"。

要在task中使用with_items给定要迭代的元素列表,列表格式可以是字符串或者字典。

示例1:创建用户,item为字符串

---
- name: add several users
  user: name={{ item }} state=present groups=wheel   # {{ item }} 系统自定义变量
  with_items:       # 定义{{ item }} 的值和个数
    - testuser1
    - testuser2

上面语句的功能等同于下面的语句:

- name: add user testuser1
  user: name=testuser1 state=present groups=wheel
- name: add user testuser2
  user: name=testuser2 state=present groups=wheel

示例2:创建用户,item为字典

- name: add several users
   user: name={{ item.name }} state=present groups={{ item.groups }}
  with_items:
     - { name: 'testuser1', groups: 'wheel' }
     - { name: 'testuser2', groups: 'root' }

示例3:创建组和用户
---

- 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' }

四、 综合案例 

template中使用 for if  when

vi templates/nginx.conf.j2

# 按照nginx_vhosts 列表生成listen 参数值

{% for vhost in nginx_vhosts %}
server {
    listen {{ vhost }}
}
{% endfor %}

vi temnginx.yml

---
 - hosts: mageduweb
   remote_user: root
  vars:
     nginx_vhosts:
       - web1
       - web2
       - web3
   tasks:
     - name: template config
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

生成的结果:

server {
    listen web1
}
server {
    listen web2
}
server {
    listen web3
}

参考

《ansible权威指南》

https://www.bilibili.com/video/BV1HZ4y1p7Bf?from=search&seid=13215158654353304589&spm_id_from=333.337.0.0

有道云笔记

举报

相关推荐

0 条评论