本节内容:html
当有须要重复性执行的任务时,可使用迭代机制。其使用格式为将须要迭代的内容定义为item变量引用,并经过with_items语句来指明迭代的元素列表便可。例如:node
- name: add several users user: name={{ item }} state=present groups=wheel with_items: - testuser1 - testuser2
上面语句的功能等同于下面的语句:nginx
- 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,例如:web
- name: add several users user: name={{ item.name }} state=present groups={{ item.groups }} with_items: - { name: 'testuser1', groups: 'wheel'} - { name: 'testuser2', groups: 'root'}
【注意】:item是固定变量名。apache
假如为两台webserver安装httpd,而他们的配置文件,172.16.7.152上的httpd须要监听80端口,172.16.7.153须要监听8080端口,ServerName也是不同的,因此咱们就须要两个配置文件,这管理起来极为不便。vim
在这种状况下,咱们能够考虑在配置文件中使用变量来定义。函数
[root@node1 ~]# mkdir templates [root@node1 ~]# cp conf/httpd.conf templates/ [root@node1 ~]# mv templates/httpd.conf templates/httpd.conf.j2
后缀为j2代表是Jinja2模板。编辑这个模板:spa
[root@node1 ~]# vim templates/httpd.conf.j2
这个模板复制到每台主机上时都应该将这文件里的变量换成对应的值。这个模板就是Jinjia2模板。rest
设置每台主机使用的变量值:code
[root@node1 ~]# vim /etc/ansible/hosts
固然这http_port和maxClients也能够在playbook中定义。可是那样咱们无法区别每台主机使用不一样的值了。所以咱们要想让每一个主机变量名相同但值不一样时只能使用主机变量来定义。下面定义playbook:
[root@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
[root@node1 ~]# ansible-playbook apache.yml
执行完成后,去查看两个节点的配置文件,发生变量都被替换了。
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。