0
点赞
收藏
分享

微信扫一扫

Ansible高级进阶-role详解等

七千22 2022-03-12 阅读 63


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


Playbok中的逻辑控制语句



  • when:条件判断语句,变成语言中的if
  • loop:循环语句,用作编程语言中的而
  • block:把几个任务组成一块代码,针对特定的一组操作的异常处理等操作


When条件语句



  • 条件测试:如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试,通过when语句实现,在task中使用,jinja2的语法格式
  • when语句
  • 在task后添加when子句即可使用条件测试;when语句支持jinja2表达式语法
  • 示例:


task:

-  name: “shutdownRedHat 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 multipledatabases

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

 with_nested:

- [ ‘alice’, ‘bob’]

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

或者


- name: give users access to multipledatabases

 mysql_user: name=\{\{ item.0 \}\} priv=\{\{ item.1 \}\}.*:ALLappend_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,代码复用度高
  • 变更指定主机或主机组
  • 如命令不规范维护和传承成本大
  • 某些功能需多个playbook,通过include即可实现


  • 角色(roles):角色集合

roles/

  mysql/

  httpd/

  nginx/

  memcached/


roles目录结构



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

playbook.yml

roles/

 project/

   tasks/

   files/

   vars/  不常用

   default/ 不常用

   templates/

   handlers/

   meta/  不常用



roles各目录作用



  • /roles/project/:项目名称,有以下子目录
  • file/:存放由copy或script模块等调用的文件
  • templates/:template模块查找所需要模板文件的目录
  • tasks/:定义task,roles的基本元素,至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行包含
  • handlers/:至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行包含
  • meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其他文件需在此文件中通过include进行包含
  • default/:设定默认变量时使用此目录中的main.yml文件


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


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


普通用法


---

- hosts: test70

  remote_user: root

  gather_facts: no

  tasks:

  - file:

     path: /opt/ttt

     state: touch

    notify: test include handlers


  handlers:

  - name: test include handlers

    include: include_handler.yml


# cat include_handler.yml

- debug:

    msg: "task1 of handlers"

- debug:

    msg: "task2 of handlers"

- debug:

    msg: "task3 of handlers"




举报

相关推荐

3. Ansible Role

Ansible 进阶

ansible剧本进阶

ansible详解

0 条评论