Ansible剧本流程控制 |
您所在的位置:网站首页 › ansible使用手册 › Ansible剧本流程控制 |
handlers触发器
notify:监控上面的模块执行是否发生变化 chufa:自定义的任务名称,自动去handlers里面匹配相对应的任务名称执行动作 下方是copy了/data/copy/下的文件到server2组里的主机/data/monster/handlers/下,notify监控发生了变化后触发chufa任务。 - hosts: server2 gather_facts: no tasks: - name: handlers触发器demo copy: src: /data/copy/ dest: /data/monster/handlers/ notify: - chufa handlers: - name: chufa shell: 'date >> /data/monster/handlers/time.log' [root@monster2 handlers]# cat /data/monster/handlers/time.log Wed Dec 28 17:20:15 EST 2022 [root@monster2 handlers]# when条件下面剧本是所有主机里面,主机名叫monster2或monster3的就删除handlers目录 gather_facts需要设置开启或者直接不写这一行默认是开启,因为需要使用内置变量ansible_hostname验证主机名 如果只判断一台主机可以直接ansible_hostname == “monster2” - hosts: all gather_facts: yes tasks: - name: when使用 shell: rm -rf /data/monster/handlers when: (ansible_hostname is match ("monster2|monster3"))警告无视就行,它建议不要直接使用rm删除,通过文件模块用state=absent的方式 下面可以看见,138(mosnter2),139(mosnter3)两台主机都执行成功了,但是只有只有138有修改状态,因为monster3上面没有这个目录,skipped跳过。 删除所有/data/monster/下的monster.log 和monster.yml文件,变量名默认item没有s,with_items里面的变量全匹配后任务才执行完 - hosts: all gather_facts: no tasks: - name: with_items使用 shell: rm -rf /data/monster/{{item}} with_items: - monster.log - monster.yml with_items多变量循环同样with_items里面的变量全匹配后任务才执行完 使用键值对key:value的形式 touch:创建,absent:删除 - hosts: all gather_facts: no tasks: - name: 创建目录with file: path: /data/monster/with state: directory - name: 循环创建文件monster1-5,最后再删掉文件2。 file: path: /data/monster/with/{{item.mulu}} state: "{{item.wenjian}}" with_items: - { mulu: 'monster1', wenjian: 'touch' } - { mulu: 'monster2', wenjian: 'touch' } - { mulu: 'monster3', wenjian: 'touch' } - { mulu: 'monster4', wenjian: 'touch' } - { mulu: 'monster5', wenjian: 'touch' } - { mulu: 'monster2', wenjian: 'absent' }
写法和上面一样,和模块同级对其,使用 - 方式设置标签 可打多个标签,也可以重复标签 - hosts: server2 gather_facts: no tasks: - name: 分发到monster2主机 copy: src: /data/www/monster.cn/v0.0.10 dest: /data/www/monster.cn/ backup: yes tags: - v0.0.10 - hosts: server3 gather_facts: no tasks: - name: 分发到monster2主机 copy: src: /data/www/monster.cn/v0.0.9 dest: /data/www/monster.cn/ backup: yes tags: - v0.0.9单独安标签执行剧本 -t 指定标签 剧本文件 [root@monster1 ~]# ansible-playbook -t v0.0.10 juben.yml查看目录结构 [root@monster2 www]# tree . └── monster.cn └── v0.0.10 └── index.html 2 directories, 1 file指定多个标签,标签之间用逗号隔开 [root@monster1 ~]# ansible-playbook -t v0.0.10,v0.0.9 juben.yml刚才v0.0.10执行过了,138未做更改 如果目录没有修改,只修改里面的文件内容同样会识别到,重新分发 查看目录结构 [root@mosnter3 www]# tree . └── monster.cn └── v0.0.9 └── index.html 2 directories, 1 file [root@mosnter3 www]# ignore_errors忽略错误忽略错误使用:同样在模块同级对其,ignore_errors:yes 如下在第一个任务创建目录的时候故意弄错,先把忽略错误注释掉,执行看看 - hosts: server2 gather_facts: no tasks: - name: monster2故意创建错的目录 file: path: /data/monster/error.log/ state: touch tags: - test_error # ignore_errors: yes - hosts: server3 gather_facts: no tasks: - name: 忽略monster2错误会执行此任务 file: path: /data/monster/error.log state: touch tags: - test_error提示致命错误,然后就结束剧本了 把注释去掉后,仍能提示任务1的致命错误,但是紧接着后面…ignoring(忽略),然后任务2的接着执行了 [root@monster1 ~]# ansible-playbook -t test_error juben.yml ________________ < PLAY [server2] > ---------------- \ / \ //\ \ |\___/| / \// \\ /0 0 \__ / // | \ \ / / \/_/ // | \ \ @_^_@'/ \/_ // | \ \ //_^_/ \/_ // | \ \ ( //) | \/// | \ \ ( / /) _|_ / ) // | \ _\ ( // /) '/,_ _ _/ ( ; -. | _ _\.-~ .-~~~^-. (( / / )) ,-{ _ `-.|.-~-. .~ `. (( // / )) '/\ / ~-. _ .-~ .-~^-. \ (( /// )) `. { } / \ \ (( / )) .----~-.\ \-' .~ \ `. \^-. ///.----..> \ _ -~ `. ^-` ^-_ ///-._ _ _ _ _ _ _}^ - - - - ~ ~-- ,.-~ /.-~ _________________________ < TASK [monster2故意创建错的目录] > ------------------------- \ / \ //\ \ |\___/| / \// \\ /0 0 \__ / // | \ \ / / \/_/ // | \ \ @_^_@'/ \/_ // | \ \ //_^_/ \/_ // | \ \ ( //) | \/// | \ \ ( / /) _|_ / ) // | \ _\ ( // /) '/,_ _ _/ ( ; -. | _ _\.-~ .-~~~^-. (( / / )) ,-{ _ `-.|.-~-. .~ `. (( // / )) '/\ / ~-. _ .-~ .-~^-. \ (( /// )) `. { } / \ \ (( / )) .----~-.\ \-' .~ \ `. \^-. ///.----..> \ _ -~ `. ^-` ^-_ ///-._ _ _ _ _ _ _}^ - - - - ~ ~-- ,.-~ /.-~ fatal: [192.168.71.138]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "msg": "Error, could not touch target: [Errno 21] Is a directory: '/data/monster/error.log/'", "path": "/data/monster/error.log/"} ...ignoring ________________ < PLAY [server3] > ---------------- \ / \ //\ \ |\___/| / \// \\ /0 0 \__ / // | \ \ / / \/_/ // | \ \ @_^_@'/ \/_ // | \ \ //_^_/ \/_ // | \ \ ( //) | \/// | \ \ ( / /) _|_ / ) // | \ _\ ( // /) '/,_ _ _/ ( ; -. | _ _\.-~ .-~~~^-. (( / / )) ,-{ _ `-.|.-~-. .~ `. (( // / )) '/\ / ~-. _ .-~ .-~^-. \ (( /// )) `. { } / \ \ (( / )) .----~-.\ \-' .~ \ `. \^-. ///.----..> \ _ -~ `. ^-` ^-_ ///-._ _ _ _ _ _ _}^ - - - - ~ ~-- ,.-~ /.-~ ___________________________ < TASK [忽略monster2错误会执行此任务] > --------------------------- \ / \ //\ \ |\___/| / \// \\ /0 0 \__ / // | \ \ / / \/_/ // | \ \ @_^_@'/ \/_ // | \ \ //_^_/ \/_ // | \ \ ( //) | \/// | \ \ ( / /) _|_ / ) // | \ _\ ( // /) '/,_ _ _/ ( ; -. | _ _\.-~ .-~~~^-. (( / / )) ,-{ _ `-.|.-~-. .~ `. (( // / )) '/\ / ~-. _ .-~ .-~^-. \ (( /// )) `. { } / \ \ (( / )) .----~-.\ \-' .~ \ `. \^-. ///.----..> \ _ -~ `. ^-` ^-_ ///-._ _ _ _ _ _ _}^ - - - - ~ ~-- ,.-~ /.-~ changed: [192.168.71.139] ____________ < PLAY RECAP > ------------ \ / \ //\ \ |\___/| / \// \\ /0 0 \__ / // | \ \ / / \/_/ // | \ \ @_^_@'/ \/_ // | \ \ //_^_/ \/_ // | \ \ ( //) | \/// | \ \ ( / /) _|_ / ) // | \ _\ ( // /) '/,_ _ _/ ( ; -. | _ _\.-~ .-~~~^-. (( / / )) ,-{ _ `-.|.-~-. .~ `. (( // / )) '/\ / ~-. _ .-~ .-~^-. \ (( /// )) `. { } / \ \ (( / )) .----~-.\ \-' .~ \ `. \^-. ///.----..> \ _ -~ `. ^-` ^-_ ///-._ _ _ _ _ _ _}^ - - - - ~ ~-- ,.-~ /.-~ 192.168.71.138 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1 192.168.71.139 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [root@monster1 ~]# |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |