自动化利器 Ansible - 从了解到应用( 八 )

changed_when  与 failed_when
# changed_when# 在条件成立时,将对应任务的执行状态设置为changed# 先执行task,并对task返回的值进行判断,当满足changed_when指定的条件时说明是执行成功的# 默认情况下执行命令完成的主机状态都为changed- name: all host run this taskshell: hostnameregister: infochanged_when: '"webserver01" in info.stdout'# 输出包含某个特定字符才能将主机状态设为changed# failed_when# 在条件成立时,将对应任务的执行状态设置为失败# 当执行失败后会将信息存在register的stderr中,通过判断指定的字符是否在stderr中来确定是否真的失败# 其实是ansible的一种错误处理机制:由fail模块组合了when条件语句的效果- name: this command prints FAILED when it failscommand: echo "FAILED"register: command_resultfailed_when: "'FAILED' in command_result.stdout"Ansible Playbook 循环迭代(with_items)用来在playbook中实现循环迭代的功能 。支持元素列表、文件名(with_fileglob)、复合(with_together)、步进(with_sequence)、随机(with_random_choice)、until等多种类型循环 。
- name: test with_itemshosts: taremote_user: vipxfgather_facts: yestasks:- name: test1shell: echo {{ item }}# 通过引用item变量来迭代with_items:- one- two- three- name: test2shell: echo {{ item.name }} with {{ item.value }}# 通过字典来迭代with_items:- { name: 'one', value: '111'}- { name: 'two', value: '222'}- { name: 'three', value: '333'}- name: test3copy: src=https://www.huyubaike.com/biancheng/{{ item }} dest=~/ mode=664 owner=vipxf group=vipxf# 把文件名作为变量循环with_fileglob:- /playbook/files/*Ansible Playbook 角色(Roles)

  • 角色(roles)用于层次性、结构化地组织playbook
  • 通过规范的目录存储结构将变量、文件、任务、模板以及触发器等放置于单独目录
  • 通过独立的role目录将不同的playbook任务单一化,从而实现高效的代码复用
  • 在playbook中调用roles,根据层次型结构自动转载roles的变量文件、tasks以及handlers等要素信息
  • 一般用于基于主机构建服务和进程的场景
  • 可以在 /etc/ansible/ansible.cfg 中设置 roles_path 来设置roles文件路径
创建role
1. 创建 roles 名称的目录2. 在 roles 目录中分别创建各角色命名的目录 , 如webserver等3. 在每个角色命名的目录中分别创建defaults、files、handlers、meta、tasks、templates和vars等目录;如果为空目录则不被引用4. 在roles的整体编排文件playbook中调用各角色目录结构说明
site.yml# playbook文件 , roles的整体编排文件roles/# 定义各角色的总目录common/# 角色role模块名,在playbook中需要调用时使用的名称default/# 默认变量文件目录(定义此角色的默认变量),至少包含一个main.yml文件 , 在main.yml文件中可以用include指令将其他yml文件包含进来files/# 存放由copy或script等模块调用的文件handlers/# 触发器文件目录,至少包含一个main.yml文件,在main.yml文件中可以用include指令将其他yml文件包含进来meta/# 此角色的元数据(特殊设定及其依赖关系) , 至少包含一个main.yml文件,在main.yml文件中可以用include指令将其他yml文件包含进来tasks/# 任务文件目录,至少包含一个main.yml文件,在main.yml文件中可以用include指令将其他yml文件包含进来templates/# 模板文件目录,template模块会自动在此目录中寻找vars/# 变量文件目录 , 至少包含一个main.yml文件,在main.yml文件中可以用include指令将其他yml文件包含进来webserver/# 角色 webserver 目录default/files/handlers/meta/tasks/templates/vars/调用方式在playbook中可以通过关键字 roles 来调用角色role 。
- hosts: webserverremote_user: anlivenroles:# 使用关键字roles调用角色role- common# 调用role- webserver# 调研多个role- hosts: webserverremote_user: anlivenroles:- common- { role: foo_app_instance, dir:'/opt/a',port:5000}# 可以向roles传递参数- { role: foo_app_instance, dir:'/opt/b',port:5001}- hosts:webserverremote_user: anlivenroles:- { role: some_role, when: "ansible_so_family == 'RedHat" } # 指定调用roles的条件Ansible Playbook 标签(Tags)
  • 通过标签(tags)可以选择运行或跳过playbook中的指定任务
  • 在playbook为任务定义一个"标签",在通过ansible-playbook命令执行此playbook时使用 --tags 或 --skip-tags选项选择运行或跳过这个任务
  • 可以使用系统特殊标签 , 也可以自定义标签
  • 可以为同一个任务设定多个标签,也可以为不同的任务设定相同的标签
语法格式
# 格式1tags: - testtag - t2# 格式2tags: testtag,t2# 格式3tags: ['testtag','t2']

推荐阅读