当前位置:   article > 正文

[Ansible系列]ansible JinJia2过滤器_ansible jinja2 filter

ansible jinja2 filter

目录

一.  JinJia2简介

二.  JinJia2模板使用 

2.1  在play中使用jinjia2

2.2  template模块使用

2.3   jinjia2条件语句

2.4  jinjia2循环语句

2.5   jinjia2过滤器

2.5.1   default过滤器

2.5.2  字符串操作相关过滤器 

 2.5.3  数字操作相关过滤器

2.5.4  列表操作相关过滤器 

2.5.5   应用于文件的过滤器

2.5.6  应用于注册变量的过滤器 


一.  JinJia2简介

         Jinja2是基于python的模板引擎。那么什么是模板?

假设说现在我们需要一次性在10台主机上安装redis,这个通过playbook现在已经很容易实现。默认 情况下,所有的redis安装完成之后,我们可以统一为其分发配置文件。这个时候就面临一个问题,这 些redis需要监听的地址各不相同,我们也不可能为每一个redis单独写一个配置文件。因为这些配置 文件中,绝大部分的配置其实都是相同的。这个时候最好的方式其实就是用一个通用的配置文件来解 决所有的问题。将所有需要修改的地方使用变量替换。这个通用的配置文件就是模板。

二.  JinJia2模板使用 

2.1  在play中使用jinjia2

         以上面的redis为例,我们创建一个redis的模板,模板如下:

  1. [root@clinet ~]# cat /etc/redis.conf |grep -v ^# |grep -v ^$
  2. bind {{ ansible_eth0.ipv4.address }} 127.0.0.1
  3. protected-mode yes
  4. port 6379
  5. tcp-backlog 511
  6. timeout 0
  7. tcp-keepalive 300
  8. daemonize no
  9. supervised no
  10. pidfile /var/run/redis_6379.pid
  11. loglevel notice
  12. logfile /var/log/redis/redis.log
  13. databases 16
  14. save 900 1
  15. save 300 10
  16. save 60 10000
  17. stop-writes-on-bgsave-error yes
  18. rdbcompression yes
  19. rdbchecksum yes
  20. dbfilename dump.rdb
  21. dir /var/lib/redis
  22. slave-serve-stale-data yes
  23. slave-read-only yes
  24. repl-diskless-sync no
  25. repl-diskless-sync-delay 5
  26. repl-disable-tcp-nodelay no
  27. slave-priority 100
  28. appendonly no
  29. appendfilename "appendonly.aof"
  30. appendfsync everysec
  31. no-appendfsync-on-rewrite no
  32. auto-aof-rewrite-percentage 100
  33. auto-aof-rewrite-min-size 64mb
  34. aof-load-truncated yes
  35. lua-time-limit 5000
  36. slowlog-log-slower-than 10000
  37. slowlog-max-len 128
  38. latency-monitor-threshold 0
  39. notify-keyspace-events ""
  40. hash-max-ziplist-entries 512
  41. hash-max-ziplist-value 64
  42. list-max-ziplist-size -2
  43. list-compress-depth 0
  44. set-max-intset-entries 512
  45. zset-max-ziplist-entries 128
  46. zset-max-ziplist-value 64
  47. hll-sparse-max-bytes 3000
  48. activerehashing yes
  49. client-output-buffer-limit normal 0 0 0
  50. client-output-buffer-limit slave 256mb 64mb 60
  51. client-output-buffer-limit pubsub 32mb 8mb 60
  52. hz 10
  53. aof-rewrite-incremental-fsync yes

现在我们有了一个模板文件,那么在playbook中如何来使用呢? playbook使用template模块来实现模板文件的分发,其用法与copy模块基本相同,唯一的区别是, copy模块会将原文件原封不动的复制到被控端,而template会将原文件复制到被控端,并且使用变 量的值将文件中的变量替换以生成完整的配置文件。

playbook示例:

  1. [root@clinet yum_file]# cat jinjia2/install_redis.yml
  2. - hosts: test
  3. tasks:
  4. - name: configure redis max memory
  5. set_fact:
  6. redis_mem: "{{ (ansible_memtotal_mb /2) | int }}M"
  7. - name: debug memeory
  8. debug:
  9. msg:
  10. - '{{ redis_mem }}'
  11. - name: install redis
  12. package:
  13. name: redis
  14. state: present
  15. - name: configure redis.conf
  16. template:
  17. src: /root/ansible_test/ansible_2/template/redis.conf.j2
  18. dest: /etc/redis.conf
  19. notify:
  20. - restart redis
  21. - name: start redis
  22. service:
  23. name: redis
  24. state: started
  25. enabled: yes
  26. handlers:
  27. - name: restart redis
  28. service:
  29. name: redis
  30. state: restarted
  31. [root@clinet yum_file]#

2.2  template模块使用

         template模块会将原文件复制到被控端,并且使用变 量的值将文件中的变量替换以生成完整的配置文件。

关于template模块的更多参数说明:

·  backup:如果原目标文件存在,则先备份目标文件

·  dest:目标文件路径

·  force:是否强制覆盖,默认为yes

·  group:目标文件属组

·  mode:目标文件的权限

·  owner:目标文件属主

·  src:源模板文件路径

·  validate:在复制之前通过命令验证目标文件,如果验证通过则复制

2.3   jinjia2条件语句

         在上面的示例中,我们直接取了被控节点的ens33网卡的ip作为其监听地址。那么假如有些机器的网卡绑定的,那么网络连接时是bond0,这种做法就会报错。这个时候我们就需要在模板文件中定义条件语句如下:

  1. {% if ansbile_bond is defined %}
  2. bind {{ ansible_bond.ipv4.address }} 127.0.0.1
  3. {% elif ansible_bond is defined % }
  4. bind {{ ansible_ens33.ipv4.address }} 127.0.0.1
  5. {% else %}
  6. bind 0.0.0.0
  7. {% endif %}
  8. maxmemory {{ redis_mem }}
  9. protected-mode yes
  10. port 6379
  11. tcp-backlog 511
  12. timeout 0
  13. tcp-keepalive 300
  14. daemonize no
  15. supervised no
  16. pidfile /var/run/redis_6379.pid
  17. loglevel notice
  18. logfile /var/log/redis/redis.log
  19. databases 16
  20. save 900 1
  21. save 300 10
  22. save 60 10000

利用条件语句进一步配置redis主从模式:

  1. {% if ansbile_bond is defined %}
  2. bind {{ ansible_bond.ipv4.address }} 127.0.0.1
  3. {% elif ansible_ens33 is defined %}
  4. bind {{ ansible_ens33.ipv4.address }} 127.0.0.1
  5. {% else %}
  6. bind 0.0.0.0
  7. {% endif %}
  8. {% if master_ip is defined %}
  9. slaveof {{ master_ip }} {{ masterport | default(6379) }}
  10. {% endif %}
  11. {% if masterpass is defined %}
  12. masterauth {{ masterpass }}
  13. {% endif %}
  14. {% if requirepass is defined %}
  15. requirepass {{ requirepass }}
  16. {% endif %}
  17. maxmemory {{ redis_mem }}
  18. protected-mode yes
  19. port 6379
  20. tcp-backlog 511
  21. timeout 0
  22. tcp-keepalive 300
  23. daemonize no
  24. supervised no
  25. pidfile /var/run/redis_6379.pid
  26. loglevel notice
  27. logfile /var/log/redis/redis.log
  28. databases 16
  29. save 900 1
  30. save 300 10
  31. save 60 10000
  32. stop-writes-on-bgsave-error yes
  33. rdbcompression yes
  34. rdbchecksum yes
  35. dbfilename dump.rdb
  36. dir /var/lib/redis
  37. slave-serve-stale-data yes
  38. slave-read-only yes
  39. repl-diskless-sync no
  40. repl-diskless-sync-delay 5
  41. repl-disable-tcp-nodelay no
  42. slave-priority 100
  43. appendonly no
  44. appendfilename "appendonly.aof"
  45. appendfsync everysec
  46. no-appendfsync-on-rewrite no
  47. auto-aof-rewrite-percentage 100
  48. auto-aof-rewrite-min-size 64mb
  49. aof-load-truncated yes
  50. lua-time-limit 5000
  51. slowlog-log-slower-than 10000
  52. slowlog-max-len 128
  53. latency-monitor-threshold 0
  54. notify-keyspace-events ""
  55. hash-max-ziplist-entries 512
  56. hash-max-ziplist-value 64
  57. list-max-ziplist-size -2
  58. list-compress-depth 0
  59. set-max-intset-entries 512
  60. zset-max-ziplist-entries 128
  61. zset-max-ziplist-value 64
  62. hll-sparse-max-bytes 3000
  63. activerehashing yes
  64. client-output-buffer-limit normal 0 0 0
  65. client-output-buffer-limit slave 256mb 64mb 60
  66. client-output-buffer-limit pubsub 32mb 8mb 60
  67. hz 10
  68. aof-rewrite-incremental-fsync yes

注意:

1.  redis主从配置只需要在slave上配置slaveof  ip  port(master节点不需要任何配置)

2.  注意防火墙

2.4  jinjia2循环语句

         以nginx做负载均能,代理到后端httpd的基础实验为例,展示基础的for循环使用。

inventory配置如下:

  1. [proxy]
  2. 192.168.194.132
  3. [webserver]
  4. 192.168.194.130
  5. 192.168.194.131
  6. [root@clinet ansible_2]#

 playbook如下:

  1. - hosts: proxy:webserver
  2. gather_facts: yes
  3. pre_tasks:
  4. - name: fireword.server
  5. service:
  6. name: firewalld
  7. state: stopped
  8. enabled: no
  9. post_tasks:
  10. - name: message info
  11. debug:
  12. msg: 'this playbook finished'
  13. tasks:
  14. - name: install & configure ngxin block
  15. block:
  16. - name: install nginx
  17. package:
  18. name: nginx
  19. state: present
  20. - name: configure nginx.conf
  21. template:
  22. src: /root/ansible_test/ansible_2/template/nginx.conf.j2
  23. dest: /etc/nginx/nginx.conf
  24. backup: yes
  25. notify: restart nginx
  26. - name: start ngixn
  27. service:
  28. name: nginx
  29. state: started
  30. enabled: yes
  31. when: ansible_ens33.ipv4.address in groups['proxy']
  32. - name: install & configure httpd block
  33. block:
  34. - name: install httpd
  35. package:
  36. name: httpd
  37. state: present
  38. - name: confgure http.conf
  39. template:
  40. src: /root/ansible_test/ansible_2/template/index.html.j2
  41. dest: /var/www/html/index.html
  42. backup: yes
  43. notify: restart httpd
  44. - name: start httpd
  45. service:
  46. name: httpd
  47. state: started
  48. enabled: yes
  49. when: ansible_ens33.ipv4.address in groups['webserver']
  50. handlers:
  51. - name: restart nginx
  52. service:
  53. name: nginx
  54. state: restarted
  55. - name: restart httpd
  56. service:
  57. name: httpd
  58. state: restarted

 总结一:
上述示例中回顾了以下知识点:

1.  pre_tasks 是在tasks之前执行;而 post_tasks 则在tasks和handlers之后执行;

2.  when关键字,playbook中的条件语句

3.  hosts:  proxy:webserver,ansible的主机匹配规则

4.  block和when的配合使用,对整块block语句做判断。等等

总结二:

jinjia2模板中的语法总结:

1.  变量的使用: {{ 变量名 }}  (不需要用引号包裹,与playbook中的变量使用的主要区别)

2.  条件语句:
     {% if %}  ...  {% elif %} ... {% else %} ... {% endif %}

3.  循环语句:
     {% for %}  ... {% endfor %}
(注意:{%%} 是jinjia2模板的语法格式)

2.5   jinjia2过滤器

2.5.1   default过滤器

         当指定的变量不存在时,用于设定默认值

 示例:

  1. ‐ hosts: test
  2. gather_facts: false
  3. vars:
  4. ‐ path: /tmp/test
  5. mode: 0400
  6. ‐ path: /tmp/foo
  7. ‐ path: /tmp/bar
  8. tasks:
  9. file:
  10. path: {{ item.path }}
  11. state: touch
  12. mode: {{ item.mode|default(omit)}}
  13. with_items: "{{ paths }}"

omit表示系统默认的,也可以default(777),当变量不存在的时候,使用777为值。

2.5.2  字符串操作相关过滤器 

·  upper:将所有字符串转换为大写

·  lower:将所有字符串转换为小写

·  capitalize:将字符串的首字母大写,其他字母小写

·  reverse:将字符串倒序排列

·  first:返回字符串的第一个字符

·  last:返回字符串的最后一个字符

·  trim:将字符串开头和结尾的空格去掉

·  center(30):将字符串放在中间,并且字符串两边用空格补齐30位

·  length:返回字符串的长度,与count等价

·  list:将字符串转换为列表

·  shuffle:list将字符串转换为列表,但是顺序排列,shuffle同样将字符串转换为列表,但是会随 机打乱字符串顺序

  1. ‐ hosts: test
  2. gather_facts: no
  3. vars:
  4. teststr: "abc123ABC"
  5. teststr1: " abc "
  6. teststr2: "123456789"
  7. teststr3: "sfacb1335@#$%"
  8. tasks:
  9. ‐ debug:
  10. msg: "{{ teststr | upper }}"
  11. ‐ debug:
  12. msg: "{{ teststr | lower }}"
  13. ‐ debug:
  14. msg: "{{ teststr | capitalize }}"
  15. ‐ debug:
  16. msg: "{{ teststr | reverse }}"
  17. ‐ debug:
  18. msg: "{{ teststr|first }}"
  19. ‐ debug:
  20. msg: "{{ teststr|last }}"
  21. ‐ debug:
  22. msg: "{{ teststr1 | trim }}"
  23. ‐ debug:
  24. msg: "{{ teststr2 | center(30) }}"
  25. ‐ debug:
  26. msg: "{{ teststr2 | length }}"
  27. ‐ debug:
  28. msg: "{{ teststr3 | list }}"
  29. ‐ debug:
  30. msg: "{{ teststr3 | shuffle }}"

 2.5.3  数字操作相关过滤器

·  int: 将对应的值转换为整数

·  float:将对应的值转换为浮点数

·  abs:获取绝对值

·  round:小数点四舍五入

·  random:从一个给定的范围中获取随机值

  1. ‐ hosts: test
  2. gather_facts: no
  3. vars:
  4. testnum: ‐1
  5. tasks:
  6. ‐ debug:
  7. msg: "{{ 8+('8'|int) }}"
  8. ‐ debug:
  9. # 默认情况下,如果无法完成数字转换则返回0
  10. # 这里指定如果无法完成数字转换则返回6
  11. msg: "{{ 'a'|int(default=6) }}"
  12. ‐ debug:
  13. msg: "{{ '8'|float }}"
  14. ‐ debug:
  15. msg: "{{ 'a'|float(8.88)' }}"
  16. ‐ debug:
  17. msg: "{{ testnum|abs }}"
  18. ‐ debug:
  19. msg: "{{ 12.5|round }}"
  20. ‐ debug:
  21. msg: "{{ 3.1415926 | round(5) }}"
  22. ‐ debug:
  23. # 从0100中随机返回一个数字
  24. msg: "{{ 100|random }}"
  25. ‐ debug:
  26. # 从510中随机返回一个数字
  27. msg: "{{ 10|random(start=5) }}"
  28. ‐ debug:
  29. # 从415中随机返回一个数字,步长为3
  30. # 返回的随机数只可能是:471013中的一个
  31. msg: "{{ 15|random(start=4,step=3) }}"
  32. ‐ debug:
  33. # 从015随机返回一个数字,步长为4
  34. msg: "{{ 15|random(step=4) }}"

2.5.4  列表操作相关过滤器 

·  length: 返回列表长度

·  first:返回列表的第一个值

·  last:返回列表的最后一个值

·  min:返回列表中最小的值

·  max:返回列表中最大的值

·  sort:重新排列列表,默认为升序排列,sort(reverse=true)为降序

·  sum:返回纯数字非嵌套列表中所有数字的和

·  flatten:如果列表中包含列表,则flatten可拉平嵌套的列表,levels参数可用于指定被拉平的层级

·  join:将列表中的元素合并为一个字符串

·  random:从列表中随机返回一个元素

·  shuffle

·  upper

·  lower

·  union:将两个列表合并,如果元素有重复,则只留下一个

·  intersect:获取两个列表的交集

·  difference:获取存在于第一个列表中,但不存在于第二个列表中的元素 ·  symmetric_difference:取出两个列表中各自独立的元素,如果重复则只留一个

2.5.5   应用于文件的过滤器

·  basename:返回文件路径中的文件名部分

·  dirname:返回文件路径中的目录部分

·  expanduser:将文件路径中的~替换为用户目录

·  realpath:处理符号链接后的文件实际路径

2.5.6  应用于注册变量的过滤器 

         正常情况下,当某个task执行失败的时候,ansible会中止运行。此时我们可以通过 ignore_errors 来 捕获异常以让task继续往下执行。然后调用debug模块打印出出错时的内容,拿来错误结果后,主动 失败。

  1. ‐ name: Run myprog
  2. command: /opt/myprog
  3. register: result
  4. ignore_errors: True
  5. ‐ debug:
  6. var: result
  7. ‐ debug:
  8. msg: "Stop running the playbook if myprog failed"
  9. failed_when: result|failed

任务返回值过滤器:

·  failed: 如果注册变量的值是任务failed则返回True

·  changed: 如果注册变量的值是任务changed则返回True

·  success:如果注册变量的值是任务succeeded则返回True

·  skipped:如果注册变量的值是任务skipped则返回True


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/191396
推荐阅读
相关标签
  

闽ICP备14008679号