任务处理与文件管理模块

本文介绍了在Ansible中如何处理任务失败,通过ignore_errors参数忽略错误继续执行任务,以及force_handlers强制执行处理程序。同时,讲解了changed_when控制任务变更报告,以及block、rescue、always结构用于任务管理。此外,还详细阐述了如何在远程主机上创建文件和目录,包括copy和fetch模块的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.处理任务失败,用ignore_errors忽略,使任务继续执行
[root@afei weixin]# vim playbook.yml 
---
- hosts: all
  tasks:
    - name: feige
      yum:
        name: feige
        state: present
      
    - name: feige
      command: echo "nihao"
注:上述命令行任务中第一个是错误的,第二个是正确的,但不会执行第二个任务
[root@afei weixin]# ansible-playbook playbook.yml 

PLAY [all] ****************************************************************************

TASK [Gathering Facts] ****************************************************************
ok: [192.168.240.134]

TASK [feige] **************************************************************************
fatal: [192.168.240.134]: FAILED! => {"changed": false, "failures": ["No package feige available."], "msg": "Failed to install some of the specified packages", "rc": 1, "results": []}

PLAY RECAP ****************************************************************************
192.168.240.134            : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0  

注:此时想要执行第二个任务就必须跳过第一个错误任务
[root@afei weixin]# vim playbook.yml 
---
- hosts: all
  tasks:
    - name: feige
      yum:
        name: feige
        state: present
      ignore_errors: yes
    - name: feige
      command: echo "nihao"
[root@afei weixin]# ansible-playbook playbook.yml 

PLAY [all] ****************************************************************************

TASK [Gathering Facts] ****************************************************************
ok: [192.168.240.134]

TASK [feige] **************************************************************************
fatal: [192.168.240.134]: FAILED! => {"changed": false, "failures": ["No package feige available."], "msg": "Failed to install some of the specified packages", "rc": 1, "results": []}
...ignoring

TASK [feige] **************************************************************************
changed: [192.168.240.134]

PLAY RECAP ****************************************************************************
192.168.240.134            : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1   

2.任务失败后强制执行处理程序force_handlers:yes
[root@afei weixin]# vim playbook.yml 
---
- hosts: all
  tasks:
    - name: install
      yum:
        name: httpd
        state: present
    - name: config
      template:
            src: files/httpd.conf
            dest: /etc/httpd/conf/httpd.conf
      notify:
          - restart apache
    - name: service
      service:
            name: httpd
            state: started
  handlers:
    - name: restart apache
         service:
            name: httpd
            state: restarted
[root@afei weixin]# echo '#' >> files/httpd.conf
[root@afei weixin]# ansible-playbook playbook.yml 

PLAY [all] ****************************************************************************

TASK [Gathering Facts] ****************************************************************
ok: [192.168.240.134]

TASK [install] ************************************************************************
ok: [192.168.240.134]

TASK [config] *************************************************************************
changed: [192.168.240.134]

TASK [service] ************************************************************************
fatal: [192.168.240.134]: FAILED! => {"changed": false, "msg": "Unable to start service httpd: Job for httpd.service failed because the control process exited with error code.\nSee \"systemctl status httpd.service\" and \"journalctl -xe\" for details.\n"}

RUNNING HANDLER [restart apache] ******************************************************

PLAY RECAP ****************************************************************************
192.168.240.134            : ok=3    changed=1    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0  

注:只有当配置文件发生改变了才会执行handlers
3.关于是否需要报告changed,用changed_when False or True
[root@afei weixin]# vim playbook.yml 
---
- hosts: all
  tasks:
    - name: feige
      template:
            src: files/abc
            dest: /tmp/abc
      changed_when: False
~                               
4.1.block:定义要运行的主要任务
4.2.rescue:当block中任务失败后定义需要运行的任务
4.3.always:定义始终都要独立运行的任务,不论block或者rescue成功还是失败
[root@afei weixin]# vim playbook.yml 
---
- hosts: all
  tasks:
      - name: test
        block:
        - name: block
          command: echo "block"
        - name: failed feige
          command: ls feige
      rescue:       
        - name: rescue
            command: echo "rescue"
      always:
        - name: always
            command: echo "always"
[root@afei weixin]# ansible-playbook playbook.yml 

PLAY [all] ****************************************************************************

TASK [Gathering Facts] ****************************************************************
ok: [192.168.240.134]

TASK [block] **************************************************************************
changed: [192.168.240.134]

TASK [failed feige] *******************************************************************
fatal: [192.168.240.134]: FAILED! => {"changed": true, "cmd": ["ls", "feige"], "delta": "0:00:01.027637", "end": "2020-09-11 11:58:13.110908", "msg": "non-zero return code", "rc": 2, "start": "2020-09-11 11:58:12.083271", "stderr": "ls: cannot access 'feige': No such file or directory", "stderr_lines": ["ls: cannot access 'feige': No such file or directory"], "stdout": "", "stdout_lines": []}

TASK [rescue] *************************************************************************
changed: [192.168.240.134]

TASK [always] *************************************************************************
changed: [192.168.240.134]

PLAY RECAP ****************************************************************************
192.168.240.134            : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=1    ignored=0   

        
5.在被控制节点上创建文件或者目录
---
- hosts: all
  tasks:
      - name: feige
        blockinfile:
                path: /tmp/anaconda.log
                block: |
                   first line.
                   second line.
[root@afei weixin]# ansible-playbook playbook.yml 

PLAY [all] ****************************************************************************

TASK [Gathering Facts] ****************************************************************
ok: [192.168.240.134]

TASK [feige] **************************************************************************
changed: [192.168.240.134]

PLAY RECAP ****************************************************************************
192.168.240.134            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
 
[root@localhost ~]# cat /tmp/anaconda.log 
00:31:20,611 WRN addons: Addon ADDON_placeholder doesn't have execute method!
# BEGIN ANSIBLE MANAGED BLOCK
first line.
second line.
# END ANSIBLE MANAGED BLOCK

5.1.copy和fetch的使用,copy是把主控制机上的文件复制到受管主机上,fetch则刚好相反
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值