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"   # 当系统属于红帽系列,执行command模块 

多个条件判断

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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hehuyi_In

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值