1、loop 工具
loop 工具可以存储多个值,利用固定的变量名称item实现执行多次任务的目的
例:
-
vi www.yml
--- - hosts: node1 执行主机对象 tasks: 任务 - user: 模块 name: "{{item}}" 名称,正常是写创建的用户模块,这里使用变量item来调用loop 工具 达到多次循环创建用户的目的,不用创建一个写一个任务那么麻烦 loop: 工具 - zhsan 创建的用户一列写下去即可 - lisi - wangwu # 别的很多的模块也可以按照这个格式这样写 例: --- - hosts: node1 执行主机对象 tasks: 任务 - file: 模块创建文件 state: touch 任务动作 touch文件 dest: /opt/{{item}} 创建的目标 变量前面如果有目录什么的,就不用再双引号了,如果没有双大括号外面在家双引号 loop: 工具 - aaa 创建的文件名称一列列写下去即可 - sss - ddd
-
ansible-playbool www.yml 执行playbook
多次使用变量调用的方法,例如使用loop工具时,不仅要创建用户还要为用户创建密码并加密
---
- hosts
tasks:
- user:
name: "{{item.name}}" 指定名称表示item的什么什么
password: "{{item.pass|password_hash('sha512')}}" 指定密码表示item的什么什么 并使用password_hash指定sha512 去加密
loop"
- {name: zhangsan,pass: "123"} 这里的name、pass 要与上面item后面指定的一样
- {name: lisi,pass: "111"}
- {name: wangwu,pass: "222"}
#item.name/pass 这样个可以根据不同的模块去自己定义内容,但是下面的loop使用时要对应
2、when 工具 判断 可以进行条件测试
举个例子,比如分区需要硬盘,使用when 去测试有没有硬盘
== != > >= < <= in 、 not in、is defined、 is not defined 这些为测试符号
上述条件也可以用and (并且) 、 or(或者) 连在一起使用
---
- hosts: node1
tasks:
- debug:
msg: "ok"
when: ansible_hostname == "node1" 测试这个主机的ansible_hostname 是不是等于 nide1 是的话就执行上面那个debug模块的任务,不是就不执行 调用变量时不用加{{}}
# 执行时如果条件不成立 不会报错 会提示 skipping 跳过 表示失败
---
- hosts: node1
tasks:
- debug:
msg: "ok"
when: "rhel" in ansible_lvm.vgs 表示 rhel有没有在ansible_lvm.vgs里面
#in 、 not in 表示在不在
is defined、 is not defined 表示有没有
可以用or and 连在一起使用
例:when: ansible_memfree_mb > 300 and/or ansible_machine is defined
3、block 工具
rescue 表示救援
always 总是执行
---
- hosts: node1
tasks:
- block: 添加了block之后 将任务加到block里面实现写多个任务,并且下方when 与block对齐,达到同时测试block里面所有任务的需求
- debug:
msg: "aaa"
- debug:
msg: "ok"
when: "rhel" in ansible_lvm.vgs
#这个只是与when配合使用的其中一种方法
---
- hosts: node1
tasks:
- block: 添加了block之后 将任务加到block里面实现写多个任务
- debug:
msg: "aaa"
- debug:
msg: "ok"
rescue: 这个表示救援,表示前面的block如果执行不成功,则执行rescue任务。
- debug:
msg: "no"
always:
- debug: 表示总是执行 不管前面的block、rescue是否执行成功,aloways都会执行。
msg: "222"
# 基本上 block的使用方法就是这几个,需要时可以加上when测试
4、handler 工具 可以单独定义备用任务
- 使用时要在任务模块后面加上notify 来触发任务,需要调用
- 定义备用任务时的名称name
- 仅仅在任务是changed状态才会触发
---
- hosts: node1
tasks:
- file:
name: /opt/asd
state: directory 创建目录
notify: testo1 调用了一个handler任务 调用的任务名要与handler定义的任务名称一致。
handlers: 定义handler任务
- name: test01 定义任务名字test01
debug: 让test01 使用debug
msg: "hand"
# 同一个playbook执行两次之后第二次就不会在执行notify、handler任务,因为上面已经执行过一次了。要么同时一起执行任务,要么都不执行,取决于上方第一个任务是否执行过。
5、mount挂载模块
- mount 模块挂载
- path 需要挂载到哪里
- src 挂载谁 (源路径)
- fstype 文件系统类型
- state 动作 present挂载 mounted 永久挂载
6、cron 计划任务模块
- name 名字
- minute 分钟
- hour 小时 (其他的没写就默认是 * )
- job 执行内容
- user 指定用户
---
- hosts: a
tasks:
- cron:
name: "dasda asda" (有空格需要加引号) (可不写此行)
minute: "0"
hour: "5,2"
job: "ls -alh > /dev/null"
user: alice (不写就默认给root执行任务)
# 给alice用户每天的5点2点 执行一次 这个命令"ls -alh > /dev/null"
- ansible a -m shell -a 'crontab -l -u alice' 查看计划任务 -u 表示指定查看哪个用户