设为首页 收藏本站
查看: 1072|回复: 0

[经验分享] Ansible之迭代、模板

[复制链接]

尚未签到

发表于 2018-1-2 21:39:19 | 显示全部楼层 |阅读模式
  本节内容:


  • 迭代
  • 模板(JInjia2相关)
  • Jinja2相关

一、迭代
  当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句来指明迭代的元素列表即可。例如:
  

- name: add several users  
user: name
={{ item }} state=present groups=wheel  
with_items:
  

- testuser1  

- testuser2  

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

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

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

  另外,with_items中使用的元素还可以是hashes,例如:
  

- name: add several users  
user: name
={{ item.name }} state=present groups={{ item.groups }}  
with_items:
  

- { name: 'testuser1', groups: 'wheel'}  

- { name: 'testuser2', groups: 'root'}  

  【注意】:item是固定变量名。

二、模板(JInjia2相关)
  假如为两台webserver安装httpd,而他们的配置文件,172.16.7.152上的httpd需要监听80端口,172.16.7.153需要监听8080端口,ServerName也是不一样的,所以我们就需要两个配置文件,这管理起来极为不便。
  在这种情况下,我们可以考虑在配置文件中使用变量来定义。
  

[iyunv@node1 ~]# mkdir templates  
[iyunv@node1
~]# cp conf/httpd.conf templates/  
[iyunv@node1
~]# mv templates/httpd.conf templates/httpd.conf.j2  

  后缀为j2表明是Jinja2模板。编辑这个模板:
  

[iyunv@node1 ~]# vim templates/httpd.conf.j2  

DSC0000.png

DSC0001.png

  这个模板复制到每台主机上时都应该将这文件里的变量换成对应的值。这个模板就是Jinjia2模板。
  设置每台主机使用的变量值:
  

[iyunv@node1 ~]# vim /etc/ansible/hosts  

DSC0002.png

  当然这http_port和maxClients也可以在playbook中定义。但是那样我们没法区别每台主机使用不同的值了。因此我们要想让每个主机变量名相同但值不同时只能使用主机变量来定义。下面定义playbook:
  

[iyunv@node1 ~]# vim apache.yml  

- hosts: nginx  
remote_user: root
  
vars:
  

- package: apache  
tasks:
  

- name: install httpd package  

yum: name={{ package }} state=latest  

- name: install configuration file for httpd  
template: src
=/root/conf/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf  
notify:
  

- restart httpd  

- name: start httpd service  
service: enabled
=true name=httpd state=started  
handlers:
  

- name: restart httpd  
service: name
=httpd state=restarted  

DSC0003.png

  

[iyunv@node1 ~]# ansible-playbook apache.yml   

  执行完成后,去查看两个节点的配置文件,发生变量都被替换了。

三、Jinja2相关
  1. 字面量
  表达式最简单的形式就是字面量。字面量表示诸如字符串和数值的Python对象。下面的字面量是可用的:
  (1)字符串:“Hello World”
  双引号或单引号中间的一切都是字符串,无论何时你需要在模板中使用一个字符串(比如函数引用、过滤器或只是包含或继承一个模板的参数),它们都是有用的。
  (2)整数和浮点数:42 / 42.23
  直接写下数值就可以创建整数和浮点数。如果有小数点,则为浮点数,否则为整数。在Python里,42和42.0是不一样的。
  (3)列表:['list', 'of', 'object']
  一对中括号括起来的东西是一个列表。列表用于存储和迭代序列化的数据。例如你可以容易地在for循环中用列表和元组创建一个链接的列表:
  

<ul>  
{
% for href, caption in [('index.html', 'Index'), ('about.html', 'About'), ('download.html', 'Downloads')] %}  

<li><a href="{{ href }}">{{ caption }}</a></li>  
{
% end for %}  

</ul>  

  (4)元组:('tuple', 'of', 'values')
  元组和列表类似,只是不能修改里面的元素。如果元组中只有一项,你需要使用逗号结尾它。元组通常用于表示两个或更多元素的项。
  (5)字典:{'dict': 'of', 'key': 'and', 'value': 'pairs'}
  Python中的字典是一种关联键和值的结构。键必须是唯一的,并且键必须只有一个值。
  (6)Boolen:true / false
  2. 算术运算
  Jinja2允许你用计算值。这在模板中很少使用,但为了完整性允许其存在,支持下面的运算符:
  

+ 把两个对象加到一起,通常对象是整数或浮点数,但是如果两者是字符串或列表,你可以用这种方式来连接它们。无论如何这不是首选的连接字符串的方式。{{ 1 + 1 }}等于2。  

  

- 用第一个数减去第二个数,{{ 3 - 2 }}等于1.  

  

/ 对两个数做除法,返回值会是一个浮点数。{{ 1 / 2 }}等于{{ 0.5 }}。  

  

// 对两个手做除法,返回整数商,{{ 20 / 7 }}等于2。  

  
% 计算整数除法的余数。{{  11 % 7 }}等于4。
  

  
* 用右边的数乘左边的操作数。{{ 2 * 2 }}会返回4,也可以用于重复一个字符串多次,{{ '=' * 80 }}会打印80个等号的横条。
  

  
** 取左操作数的右操作数次幂,{{ 2**3 }}会返回8。
  

  3. 比较操作符
  

== 比较两个对象是否相等。  

!= 比较两个对象是否不等。  

> 如果左边大于右边,返回true。  

< 如果左边小于右边,返回true。  

>= 如果左边大于等于右边,返回true。  

<= 如果左边小于等于右边,返回true。  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-430953-1-1.html 上篇帖子: Ansible常见问题处理 下篇帖子: ansible 番外篇之流程控制
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表