点击关注公众号,k8s优秀车间主任及时送达



Playbok中的逻辑控制语句


lwhen:条件判断语句,变成语言中的if

lloop:循环语句,用作编程语言中的而

lblock:把几个任务组成一块代码,针对特定的一组操作的异常处理等操作


When条件语句


Ø条件测试:如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试,通过when语句实现,在task中使用,jinja2的语法格式

Øwhen语句

Ø在task后添加when子句即可使用条件测试;when语句支持jinja2表达式语法

Ø示例:

task:

-  name: “shutdown RedHat flavored system”

  command: /sbin/shutdown -h now

  when: ansible_os_family == “Redhat”







循环语句loop:迭代with_items


Ø迭代:当有需要重复性执行的任务时,可以使用迭代机制

²对迭代项的引用,固定变量名为“item”

²要在task中使用with_items给定要迭代的元素列表

²列表格式:

字符串

字典



- name: add several users

  user: name=\{\{ item \}\} state=present groups=wheel

  with_items:

     - testuser1

     - testuser2





如果你在变量文件中或者’vars’区域定义了一组YML列表,你可以这样做:

vars:
somelist: ["testuser1", "testuser2"]
tasks:
-name: add several user
user: name=\{\{ item \}\} state=present groups=wheel
with_items: "\{\{somelist\}\}"




 item 和 with_items 来使用 Ansible 的 loop,其 item 为预设名,一般情况下不可修改。

使用‘with_items’用于迭代条目类型不仅仅支持简单的字符串列表。如果有一个哈希列表,那么你可以用以下方式来引用子项:

- name: add several users
user: name=\{\{ item.name \}\} state=present groups=\{\{ item.groups \}\}
with_items:
- { name: 'testuser1', groups: 'wheel' }
- { name: 'testuser2', groups: 'root' }



注意:如果同时使用 when 和 with_items (或其它循环声明),​when​​​声明会为每个条目单独执行.请参见 the_when_statement 示例.


嵌套循环

循环也可以嵌套:


- hosts: webservers

  remote_user: root

  tasks:

   - name: add some groups

     group: name={{ itme }} 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’  }




- name: give users access to multiple databases

  mysql_user: name=\{\{ item[0] \}\} priv=\{\{ item[1] \}\}.*:ALL append_privs=yes password=foo

  with_nested:

- [ ‘alice’, ‘bob’ ]

- [ ‘clientdb’, ‘employeedb’, ‘providerd’]



或者

- name: give users access to multiple databases

  mysql_user: name=\{\{ item.0 \}\} priv=\{\{ item.1 \}\}.*:ALL append_privs=yes password=foo

  with_nested:

- [ ‘alice’, ‘bob’ ]

- [ ‘clientdb’, ‘employeedb’, ‘providerd’]







块语句block

多个action组装成块,可以根据不同条件执行一段语句


tasks:

     - block:

         - yum: name=\{\{ item \}\} state=installed

           with_items:

             - httpd

             -  emcached


         - template: src=templates/src.j2 dest=/etc/foo.conf


         - service: name=bar state=started enabled=True


       when: ansible_distribution == ‘CentOS’

       become: true

       become_user: root




组装成块处理异常更方便

tasks:

  - block:

      - debug: msg=’i execute normally’

      - command: /bin/false

      - debug: msg=’i never execute, cause ERROR!’

rescue:

      - debug: msg=’I caught an error’

      - command: /bin/false

      - debug: msg=’I also never execute ‘

always:

      - debug: msg=”this always executes"





roles


Øroles

ansible自1.2版本引入的新特征,用于层次性、结构化地组织playbook。Roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。


Ø复杂场景:建议使用roles,代码复用度高

1.变更指定主机或主机组

2.如命令不规范维护和传承成本大

3.某些功能需多个playbook,通过include即可实现


Ø角色(roles):角色集合

roles/

  mysql/

  httpd/

  nginx/

  memcached/


roles目录结构


Ø每个角色,以特定的层级目录结构进行组织

Øroles目录结构:

playbook.yml

roles/

 project/

   tasks/

   files/

   vars/   不常用

   default/  不常用

   templates/

   handlers/

   meta/   不常用



roles各目录作用


Ø/roles/project/:项目名称,有以下子目录

1.file/:存放由copy或script模块等调用的文件

2.templates/:template模块查找所需要模板文件的目录

3.tasks/:定义task,roles的基本元素,至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行包含

4.handlers/:至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行包含

5.meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其他文件需在此文件中通过include进行包含

6.default/:设定默认变量时使用此目录中的main.yml文件


重要单个playbook文件(include)语句


Include语句的功能,基本的代码重用机制。主要用tasks。同时include可将tasks分割成多个文件,避免playbook过于臃肿,使用户更关注于整体的架构,而不是实现的细节上。


普通用法