Ansible 实施任务控制
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的求值为True | memory_available |
布尔变量是False。0、False或no的求值为False | not 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