点击关注公众号,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列表,你可以这样做:
|
item 和 with_items 来使用 Ansible 的 loop,其 item 为预设名,一般情况下不可修改。
使用‘with_items’用于迭代条目类型不仅仅支持简单的字符串列表。如果有一个哈希列表,那么你可以用以下方式来引用子项:
|
注意:如果同时使用 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" |