Ansible 实施任务控制

Ansible 实施任务控制

1. 任务循环

1.1 编写循环和条件任务

1.1.1 简单循环

1.1.2 循环散列或字典列表

1.1.3 较早样式的循环关键字

1.1.4 将register变量与loop一起使用

2. 条件任务

2.1 有条件的运行任务

2.1.1 条件任务语法

2.1.2 测试多个条件

2.2 组合循环和有条件任务

3. 实施处理程序

3.1 ansible处理程序

3.2 使用程序的好处

4. 处理任务失败

4.1 管理play中的任务错误

4.2 忽略任务失败

4.3 任务失败后强制执行处理程序

4.4 指定任务失败条件

4.5 指定何时任务报告“changed”结果

4.6 ansible块和错误处理

4. 文件管理

4.1 blockfile

4.2 fetch

4.3 stat

4.4 synchronize同步


1. 任务循环

1.1 编写循环和条件任务

通过利用循环,无需编写多个使用同一模块的任务。他们不必编写五个任务来确保存在五个用户,而是只需编写一个任务来对含有五个用户的列表迭代,从而确保它们都存在。

Ansible支持使用loop关键字对一组项目迭代任务。可以配置循环以利用列表中的各个项目、列表中各个文件的内容、生成的数字序列或更为复杂的结构来重复任务

1.1.1 简单循环

简单循环对一组项目迭代任务。loop关键字添加到任务中,将应对其迭代任务的项目列表取为值。循环变量item保存每个迭代过程中使用的值。

​
[root@yibie playbook]# cat user.yml 
---
- name: task1
  hosts: "*"
  tasks:
    - name: 创建用户 {{ item }}
      user:
        name: "{{ item }}"
        state: present
      loop:
        - user1
        - user2
        - user3
[root@yibie playbook]# ansible-playbook user.yml 

PLAY [task1] ************************************************************************************************

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

TASK [创建用户 {{ item }}] **************************************************************************************
changed: [192.168.47.147] => (item=user1)
changed: [192.168.47.147] => (item=user2)
changed: [192.168.47.147] => (item=user3)

PLAY RECAP **************************************************************************************************
192.168.47.147             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
[root@apache facts.d]# id user1
uid=2003(user1) gid=2003(user1) 组=2003(user1)
[root@apache facts.d]# id user2
uid=2004(user2) gid=2004(user2) 组=2004(user2)
[root@apache facts.d]# id user3
uid=2005(user3) gid=2005(user3) 组=2005(user3)
​
//另一种方式
[root@yibie ansible]# cat playbook/vars/users.yml 
user:
  - user1
  - user2
  - user3
[root@yibie ansible]# cat playbook/user.yml 
---
- name: task1
  hosts: "*"
  vars_file: 
    - vars/users.yml
  tasks:
    - name: 创建用户 {{ item }}
      user:
        name: "{{ item }}"
        state: absent
      loop: "{{ user }}"
[root@yibie ansible]# ansible-playbook playbook/user.yml 

1.1.2 循环散列或字典列表

​
//第一种方式
[root@yibie playbook]# vim user.yml 
---
- name: task
  hosts: "*"
  vars_file:
    - vars/users.yml
  tasks:
    - name: 创建用户 {{ item.name }}
      user:
        name: "{{ item.name }}"
        uid: "{{ item.uid}}"
        state: present
      loop: 
        - name: user1
          uid: 2222
[root@yibie playbook]# ansible-playbook user.yml 

//第二种方式
[root@yibie playbook]# cat user.yml 
---
- name: task
  hosts: "*"
  vars_file: 
    - vars/users.yml
  tasks:
    - name: 创建用户 {{ item.name }}
      user:
        name: "{{ item.name }}"
        uid: "{{ item.uid}}"
        state: present
      loop: "{{ user }}"
[root@yibie playbook]# cat vars/users.yml 
user:
  - name: user1
    uid: 2222
  - name: user2
    uid: 2223
[root@yibie playbook]# ansible-playbook user.yml 

1.1.3 较早样式的循环关键字

循环关键字描述
with_items行为与简单列表的loop关键字相同,例如字符串列表或散列/字典列表。但与loop不同的是,如果为with_items提供了列表的列表,它们将被扁平化为单级列表。循环变量item保存每次迭代过程中使用的列表项。
with_file此关键字需要控制节点文件名列表。循环变量item在每次迭代过程中保存文件列表中相应文件的内容。
with_sequence此关键字不需要列表,而是需要参数来根据数字序列生成值列表。循环变量item在每次迭代过程中保存生成的序列中的一个生成项的值。
vars:
  data:
    - user0
    - user1
    - user2
tasks:
  - name: "with_items"
    debug:
      msg: "{{ item }}"
    with_items: "{{ data }}"

1.1.4 将register变量与loop一起使用

[root@yibie playbook]# cat test.yml 
---
- hosts: "*"
  gather_facts: no
  tasks:
    - name: yibie
      command: "echo hello {{ item }},how are you"
      loop:
        - tom
        - awm
      register: result


    - debug:
        var: result

2. 条件任务

2.1 有条件的运行任务

ansible可使用conditionals在符合特定条件时执行任务或play

我们可以利用条件来区分不同的受管主机,并根据他们所符合的条件来分配功能角色。playbook变量、注册的变量和ansible事实都可以通过田间来进行测试,可以使用比较字符串、数字数据和布尔值的运算符。

一下场景说明了在ansible中使用条件的情况:

  • 可以在变量中定义硬限制(如min_memory)并将它与受管主机上的可用内存进行比较。
  • Ansible可以捕获并评估命令的输出,以确定某一任务在执行进一步操作前是否已经完成。例如,如果某一程序失败,则将路过批处理。
  • 可以利用Ansible事实来确定受管主机网络配置,并决定要发送的模板文件(如,网络绑定或中继)。
  • 可以评估CPU的数量,来确定如何正确调节某一Web服务器。
  • 将注册的变量与预定义的变量进行比较,以确定服务是否已更改。例如,测试服务配置文件的MD5检验以和查看服务是否已更改。

2.1.1 条件任务语法

when语句用于有条件的运行任务。它取要测试的条件为值。如果条件满足,则运行任务。如果条件不满足,则跳过任务

[root@yibie ~]# cd /etc/ansible/playbook/
[root@yibie playbook]# vim test.yml 
[root@yibie playbook]# cat test.yml 
---
- hosts: "*"
  gather_facts: on
  vars:
    power: true
  tasks:
    - name: yibie
      yum:
        name: vsftpd
        state: present
      when: power
[root@yibie playbook]# ansible-playbook test.yml 

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

TASK [Gathering Facts] ********************************************************************

ok: [192.168.57.30]

TASK [yibie] ******************************************************************************
changed: [192.168.57.30]

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

[root@yibie-apache ~]#  rpm -qa | grep vsftpd
vsftpd-3.0.3-33.el8.x86_64

测试service_name变量是否有值,如有值,则将service_name的值用作要安装的软件包的名称,若无值,跳过任务且不显示错误

[root@yibie playbook]# vim test.yml 
[root@yibie playbook]# cat test.yml 
---
- hosts: "*"
  gather_facts: on
  vars:
  tasks:
    - name: yibie
      yum:
        name: "{{ service_name}}"
        state: present
      when: service_name is defined
[root@yibie playbook]# ansible-playbook test.yml 

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

TASK [Gathering Facts] ********************************************************************

ok: [192.168.57.30]

TASK [yibie] ******************************************************************************
skipping: [192.168.57.30]

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

实例条件

操作实例
等于(值为字符串ansible_machine == “x86_64”
等于(值为数字max_memory == 512
小于min_memory < 128
大于min_memory > 256
小于等于min_memory <= 256
大于等于min_memory >= 512
不等于min_memory != 512
变量存在min_memory is defined
变量不存在min_memory is not defined
布尔变量是True。1、True或yes的求值为Truememory_available
布尔变量是False。0、False或no的求值为Falsenot memory_available
第一个变量的值存在,作为第二个变量的列表中的值ansible_distribution in supported_distros

注意when语句的缩进。由于when语句不是模块变量,它必须通过缩进到任务的最高级别,放置在模块的外面。

[root@yibie playbook]# vim test.yml 
[root@yibie playbook]# cat test.yml 
---
- hosts: "*"
  gather_facts: on
  vars:
    platform: 
      - redhat
      - centOS
  tasks:
    - name: yibie
      yum:
        name: vsftpd
        state: present
      when: ansible_facts['distribution'] in platform     
[root@yibie playbook]# ansible-playbook test.yml 

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

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

TASK [yibie] ******************************************************************************
skipping: [192.168.57.30]

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

[root@yibie playbook]# vim test.yml 
[root@yibie playbook]# cat test.yml 
---
- hosts: "*"
  vars:
    platform: 
      - redhat
      - centOS
  tasks:
    - name: yibie
      yum:
        name: vsftpd
        state: present
      when: ansible_facts['distribution'] in platform
 
[root@yibie playbook]# ansible-playbook test.yml 

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

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

TASK [yibie] ******************************************************************************
skipping: [192.168.57.30]

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

2.1.2 测试多个条件

用when语句可用于评估多个条件,使用and和or关键字组合条件,并使用括号分组条件

如果任一条件为真时满足条件语句,则使用or语句

when: ansible_distribution == "Redhat" or ansible_distribution == "Fedora"

使用and运算时,两个条件都必须为真,才满足整个条件语句

when: ansible_distribution_version == "7.5" and ansible_kernel == "3.10.0-327.el7.x86_64"

when关键字还支持使用列表来描述条件列表。向when关键字提供列表时,将使用and运算组合所有条件。下面的示例演示了使用and运算符组合多个条件语句的另一方式:

when:
  - ansible_distribution_version == "7.5"
  - ansible_kernel == "3.10.0-327.el7.x86_64"

此示例使用大于字符,这样长条件就可以在playbook中分成多行,以便于阅读

when: >
  ( ansible_distribution == "Redhat" and
    ansible_distribution_major_version == "7" )
  or
  ( ansible_distribution == "Fedora" and
    ansible_distribution_major_version == "28" )

2.2 组合循环和有条件任务

循环和条件可以组合使用

//对某个任务结合使用when和loop时,将对每个项检查when语句。
- name: install mariadb-server if enough space on root
  yum:
    name: mariadb-server
    state: latest
  loop: "{{ ansible_mounts }}"
  when: item.mount == "/" and item.size_available > 300000000 //先把/

条件和变量的另一个实例:

[root@yibie-apache ~]#  rpm -qa | grep vsftpd
vsftpd-3.0.3-33.el8.x86_64
[root@yibie-apache ~]# systemctl is-active vsftp  //查看状态
inactive  //没有运行

---
- name: Restart HTTPD if Postfix is Running
  hosts: 172.16.103.129
  tasks:
    - name: Get Postfix server status
      command: /usr/bin/systemctl is-active postfix     # Postfix是否在运行?
      ignore_errors: yes    # 如果它不在运行并且命令失败,则不停止处理。
      register: result      # 将模块的结果信息保存在名为result的变量中
   //这个任务的前提时上面的运行成功了下面的才会运行
    - name: Restart Apache HTTPD based on Postfix status
      service:
        name: httpd
        state: restarted
      when: result.rc == 0      # 评估Postfix任务的输出。如果systemctl命令的退出代码为0,\
                                # 则Postfix激活并且此任务重启httpd服务

3. 实施处理程序

3.1 ansible处理程序

Ansible模块设计为具有幂等性。这表示,在正确编写的playbook中,playbook及其任务可以运行多次而不会改变受管主机,除非需要进行更改使受管主机进入所需的状态

处理程序是响应由其他任务触发的通知的任务。仅当任务在受管主机上更改了某些内容时,任务才通知其处理程序。每个处理程序具有全局唯一的名称,在playbook中任务块的末尾触发。如果没有任务通过名称通知处理程序,处理程序就不会运行。如果一个或多个任务通知处理程序,处理程序就会在play中的所有其他任务完成后运行一次。因为处理程序就是任务,所以可以在处理程序中使用他们将用于任何其他任务的模块。通常而言,处理程序被用于重新引导主机和重启服务。

处理程序可视为非活动任务,只有在使用notify语句显式调用时才会被触发。

  • notify:通知的意思
  • handlers:处理程序
  • notify和handlers名字必须保持一致
[root@yibie ~]# cd /etc
[root@yibie etc]# scp 192.168.57.30:/etc/vsftpd/vsftpd.conf . 
vsftpd.conf                                              100% 5039     4.0MB/s   00:00    
[root@yibie etc]# cd /etc/ansible/playbook/
[root@yibie playbook]# vim test.yml 
[root@yibie playbook]# cat test.yml 
---
- hosts: "*"
  tasks:
    - name: yibie
      yum:
        name: vsftpd
        state: present
    - name: config
      copy:
        src: /etc/vsftpd.conf
        dest: /etc/vsftpd/vsftpd.conf
    - name:
      service:
        name: vsftpd
        state: started
[root@yibie playbook]# ansible-playbook test.yml 

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

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

TASK [yibie] ******************************************************************************
ok: [192.168.57.30]

TASK [config] *****************************************************************************
ok: [192.168.57.30]

TASK [service] ****************************************************************************
changed: [192.168.57.30]

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

如果不动配置文件,就算写了notify,后面的handlers也不会执行

如果动了配置文件,没写notify,后面的handlers不会执行

[root@yibie ~]# vim /etc/vsftpd.conf //这里动一下配置文件,把yes改为no
#
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=NO

[root@yibie playbook]# vim test.yml 
[root@yibie playbook]# cat test.yml 
---
- hosts: "*"
  gather_facts: no
  tasks:
    - name: yibie
      yum:
        name: vsftpd
        state: present
    - name: config
      copy:
        src: /etc/vsftpd.conf
        dest: /etc/vsftpd/vsftpd.conf
      notify: 
        - restart vsftpd
    - name: service
      service:
        name: vsftpd
        state: started
  handlers:
    - name: restart vsftpd
      service:
        name: vsftpd
        state: restarted
[root@yibie playbook]# ansible-playbook test.yml 

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

TASK [yibie] ******************************************************************************
ok: [192.168.57.30]

TASK [config] *****************************************************************************
ok: [192.168.57.30]

TASK [service] ****************************************************************************
ok: [192.168.57.30]

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

一个任务可以在其notify部分中调用多个处理程序。

//不是谁先通知谁先执行,handlers谁先在前面谁先执行
tasks:
  - name: copy demo.example.conf configuration template
    template:
      src: /var/lib/templates/demo.exammple.conf.template
      dest: /etc/httpd/conf.d/demo.example.conf
    notify:
      - restart mysql
      - restart apache
//这里面mariadb先执行
handlers:
  - name: restart mysql
    service:
      name: mariadb
      state: restarted
      
  - name: restart apache
    service:
      name: httpd
      state: restarted

3.2 使用程序的好处

  • 处理程序始终按照play的handlers部分指定的顺序运行。它们不按在任务中由notify语句列出的顺序运行,或按任务通知它们的顺序运行。
  • 处理程序通常在相关play中tasks的所有其他任务完成后运行。playbook的tasks部分中某一任务调用的处理程序,将等到tasks下的所有任务都已处理后才会运行。
  • 处理程序名称存在于各play命名空间中。如果两个处理程序被错误地给予相同的名称,则仅会运行一个。
  • 即使有多个任务通知处理程序,该处理程序依然仅运行一次。如果没有任务通知处理程序,它就不会运行。
  • 如果包含notify语句的任务没有报告changed结果(例如,软件包已安装并且任务报告ok),则处理程序不会获得通知。处理程序将被跳过,直到有其他任务通知它。只有相关任务报告了changed状态,Ansible才会通知处理程序。

4. 处理任务失败

4.1 管理play中的任务错误

通常来说,执行任务失败时,会中止play的其余部分,但我们有时候想跳过,继续执行play。

4.2 忽略任务失败

默认情况下,任务失败时play会中止。不过,可以通过忽略失败的任务来覆盖此行为。可以在任务中使用ignore_errors关键字来实现此目的。

测试:安装的vsftpd1不存在,也没有写ignore_errors,会出现报错

[root@yibie playbook]# vim test.yml 
[root@yibie playbook]# cat test.yml 
---
- hosts: "*"
  gather_facts: no
  tasks:
    - name: yibie
      yum:
        name: vsftpd1   //添加了1,改错
        state: present
        ignore_errors: yes    //然后忽略这个报错,如果不忽略或者没有写这一行就会报错,格式和yum模块对齐

    - name: config
      copy:
        src: /etc/vsftpd.conf
        dest: /etc/vsftpd/vsftpd.conf
      notify: 
        - restart vsftpd

    - name: service
      service:
        name: vsftpd
        state: started
  handlers:
    - name: restart vsftpd
      service:
        name: vsftpd
        state: restarted
[root@yibie playbook]# ansible-playbook test.yml 

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

TASK [yibie] ******************************************************************************
fatal: [192.168.57.30]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"}, "changed": false, "msg": "Unsupported parameters for (dnf) module: ignore_errors Supported parameters include: allow_downgrade, autoremove, bugfix, conf_file, disable_excludes, disable_gpg_check, disable_plugin, disablerepo, download_dir, download_only, enable_plugin, enablerepo, exclude, install_repoquery, install_weak_deps, installroot, list, lock_timeout, name, releasever, security, skip_broken, state, update_cache, update_only, validate_certs"}

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

4.3 任务失败后强制执行处理程序

下列代码片段演示了如何在play中使用force_handlers关键字,以便在任务失败时也强制执行相应的处理程序:

[root@yibie ~]# vim /etc/vsftpd.conf //修改配置文件,不进行修改会 报错
[root@yibie ansible]# cat playbook/test.yml 
---
- hosts: "*"
  gather_facts: no
  force_handlers: yes //强制执行
  tasks:
    - name: yibie
      yum:
        name: vsftpd
        state: present
      ignore_errors: yes 

    - name: config
      copy:
        src: /etc/vsftpd.conf
        dest: /etc/vsftpd/vsftpd.conf
      notify:
        - restart vsftpd  //错误必须要在通知之后发生才会执行,不然会直接中止

    - name: service
      service: 
        name: vsftpd1
        state: started
  handlers:
    - name: restart vsftpd
      service:
        name: vsftpd
        state: restarted
[root@yibie ansible]# ansible-playbook playbook/test.yml 

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

TASK [yibie] *****************************************************************************************
ok: [192.168.57.30]

TASK [config] *************************************************************************************
changed: [192.168.57.30]

TASK [service] ************************************************************************************
fatal: [192.168.57.30]: FAILED! => {"changed": false, "msg": "Could not find the requested service vsftpd1: host"} //这里虽然报错了,但是没有终止,继续强制执行了restart

RUNNING HANDLER [restart vsftpd] ******************************************************************
changed: [192.168.57.30]

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

4.4 指定任务失败条件

成功的执行了某些命令,但命令的输出失败

[root@yibie ansible]# cat playbook/test.yml 
---
- hosts: "*"
  gather_facts: no
  tasks:
    - name: yibie
      command: echo "hello yibie"
      register: result

    - name: hui
      fail:
        msg: "任务失败"
      when: "'yibie' in result['stdout']"
[root@yibie ansible]# ansible-playbook playbook/test.yml 

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

TASK [yibie] ******************************************************************************************************************************
changed: [192.168.57.30]

TASK [hui] *****************************************************************************************************************************
fatal: [192.168.57.30]: FAILED! => {"changed": false, "msg": "任务失败"}

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

4.5 指定何时任务报告“changed”结果

配置文件没有改任何东西,但是就要它报告changed

[root@yibie playbook]# cat test.yml 
---
- hosts: "*"
  gather_facts: no
  tasks:
    - name: yibie
      copy:
        src: /etc/vsftpd.conf
        dest: /etc/vsftpd/vsftpd.conf
      changed_when: true
[root@yibie playbook]# ansible-playbook test.yml 

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

TASK [yibie] ******************************************************************************
changed: [192.168.57.30]

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

4.6 ansible块和错误处理

模块中的任何任务失败,则执行其rescue块中的任务来进行恢复。在block子句中的任务以及rescue子句中的任务(如果出现故障)运行之后,always子句中的任务运行。总结:

  • block:定义要运行的主要任务
  • rescue:定义要在block子句中定义的任务失败时运行的任务
  • always:定义始终都独立运行的任务,不论block和rescue子句中定义的任务是成功还是失败

如果说block子句中定义的任务失败了就算失败一个,则会执行rescue的任务

如果block的任务执行成功了,则rescue的任务不会执行,always任务无论怎么样都会执行

tasks:
  - name: Upgrade DB
    block:
      - name: upgrade the database
        shell:
          cmd: /usr/local/lib/upgrade-database
    rescue:
      - name: revert the database upgrade
        shell:
          cmd: /usr/local/lib/revert-database
    always:
      - name: always restart the database
        service:
          name: mariadb
          state: restarted

4. 文件管理

模块名称模块说明
blockinfile插入、更新或删除由可自定义标记线包围的多行文本块
copy将文件从本地或远程计算机复制到受管主机上的某个位置。类似于file模块,copy模块还可以设置文件属性,包括SELinux上下文件。
fetch此模块的作用和copy模块类似,但以相反方式工作。此模块用于从远程计算机获取文件到控制节点,并将它们存储在按主机名组织的文件树中。
file设置权限、所有权、SELinux上下文以及常规文件、符号链接、硬链接和目录的时间戳等属性。此模块还可以创建或删除常规文件、符号链接、硬链接和目录。其他多个与文件相关的模块支持与file模块相同的属性设置选项,包括copy模块。
lineinfile确保特定行位于某文件中,或使用反向引用正则表达式来替换现有行。此模块主要在用户想要更改文件的某一行时使用。
stat检索文件的状态信息,类似于Linux中的stat命令。
synchronize围绕rsync命令的一个打包程序,可加快和简化常见任务。
synchronize模块无法提供对rsync命令的完整功能的访问权限但确实最常见的调用更容易实施。用户可能仍需通过run command模块直接调用rsync命令。

4.1 blockfile

[root@yibie playbook]# vim test.yml 
[root@yibie playbook]# cat test.yml 
---
- hosts: "*"
  gather_facts: no
  tasks:
    - name: yibie
      blockinfile:
        path: //tmp/abc
        block: | 
          snde
          sjduie
          dknchewp
[root@yibie playbook]# ansible-playbook test.yml 

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

TASK [yibie] ******************************************************************************
changed: [192.168.57.30]

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

[root@yibie-apache ~]# cat /tmp/abc 
{yibie: {first_name: yi, last_name: bie, age: 20}, awm: {first_name: wm, age: 22}}
# BEGIN ANSIBLE MANAGED BLOCK
snde
sjduie
dknchewp
# END ANSIBLE MANAGED BLOCK

[root@yibie-apache ~]# > /tmp/abc 
[root@yibie-apache ~]# echo "yibie hui" > /tmp/abc 
[root@yibie-apache ~]# cat /tmp/abc 
yibie hui
[root@yibie-apache ~]# 

4.2 fetch

[root@yibie playbook]# vim test.yml 
[root@yibie playbook]# cat test.yml 
---
- hosts: "*"
  gather_facts: no
  tasks:
    - name: yibie
      fetch:
        src: /tmp/abc
        dest: /opt
[root@yibie playbook]# ansible-playbook test.yml 

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

TASK [yibie] ******************************************************************************
changed: [192.168.57.30]

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

[root@yibie playbook]# cd
[root@yibie ~]# cd /opt/
[root@yibie opt]# ls
192.168.57.30
[root@yibie opt]# cd 192.168.57.30/
[root@yibie 192.168.57.30]# ls
tmp
[root@yibie 192.168.57.30]# 

4.3 stat

[root@yibie playbook]# vim test.yml 
[root@yibie playbook]# cat test.yml 
---
- hosts: "*"
  gather_facts: no
  tasks:
    - name: yibie
      stat:
        path: /tmp/abc
      register: result
    - debug:
        var: result
[root@yibie playbook]# ansible-playbook test.yml 

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

TASK [yibie] ******************************************************************************
ok: [192.168.57.30]

TASK [debug] ******************************************************************************
ok: [192.168.57.30] => {
    "result": {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/libexec/platform-python"
        },
        "changed": false,
        "failed": false,
        "stat": {
            "atime": 1627494146.477639,
            "attr_flags": "",
            "attributes": [],
            "block_size": 4096,
            "blocks": 8,
            "charset": "us-ascii",
            "checksum": "f9e2b4754e3e1e4854907d0b38cf6f95bbdc1bb6",
            "ctime": 1627494140.595591,
            "dev": 64768,
            "device_type": 0,
            "executable": false,
            "exists": true,
            "gid": 0,
            "gr_name": "root",
            "inode": 67286937,
            "isblk": false,
            "ischr": false,
            "isdir": false,
            "isfifo": false,
            "isgid": false,
            "islnk": false,
            "isreg": true,
            "issock": false,
            "isuid": false,
            "mimetype": "text/plain",
            "mode": "0644",
            "mtime": 1627494140.595591,
            "nlink": 1,
            "path": "/tmp/abc",
            "pw_name": "root",
            "readable": true,
            "rgrp": true,
            "roth": true,
            "rusr": true,
            "size": 10,
            "uid": 0,
            "version": "1264199129",
            "wgrp": false,
            "woth": false,
            "writeable": true,
            "wusr": true,
            "xgrp": false,
            "xoth": false,
            "xusr": false
        }
    }
}

PLAY RECAP ********************************************************************************
192.168.57.30              : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

4.4 synchronize同步

受控主机和控制主机都需要装rsync

可同步单个文件也可同步目录

[root@yibie ansible]# yum -y install rsync
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use 
(过程省略)


[root@yibie ansible]# cat playbook/test.yml 
---
- hosts: "*"
  gather_facts: no
  tasks:
    - name: yibie
      yum:
        name: rsync
        state: present
    - name: 同步文件
      synchronize:
        src: files
        dest: /opt 

[root@yibie ansible]# cd playbook/
[root@yibie playbook]# mkdir files
[root@yibie playbook]# ansible-playbook test.yml 

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

TASK [yibie] ******************************************************************************
ok: [192.168.57.30]

TASK [同步文件] *******************************************************************************
changed: [192.168.57.30]

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值