1,templates 使用规则
- 文本文件,嵌套有脚本(使用模板编程语言编写)
- Jinja2 语言,使用字面量,有下面形式
- 字符串:使用单引号或双引号
- 数字:整数,浮点数
- 列表:
[item1,item2,...]
- 元组:
(item1,item2,....)
- 字典:
{key1:value1,key2:value2,...}
- 布尔型:true/false
- 算术运算:
+ , - , * , / , // , % , **
- 比较操作:
==, != , > , >= , <
- 逻辑运算:
and, or, not
- 流表达式:
For if When
2, when
- 条件测试:如果需要根据变量、facts 或此前任务的执行结果来做为某 task 执行与否的前提时要用到条件测试,通过 when 语句实现,在 task 中使用,jinja2 的语法格式
- when 语句
- 在 task 后添加 when 子句即可使用条件测试;when 语句支持 jinja2 表达式语法
- 示例
- name: "shutdown RedHat flavored systems" command: /sbin/shutdown -h now when: ansible_os_family == "RedHat"
- 示例2:如果操作系统版本为 centos7 或 6,copy 对应文件
---- hosts: websrvs remote_user: root tasks: - name: add user nginx user: name=nginx state=present group=nginx - name: Install Nginx yum: name=nginx state=present - name: copy conf file to centos7 template: src=nginx.conf.c7.j2 dest=/etc/nginx/nginx.conf when: ansible_distribution_major_version == "7" - name: copy conf file to centos6 template: src=nginx.conf.c6.j2 dest=/etc/nginx/nginx.conf when: ansible_distribution_major_version == "6" - name: start Nginx service: name=nginx state=started enabled=ture
3, 迭代:with_items
- 迭代:当有需要重复执行的任务时,可以使用迭代机制
- 对迭代项的引用,固定变量名为
item
- 要在 task 中使用
with_items
给定要迭代的元素列表 - 列表格式:
- 示例
---- hosts: websrvs remote_user: root tasks: - name: create some files file: name=/tmp/{ { item }} state=touch with_items: - file1 - file2 - file3
---- 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' }
4,Playbook 中 template for if
{% for vhost in nginx_vhosts %}server{ listen { { vhost.listen | default('80 default_server') }}; {% if vhost.server_name is defined %} server_name { { vhost.server_name }}; {% endif %}; {% if vhost.root is defined %} root { { vhost.root }}; {% endif %}}{% endfor %}
4.1 for 示例
// testfor1.yml---- hosts: websrvs remote_user: root vars: ports: - 81 - 82 tasks: - name: copy conf template: src=for1.conf.j2 dest=/tmp/for1.conf
// templates/for1.conf.j2{% for port in ports %}server { listen { { port }}}{% endfor %}
// 执行结果server { listen 81}server { listen 82}
// testfor2.yml---- hosts: websrvs remote_user: root vars: ports: - listen_port: 83 - listen_port: 84 tasks: - name: copy conf template: src=for1.conf.j2 dest=/tmp/for2.conf
// templates/for2.conf.j2{% for port in ports %}server { listen { { port.listen_port }}}{% endfor %}
// 执行结果server { listen 83}server { listen 84}
// testfor3.yml---- hosts: websrvs remote_user: root vars: ports: - web1: port: 85 name: web1.test.com rootdir: /data/website1 - web2: port: 86 name: web2.test.com rootdir: /data/website2 tasks: - name: copy conf template: src=for3.conf.j2 dest=/tmp/for3.conf
// templates/for3.conf.j2{% for i in ports %}server { listen { { i.port }} servername: { { i.name }} documentroot: { { i.rootdir }}}{% endfor %}
// 执行结果server { listen 85 servername: web1.test.com documentroot: /data/website1}server { listen 86 servername: web2.test.com documentroot: /data/website2}
4.1 if 示例
// testfor4.yml---- hosts: websrvs remote_user: root vars: ports: - web1: port: 85 name: web1.test.com rootdir: /data/website1 - web2: port: 86 # name: web2.test.com rootdir: /data/website2 tasks: - name: copy conf template: src=for4.conf.j2 dest=/tmp/for4.conf
// templates/for4.conf.j2{% for i in ports %}server { listen { { i.port }} {% if i.name is defined %} servername: { { i.name }} {% endif %} documentroot: { { i.rootdir }}}{% endfor %}
// 执行结果server { listen 85 servername: web1.test.com documentroot: /data/website1}server { listen 86 documentroot: /data/website2}