3.4自动化作业任务的实现——Ansible
Playbook
playbook时ansible实现自动化任务的二重要组成部分,采用YAML语言定义。playbook主要通过YAML定
义,将多个单一的模块功能串联起来,形成完整的自动化批处理能力
3.4.1Playbook示例
下面使用playbook安装Nginx服务器的示例
-name:demo hosts:all gather_facts;false tasks: -name:Install /Update nginx server yum: -pkg:nginx state:laste -name: Config nginx server dest: /etc/nginx/con.d/ -name: start nginx service -service: name: nginx enable: yes state:started
3.4.2常用的playbook结构
playbook可以由四大部分任意结构组成
目标定义块:(target section)简要执行playbook的被管理节点组及信息
变量定义块:(variable section)playbook运行是需要使用的变量
任务定义块:(task section)将要在被管理节点上执行的任务列表
触发器定义块:(handler section)task执行完成后需要调用的任务
1.目标定义模块target section
target section 主要用于存放playbook所属任务的目标及其相关的信息
2.任务定义模块task section
3.触发器定义模块handler section
4.变量定义模块variable section
notify、meta、listen
3.4.3变量的使用
ansible使用变量来管理不同系统之间的差异,也就是说不同的节点即使变量名相同,获得的结果也不同,
1.有效的变量名
ansible的变量名只能包含字母,数字,下划线,且变量名不能以数字开头。ansible中下划线开头的变量名
和其他变量完全是相同的,不要把别的编程语言中下划线的变量为私有变量是不能ansible中变量的概念混为
一谈。
2.定义变量
在playbook中定义变量
--- - hosts: web gather_facts:false('fact') vars: http_port:80 ssh_port:60002 vars_files: - ./vars/etxernal_vars.yml (把一些信息放在这个文件中;避免账号信息泄露) tasks: ......
3.在命令行中定义
在命令行下可以使用--extra-vars或-e。使用ansible命令传递变量时,可接受json字符串或key=value键值对
key=value键值对: ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo" JSON字符串格式: ansible-playbook 文件名.yml -e '{"version":"1.23.45"," other_varible":"foo"}'
4.引用变量
可以使用{{variable_name}}的方式实现对变量的引用
{{ result_stdout }}
5.特殊的系统变量——fact
与远程系统信息相关的变量在ansible中统称为fact
效率低收集时间长
6.变量调节的先后顺序
场景编号越大,被覆盖的优先级就越小,为了节省篇幅就不再重复
3.4.4条件语句
条件判断:when
when: {{ansible_os_family}} == "Centos"
3.4.5循环控制
ansible playbook中可使用多种循环控制的方法
1.常见的方法
- name: add serveral users user: name={{ itme }} state=present groups=wheel with_item: - testuser1 - testuser2
2.用hash表做循环变量
--- - name: add serveral users user: item.name state=present groups={{ item.groups }} with_items: - { name:'testuser1',groups:'wheel'} - { name:'testuser2',groups:'root'}
3.把变量名作为变量循环
-` hosts: all tasks: - file: dest=/etc/fooapp state=directory - copy: src={{ item }} dest=/etc/fooapp/ owner=root mode=600 with_fileglob: - /playbooks/files/fooapp/*
4.复合变量循环
变量格式如下:
--- - alpha: [ "a","b","c","d","g" ] numbers: [ 1,2,2,3 ]
如下方式执行循环逻辑
--- - tasks: - debug: msg="{{ item.0 }} and {{ item.1 }}" with_togethe: - alpha - numbers
5.步进变量循环
循环的变量为整型,如i=0;i<100;i++这种情况
6.随机变量循环
7.Do-Until类型的循环
3.4.6include语法
将一个完整的任务放在单一的playbook文件中会导致文件长度过大
简单的include用法: --- - tasks: - inculde:tasks/foo.yaml - tasks: - include: a.yaml user=timmy - include: b.yaml user=alice - include: c.yaml user=bob
3.4.7ansible-playbook的角色roles
2.调用roles
在playbook中有三种方式实现roles的调用
在整个任务编排文件中直接使用关键字roles调用角色roles,这种方式是最经典的角色roles调用方
在tasks中使用关键字include——role动态调用角色roles
在tasks中使用关键字import_role静态调用角色roles
3.调用roles例子
--- - hosts:all roles: - common - webservers
4.使用include_role关键字调用角色roles
--- - hosts: all tasks: - name: Include the some_role role include_role: name: some_role when: "ansible_facts['os_family'] == 'Redhat'"
5.使用import_role关键字调用角色roles
--- - hosts: all tasks: - name: Print a message ansible.builtin.debug: msg: "before we run our role" - name: Import the example role import_role: name: example - name: Print a message ansible.builtin.debug: msg: "after we run our role"
3.5 密钥管理方案——ansible-vault
在开发playbook的过程中很容易导致敏感数据的暴露,为了解决这个问题,ansible提供了命令行工具
ansible-vault来对数据文件进行加解密
#创建加密文件 ansible-vault encrypt secrets.yml 没有文件在创建一个文件 ansible-vault create secrets.yml 创建 ansible-vault rekey secrets.yml 修改密码 ansible-vault edit secrets.yml 编辑加密文件 ansible-vault decrypt secrets.yml ansible-vault view secrets.yml
执行playbook时,仅需要针对ansible-playbook命令添加--ask-vault-pass或--vault-password
file<file_name参数playbook及针对ansibe-valut命令进行自动解密
3.6使用ansibel的API
#!/usr/bin/python import ansibel.runner import sys results = ansibel.runner.Runner( pattern='*',forks=10, module_name='command',module_args='/usr/bin/uptime', ).run() if results is None: print "No hosts found" sys.exit(1) for (hostsname, result) in results['contacted'].items(): if not 'failed' in result: print "%s >>> %s" % (hostsname, result['stdout'])
优点和缺点ansible
优点
1.部署成本低:
部署成本极低,不需要被管理的目标主机安装Agent是一件十分惬意的事情
2.没有agent跟新问题:
没有Agent更新的问题,正因为Ansible是无Agent的集中化运维软件,所以他也就没有Agent更新的问题,极
大简化了Agent维护成本
3.学习成本低:
ansible的操作方式中大量现成的模块减少了我们不少工作量,命令式的操作思路与常规的命令行操作思路十
分类似,让使用者非常容易接受
4.完备的模块:
拥有许多现成的模块,涵盖了许多日常运维所需要的功能
缺点
目标主机需要python解释器,ansible之所以会有raw这个ssh模块,就是为了使用ansible操作主机目标时,
目标主机缺少相应的python模块。在日常接触的操作系统中,我们运维的AIX系统和Ubuntu系统默认没有安
装python环境,更别说其他python模块了。
4.1ansible在自动化运维中的应用
4.1.1ansible_fact缓存
ansible_fact这个特殊的变量主要用于内存中保存远程被管理节点中的服务器信息数据;每次使用playbook
执行任务都要收集一次被管理节点的信息数据就显得低效无意义,使用fact的缓存设置将这些信息和数据保
存下来
jsonfile:以JSON格式将fact数据缓存到文件中
mongodb:将fact 数据缓存到MongoDB
redis 将fact数据缓存到Redis中
yaml:以YAML格式将fact数据缓存到文件中
1.配置JSON缓存
memory: 将fact保存在内存中,默认方式
pickle:以Pickle格式将fact数据缓存到文件中
memcached:将fact数据缓存到memcached DB中
[defaults] fact_caching=josnfile fact_caching_connection=~/fact_caching/
2.配置Redis缓存
[defaults] fact_caching=redis fact_caching_connection=localhost:6379 #需要配置一个以 : 分隔用于连接信息的字符串格式为 [:] [:] fact_caching_timeout=86400 #是指缓存数据的失效时间,单位时秒
3.配置MongoDB缓存
[defaults] fact_caching=mongodb fact_caching_connection=mongodb://mongodb0.example.com:27017
4.1.2ansible_fact信息模板
4.1.3载入fact
4.1.4set_fact的使用
在运维任务中,常常希望把一些采集到的数据变量像fact一样被保存下来,便于我们跨playbook使用
- name: setting facts so that will be persisted in the fact cache #设置facts,以便将其 保存在事实缓存中 set_fact: one_fact: something other_fact: "{{ local_var * 2}}" cacheable: yes
4.1.5 自定义module
ansible支持自己编写收集fact功能的模块,ansible自定义module中的一个特殊的自定义开发模块,ansible
默认提供了一个使用python语言开发的module模板
时序指标路线
保存在事实缓存中
事件分析路线
引入事件管理模块:将事件的警告、CEP(复杂事件处理)所得到的信息全部转储到事件索引中,并且对事
件进行结构化处理,提取出对象名称,创建时间,事件信息等关键字段。
日志数据格式化阶段,引入日志分类的能力,在可视化配置日志解析规则的时候,能够提示此类日志使用哪
种正则表达式或者Grok表达式进行格式化,降低数据格式化规则的配置难度。
workbook.add_chartsheet(typr=" ")