点击关注公众号,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列表,你可以这样做:
item 和 with_items 来使用 Ansible 的 loop,其 item 为预设名,一般情况下不可修改。 使用‘with_items’用于迭代条目类型不仅仅支持简单的字符串列表。如果有一个哈希列表,那么你可以用以下方式来引用子项:
注意:如果同时使用 when 和 with_items (或其它循环声明), 嵌套循环 循环也可以嵌套: - 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过于臃肿,使用户更关注于整体的架构,而不是实现的细节上。 普通用法 |