系列文章目录
第一章 ansible入门
第二章 ansible变量
第三章 ansible剧本
前言
为了写出更强大的剧本文件,因此需要学习接入更多的ansible高阶模块用法,使自己写的自动化运维工具不再单一,技术得到提升。
一、register 注册模块
tasks:
- name: get variable
command: echo "{{name}}{{id}}.{{domain}}"
register: result #将上述command执行的结果注册到临时变量result中
- name: print variable
debug: #使用debug模块进行显示输出
msg: "{{result.stdout}}" #此处通过result.stdout将上述结果进行输出
二、when条件
tasks:
- name: get variable
command: /sbin/shutdown -h now
when: ansible_os_family == "RedHat" #当系统是RedHat时执行关机操作
when高级条件使用见引用文件包含
(exists、not exists、defined、undefined、none、success、failure、change、skip)
https://blog.csdn.net/weixin_43384009/article/details/105212822?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1-105212822-blog-109605435.pc_relevant_multi_platform_whitelistv1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1-105212822-blog-109605435.pc_relevant_multi_platform_whitelistv1&utm_relevant_index=2
三、循环模块
with_items示例:
- name: copy rpm package
copy:
src: '{{ item.src }}'
dest: '{{ item.dest }}'
with_items:
- { src: '{{src_dir }}',dest: '{{ dest_dir}}'}
loop示例:
- name: Execute Script and add 7005 7006 port
shell: '{{ create_port_sh }} {{ item }}'
loop:
- '7005 yes'
- '7006 yes'
when: ansible_hosts == 'Redis03'
四、触发器notify
- name: add file
lineinfile:
path: '{{ redis_conf }}'
line: '{{ item }}'
insertafter: 'AFTER THIS FILE'
state: present
with_items:
- 'requirepass {{ redis_passwd}}'
- 'masterauth {{redis_passwd}}' #设定redis密码并将密码添加到redis.conf配置文件的末尾
notify: #写入完成后,触发器执行开始,分布重启3个节点中的redis notify要与handler遥相呼应
- restart redis service 7001
- restart redis service 7002
- restart redis service 7003
- restart redis service 7004
- restart redis service 7005
- restart redis service 7006
在handler目录中实现触发器功能
---
#7001
- name: restart redis service 7001 #此处必须与notify呼应
shell: '{{ service_port_7001}} {{item}}'
loop:
- restart
when: ansible_hosts == 'Redis01'
- name: check redis 7001 if already started
shell: "netstat -antp | grep 7001 | awk 'NR==1' | awk -F':' '{print $2}' | awk '{print $1}'"
register: port #将上述shell执行结果注册到port变量中
until: port == '7001' #当port等于7001时代表执行成功
retries: 2 #重试次数,与 until 配合适用
delay: 5 #延迟的秒数
ignore_errors: true # true 将会忽略任务失败使下面的任务继续运行 反之则停止
....
五、tags
在playbook可以为某个或某些任务定义一个“标签”,在执行playbook的时候,
可以通过ansible-playbook 使用--tags选项,实现仅允许指定的tags
示例:
- name: install configuration file for httpd
templete: src=/root/templates/httpd.conf.js dest=/etc/httpd/conf/httpd.conf
tags:
- conf
执行指定的tags
ansible-playbook --tags="conf" ./tag_test.yml #有多个tags则使用--tags="conf,xx" 逗号分隔
排除tags
--skip-tags 执行除 --skip-tags 标签之外的所有任务
查看yml中所有的tags
ansible-playbook install_httpd.yml --list-tags
六、assert模块
检查所有主机是否都可以连接到指定的主机组
- hosts: graylogHost #主机组
pre_tasks: #在运行 roles 部分之前需要执行的一些任务,例如检查所有主机是否都可以连接到 graylogHost 主机。
- name: Check ALL hosts are reacheable before doing the release
assert: #这个模块用于进行断言判断。
that: #这个参数传递一个 True 或 False 的条件表达式,用于测试条件是否成立
- ansible_play_hosts == groups.graylogHost #判断Ansible内置变量是否等于主机组
fail_msg: 1 or more host is UNREACHABLE #如果检测到有一个或多个主机无法连接,则会输出此失败消息
success_msg: ALL hosts are REACHABLE, go on #如果所有主机都能连接,则会输出此成功消息
run_once: yes #这个参数表示只在第一个主机上运行此任务列表。
roles:
- graylog
七、facts组件
facts组件是Ansible用于采集被管理机器设备信息的一个功能。
gathering:facts的开关,默认是开启的;有以下三个取值:
smart:开启facts信息收集,但是会优先使用facts缓存信息,可以使用gather_facts: False禁用facts收集;
implicit:开启facts信息收集,要禁止收集,必须使用gather_facts: False;
explicit:关闭facts信息收集,要显式收集,必须使用gather_facts: Ture。
fact_caching:缓存facts信息的方式;可以配置成jsonfile或者redis;
fact_caching_connection:缓存插件的配置,针对不同的fact_caching方式,取值含义则不同:
如果fact_caching为jsonfile,则此处应配置存储缓存文件的目录;
如果fact_caching为redis,则此处应按照host:port:database的格式配置redis的信息。
gather_timeout:收集超时时间,默认为86400;
fact_caching_timeout:设置facts缓存的过期时间,默认是86400
切记:当gather_facts: Ture 整个yml文件执行会很慢
八、debug模块
- name: 输出变量的值
debug:
var: my_variable- name: 输出任务执行结果
debug:
msg: "任务执行成功"- name: 输出复杂变量的特定属性
debug:
var: my_dict.my_key- name: 输出循环中的每个项
debug:
msg: "当前项是 {{ item }}"
loop:
- item1
- item2
- item3
debug:
msg: "debug message"
verbosity: 2
shell: "grep pattern file.txt | head -1"
register: result
debug:
var: result.stdout
在上面的示例中,我们使用debug模块输出了不同类型的调试信息。
1、可以使用var参数来输出变量的值
2、使用msg参数来输出自定义消息
3、还可以使用loop参数在循环中输出每个项的值
4、使用verbosity参数可以指定输出的调试级别 【0:输出所有调试信息(默认)1:不输出变量值等详细信息 2:只输出关键信息 3:只输出指定的信息】
5、在第一个任务中,使用shell模块执行命令,并将命令的输出注册为一个新的变量result。然后在第二个任务中,使用Debug模块输出result.stdout变量的值