Ansible是一个当时最为流行的集群部署与配置工具,在服务器配置和运维管理的过程当中有重要的做用和优点。本文主要为结合我的的学习心得,向对ansible有兴趣的朋友尽量深刻简出、详尽的介绍这个工具的原理和用法。html
Ansible是由Ansible Inc.和Red Hat共同开发的一款开源集群配置软件,编写语言为python,使用时的配置文件语言为yaml。核心组件使用了paramiko和PyYaml。其中paramiko是python的ssh支持库,而PyYaml则用于支持yaml配置文件的使用和playbook的应用。node
Ansible有着很是突出的优势,从而使其在saltstack等集群配置工具中脱颖而出。优点以下:python
$ yum install -y ansible
复制代码
$ ssh-keygen -t rsa ##若是以前已经生成过秘钥了则不须要这一步
$ ssh-copy-id root@<agent_ip> ##向受管机配置管理机的公钥,这一步可能须要输入受管机密码
复制代码
/etc/ansible/hosts
文件中,若是你须要使用的是以后的ansible-playbook,则须要在对应的工做文件夹内建立一个hosts文件记录受管机IP。如下为一个标准的ansible hosts文件的格式:172.26.0.81 ##不分组直接声明IP
172.26.0.82:54208 ##申明特殊的ssh端口
[fangwei-test] ##申明了受管机的列表和分类名
172.26.0.83 ##直接声明IP
Printer ansible_ssh_host=172.26.0.84 ##定义别名和IP
EMR-master ansible_ssh_host=172.26.0.85
Snipe-it ansible_ssh_host=172.26.0.86
Kubernetes ansible_ssh_host=172.26.0.87
[fangwei-test:vars] ##配置对应的用户等ansible变量
ansible_user=root
复制代码
这里顺便介绍一下hosts文件中经常使用的ansible变量声明:web
ansible_ssh_host ##链接目标主机的地址
ansible_ssh_port ##链接目标主机的端口,默认 22 时无需指定
ansible_ssh_user ##链接目标主机默认用户
ansible_ssh_pass ##链接目标主机默认用户密码
ansible_ssh_connection ##目标主机链接类型,能够是 local 、ssh 或 paramiko
ansible_ssh_private_key_file ##链接目标主机的 ssh 私钥,用于安全要求高的机器。可使用其余管理主机的公钥来登陆特定的主机。
ansible_*_interpreter ##指定采用非 Python 的其余脚本语言
复制代码
$ ansible fangwei-test -m ping
复制代码
ansible自己自带很是多的参数选项,能够适配几乎任何集群部署的需求和各类测试需求。 这些参数在ansible-playbook等延伸指令中每每也通用。shell
$ ansible --help
Usage: ansible <host-pattern> [options]
Define and run a single task 'playbook' against a set of hosts ##单纯的ansible指令用于对一个或者一组受管机执行一个playbook任务
普通参数:
-a MODULE_ARGS, --args=MODULE_ARGS
#[重要]模块参数
--ask-vault-pass # 要求输入管理密码
-B SECONDS, --background=SECONDS
#异步运行,X秒后失败(默认关闭)
-C, --check #不对受管机执行任何改变,可是假设已执行语句并返回结果(用于测试)
-D, --diff #当改变小体积文件的时候,显示二者的区别,经常和-C参数一块儿用(用于测试)
-e EXTRA_VARS, --extra-vars=EXTRA_VARS
#将其余变量设置为key = value或YAML / JSON,若是filename前缀为@
-f FORKS, --forks=FORKS
#指定要使用的并行进程数(默认值= 5)
-h, --help #显示此帮助消息并退出
-i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY
#指定库存主机路径或逗号分隔的主机列表。PS: --inventory-file已弃用
-l SUBSET, --limit=SUBSET
#进一步将所选主机限制为其余模式
--list-hosts #输出匹配主机列表;不会执行任何其余操做
-m MODULE_NAME, --module-name=MODULE_NAME
##[重要]要执行的模块名称(默认为command)
-M MODULE_PATH, --module-path=MODULE_PATH
##将冒号分隔的路径预先添加到模块库(默认为[u'/root/.ansible/plugins/modules',u'/usr/share/ansible/plugins/modules'])
-o, --one-line ##压缩输出。
--playbook-dir=BASEDIR
##因为此工具不使用playbooks,所以将其用做替代playbook目录。这将设置许多功能的相对路径,包括roles/group_vars/etc. 也就是变相实现部分playbook功能。
-P POLL_INTERVAL, --poll=POLL_INTERVAL
##若是使用-B(默认值= 15),则设置轮询间隔。
--syntax-check ##对playbook执行语法检查,但不执行它.
-t TREE, --tree=TREE ##将输出记录到此目录
--vault-id=VAULT_IDS ##显示要使用的保管库标识
--vault-password-file=VAULT_PASSWORD_FILES
##保管库密码文件
-v, --verbose ##详细模式(-vvv表示更多,-vvvv表示启用链接调试)
--version ##显示ansible版本并退出
链接相关参数:
主要关于控制哪些受管机以及如何链接到主机。
-k, --ask-pass ##要求输入受管机密码
--private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE
##使用特色文件来认证连接
-u REMOTE_USER, --user=REMOTE_USER
##以特定user来进行链接。
-c CONNECTION, --connection=CONNECTION
##要使用的链接类型(默认=智能)
-T TIMEOUT, --timeout=TIMEOUT
##以秒为单位覆盖链接超时(默认值= 10)
--ssh-common-args=SSH_COMMON_ARGS
##指定传递给sftp / scp / ssh的公共参数(例如ProxyCommand)
--sftp-extra-args=SFTP_EXTRA_ARGS
##指定仅传递给sftp的额外参数(例如-f,-l)
--scp-extra-args=SCP_EXTRA_ARGS
##指定仅传递给scp的额外参数(例如-l)
--ssh-extra-args=SSH_EXTRA_ARGS
##指定仅传递给ssh的额外参数(例如-R)
特权升级参数:
控制你在目标主机上若是成为或者成为哪一个用户
-s, --sudo ##用sudo(nopasswd)运行操做(不推荐,推荐使用--become-method)
-U SUDO_USER, --sudo-user=SUDO_USER
##所需的sudo用户(默认= root)(不建议使用,推荐使用--become-method)
-S, --su ##用su运行操做 (不建议使用,推荐使用--become-method)
-R SU_USER, --su-user=SU_USER
##以su做为此用户运行操做(默认=无)(不建议使用,推荐使用--become-method)
-b, --become ##用run运行操做(不显示密码提示)
--become-method=BECOME_METHOD
##要使用的权限升级方法(默认= sudo),可选项有: [ sudo | su | pbrun | pfexec | doas | dzdo | ksu | runas | pmrun | enable | machinectl ]
--become-user=BECOME_USER
##以此用户身份运行操做(默认= root)
--ask-sudo-pass ##请求sudo密码(不推荐使用,推荐使用--become-method)
--ask-su-pass ##请求su密码 (不推荐使用,推荐使用--become-method)
-K, --ask-become-pass
##要求提供权限提高密码
复制代码
Ansible内置了海量的原生模块和大量的用于链接第三方API的支持模块,熟练掌握基础模块,而且活用各类扩展模块,是熟练掌握Ansible的必经之路。这一章里面咱们会对Ansible的模块进行基础的介绍和使用案例分析。至于详细的模块介绍能够查看我写的Ansible支持模块详表。npm
在ansible中查看全部的模块只须要一个命令:vim
$ ansible-doc -l
复制代码
若是须要查看某一个特定的模块的详细解释则能够直接查询,以ping模块为例:centos
[root@Host ~]# ansible-doc ping
> PING (/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py)
A trivial test module, this module always returns `pong' on successful contact. It does not make sense in playbooks, but it is useful from `/usr/bin/ansible' to verify the ability... ##以后省略
复制代码
模块的重要性除了自己的强大功能外,熟练地掌握模块也是以后playbook部分的基础。一个优秀的playbook使用者必然对经常使用模块的参数了如指掌。安全
ping这个模块主要用来测试可否连通目标服务器。bash
$ ansible test -m ping
复制代码
Command模块自如其名,就是一个很纯粹的命令执行模块,用于在受管机上进行命令的执行,其自己也能够配合不少二级参数和指令进行功能的扩展。不支持管道功能。例如最简单的查看hostname功能:
[root@Printer ~]# ansible fangwei -m command -a 'hostname'
EMRtest | CHANGED | rc=0 >>
EMR-master
Snipeit | CHANGED | rc=0 >>
localhost.localdomain
复制代码
须要注意的是,在没有特意指定ansible的-m
参数的时候,默认调用的Module就是command
。 下面是command经常使用的几个二级参数:
ansible $目标host -a '$二级参数=$目标文件或路径 $待执行指令'
[root@Printer ~]# ansible fangwei -a 'chdir=/etc/ansible ls -l'
EMRtest | CHANGED | rc=0 >>
总用量 28
-rw-r--r-- 1 root root 20277 12月 14 13:57 ansible.cfg
-rw-r--r-- 1 root root 1070 12月 26 11:26 hosts
drwxr-xr-x 2 root root 4096 12月 14 13:57 roles
复制代码
这个模块的主要特色就是囊括了全部的command的功能和二级参数支持,而且支持管道。
[root@Printer ~]# ansible fangwei -m shell -a 'ps -ef | grep crond | grep -v grep'
EMRtest | CHANGED | rc=0 >>
root 6030 1 0 2018 ? 00:00:13 /usr/sbin/crond -n
Snipeit | CHANGED | rc=0 >>
root 1042 1 0 2月12 ? 00:00:04 /usr/sbin/crond -n
复制代码
File模块主要是对于文件的一些简单操做,主要是建立或者权限设定,已经文件的存在判断等。
directory:若是目录不存在,建立目录
file:即便文件不存在,也不会被建立
link:建立软连接;hard:建立硬连接
touch:若是文件不存在,则会建立一个新的文件,若是已存在,则更新其最后修改时间
absent:删除目录/文件或者取消连接文件
[root@Printer ~]# ansible fangwei -m file -a 'path=/root/ninngenn.cfg state=touch'
Snipeit | CHANGED => {
"changed": true,
"dest": "/root/ninngenn.cfg",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"size": 0,
"state": "file",
"uid": 0
}
EMRtest | CHANGED => {
"changed": true,
"dest": "/root/ninngenn.cfg",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"size": 0,
"state": "file",
"uid": 0
}
复制代码
Copy模块主要用于复制文件到远程主机。具体参数以下:
[root@Printer ~]# ansible fangwei -m copy -a 'src=/root/ninngenn.cfg dest=/root/ninngenn.cfg force=yes'
EMRtest | CHANGED => {
"changed": true,
"checksum": "458bd6a39e16bc1e00255b66c67b5cb92180166b",
"dest": "/root/ninngenn.cfg",
"gid": 0,
"group": "root",
"md5sum": "cf35206b8cca3e51082bb32ce278ed8d",
"mode": "0644",
"owner": "root",
"size": 56,
"src": "/root/.ansible/tmp/ansible-tmp-1551949966.41-24885251361529/source",
"state": "file",
"uid": 0
}
Snipeit | CHANGED => {
"changed": true,
"checksum": "458bd6a39e16bc1e00255b66c67b5cb92180166b",
"dest": "/root/ninngenn.cfg",
"gid": 0,
"group": "root",
"md5sum": "cf35206b8cca3e51082bb32ce278ed8d",
"mode": "0644",
"owner": "root",
"size": 56,
"src": "/root/.ansible/tmp/ansible-tmp-1551949966.4-190980703709511/source",
"state": "file",
"uid": 0
}
复制代码
用于受管机服务的配置与管理,相似于systemd,经常使用选项:
[root@Printer ~]# ansible fangwei -m service -a 'name=sshd state=restarted enabled=yes'
Snipeit | CHANGED => {
"changed": true,
"enabled": true,
"name": "sshd",
"state": "started"
}
EMRtest | CHANGED => {
"changed": true,
"enabled": true,
"name": "sshd",
"state": "started"
}
复制代码
相似于Linux的Crontab功能,用来控制服务或者进程的定时执行功能。经常使用参数:
[root@Printer ~]# ansible fangwei -m cron -a 'name="check home directory" minute=*/10 job="ls -lht /home"'
Snipeit | CHANGED => {
"changed": true,
"envs": [],
"jobs": [
"check home directory"
]
}
EMRtest | CHANGED => {
"changed": true,
"envs": [],
"jobs": [
"check home directory"
]
}
复制代码
FileSystem模块用于配置受管机的文件系统。改模块涉及高位操做,请务必当心,经常使用参数为:
[root@Printer ~]# ansible test_hosts -m filesystem -a 'dev=/dev/sdb fstype=ext4'
172.26.0.84 | SUCCESS => {
"changed": true
}
复制代码
Mount模块用于配置受管机的磁盘挂载,高危模块,请慎重使用,下面为经常使用参数:
present:只处理fstab中的配置
absent:删除挂载点
mounted:自动建立挂载点并挂载
unmounted:卸载
[root@Ansible ~]# ansible test_hosts -m mount -a 'name=/mnt src=/dev/sdb1 fstype=ext4 state=mounted opts=rw'
172.26.0.84 | SUCCESS => {
"changed": true,
"dump": "0",
"fstab": "/etc/fstab",
"fstype": "ext4",
"name": "/mnt",
"opts": "rw",
"passno": "0",
"src": "/dev/sdb1"
复制代码
若是熟悉CentOS的朋友应该就会知道,这是使用yum包管理器来管理软件包的模块,参数以下:
[root@Printer ~]# ansible fangwei -m yum -a 'name=sl state=latest'
Snipeit | CHANGED => {
"ansible_facts": {
"pkg_mgr": "yum"
},
"changed": true,
"msg": "",
"obsoletes": {
"grub2": {
"dist": "x86_64",
"repo": "@anaconda",
"version": "1:2.02-0.65.el7.centos.2"
},
"grub2-tools": {
"dist": "x86_64",
"repo": "@anaconda",
"version": "1:2.02-0.65.el7.centos.2"
}
},
"rc": 0,
"results": [
"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * ius: dfw.mirror.rackspace.com\n * webtatic: uk.repo.webtatic.com\nResolving Dependencies\n--> Running transaction check\n---> Package sl.x86_64 0:5.02-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nInstalling:\n sl x86_64 5.02-1.el7 epel 14 k\n\nTransaction Summary\n================================================================================\nInstall 1 Package\n\nTotal download size: 14 k\nInstalled size: 17 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : sl-5.02-1.el7.x86_64 1/1 \n Verifying : sl-5.02-1.el7.x86_64 1/1 \n\nInstalled:\n sl.x86_64 0:5.02-1.el7 \n\nComplete!\n"
]
}
EMRtest | CHANGED => {
"ansible_facts": {
"pkg_mgr": "yum"
},
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\nResolving Dependencies\n--> Running transaction check\n---> Package sl.x86_64 0:5.02-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nInstalling:\n sl x86_64 5.02-1.el7 epel 14 k\n\nTransaction Summary\n================================================================================\nInstall 1 Package\n\nTotal download size: 14 k\nInstalled size: 17 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : sl-5.02-1.el7.x86_64 1/1 \n Verifying : sl-5.02-1.el7.x86_64 1/1 \n\nInstalled:\n sl.x86_64 0:5.02-1.el7 \n\nComplete!\n"
]
}
复制代码
User模块顾名思义就是用于用户参数设置的模块。经常使用参数:
[root@Ansible ~]# ansible test_hosts -m user -a 'name=user1 uid=1001 group=yfshare createhome=yes home=/home/user1 password="P@ssw0rd" shell=/bin/bash state=present'
172.26.0.84 | SUCCESS => {
"changed": true,
"comment": "",
"createhome": true,
"group": 1000,
"home": "/home/user1",
"name": "user1",
"password": "NOT_LOGGING_PASSWORD",
"shell": "/bin/bash",
"state": "present",
"system": false,
"uid": 1001
}
复制代码
顾名思义用于配置Group信息的模块,参数以下:
主要用于从http、ftp、https服务器上下载文件(相似于wget),主要参数以下:
[root@Printer ~]# ansible fangwei -m get_url -a 'dest=/root url=http://172.26.0.84/file/drivers/Canon/mac-10-14-canon.dmg'
EMRtest | CHANGED => {
"changed": true,
"checksum_dest": null,
"checksum_src": "eff3bd83c5966373f04d8c4576cbbe610ba0d638",
"dest": "/root/mac-10-14-canon.dmg",
"gid": 0,
"group": "root",
"md5sum": "59b6a0a3dcb9dd3e6e46d1e8374d9c43",
"mode": "0644",
"msg": "OK (23166785 bytes)",
"owner": "root",
"size": 23166785,
"src": "/root/.ansible/tmp/ansible-tmp-1551951882.53-86480089864174/tmp_7guIp",
"state": "file",
"status_code": 200,
"uid": 0,
"url": "http://172.26.0.84/file/drivers/Canon/mac-10-14-canon.dmg"
}
Snipeit | CHANGED => {
"changed": true,
"checksum_dest": null,
"checksum_src": "eff3bd83c5966373f04d8c4576cbbe610ba0d638",
"dest": "/root/mac-10-14-canon.dmg",
"gid": 0,
"group": "root",
"md5sum": "59b6a0a3dcb9dd3e6e46d1e8374d9c43",
"mode": "0644",
"msg": "OK (23166785 bytes)",
"owner": "root",
"size": 23166785,
"src": "/root/.ansible/tmp/ansible-tmp-1551951882.52-38856232211770/tmpPLN4Wf",
"state": "file",
"status_code": 200,
"uid": 0,
"url": "http://172.26.0.84/file/drivers/Canon/mac-10-14-canon.dmg"
复制代码
playbooks自动收集远程主机上可用变量,这些变量用于playbooks配置。
[root@Ansible ~]# ansible test_hosts -m setup
172.26.0.84 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"172.26.0.84"
],
"ansible_all_ipv6_addresses": [
"fe80:****:****:fe5c:dc6d"
],
"ansible_architecture": "x86_64",
复制代码
这个模块用于在受管机上执行sh脚本。
[root@Ansible ~]# ansible test_hosts -m script -a '/tmp/script.sh'
Enter passphrase for key '/root/.ssh/id_rsa':
172.26.0.84 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 172.26.0.84 closed.\r\n",
"stdout": "",
"stdout_lines": []
复制代码
Yaml语言是一种配置语言,主要用于配置文件的设定和数据块的储存,做为一种xml语言的进化形态出现。起主要的优点在于:
上面5条也就是XML不足的地方。同时,YAML也有XML的下列优势:
更多的内容及规范参见yaml官网。 语法结构经过空格来展现。Sequence里的项用"-"来表明,Map里的键值对用":"分隔。 这几乎就是全部的语法了。如下为一个标准的ansible-playbook的yaml配置文件:
---
- hosts: rotest2
roles:
- sshd
- snmp
- hostname
- vim
- parted
- authorized_keys
复制代码
roles:角色(主模块,和主yaml文件、ansible配置文件、host文件同在playbook根目录,同时在roles文件夹下则是各类自定义的role。在role文件夹下才包括了后续的其余次级模块)
root@Ansible ~/ansible-test $ ls
ansible.cfg hosts roles main.yml
root@Ansible ~/ansible-test/roles $ ls
audit authorized_keys hostname megacli nrpe parted snmp sshd telegraf vim
复制代码
在role文件夹下,会调用下面的各个子模块,可是除了task之外都不是必须,而是可选项。例如这个telegraf的部署role,下面只包含了files、handlers、tasks三个子模块。在子模块中咱们能够调用任何ansible支持的模块功能,尤为是上一章咱们介绍的那些重要功能模块。
root@Ansible ~/ansible-test/roles/telegraf $ ls
files handlers tasks
复制代码
ansible-playbook的使用基本和ansible相似,哪怕调用--help
指令查看,也是同样的参数结果。通常来讲因为playbook调用的模块较多,配置的内容较丰富,后续的部署影响较大,因此在使用的时候请务必先调用-D -C
两个参数进行结果测试,排查报错,确认一切无误后再进行推送和部署。例如:
~$ ansible-playbook -i hosts ro.yml -t authorized_keys -DC
~$ ansible-playbook -i hosts ro.yml -t authorized_keys
复制代码
这里咱们就用一个案例来对ansible-playbook进行详细的解释。这个案例比较完整,有助于咱们方便理解。 这个案例的文件架构为:
root@Ansible ~/ansible-test $ ls
ansible.cfg hosts roles main.yml
复制代码
具体的main.yml
文件为:
root@Ansible ~/ansible-test $ cat main.yml
---
- hosts: test
roles:
- sshd
- snmp
- hostname
- vim
- parted
- authorized_keys
- telegraf
- audit
复制代码
咱们进入roles
文件夹,查看具体的role内容。
root@Ansible ~/ansible-test/roles $ ls
audit authorized_keys hostname megacli nrpe parted snmp sshd telegraf vim
复制代码
若是咱们须要在受管机上安装某个软件,以telegraf这个role为例:
root@Ansible ~/ansible-test/roles/telegraf $ tree
.
├── files
│ ├── telegraf-1.8.0-1.x86_64.rpm #安装包rpm文件
│ ├── telegraf.conf #自定义的配置文件
│ └── telegraf.conf.bak #原始默认配置文件(非必须)
├── handlers
│ └── main.yml #处理器配置
└── tasks
└── main.yml #role的任务主配置
3 directories, 5 files
-------------------------------------
root@Ansible ~/ansible-test/roles/telegraf $ cat ./tasks/main.yml
---
- name: install telegraf #配置npm的下载地址
yum: name=https://dl.influxdata.com/telegraf/releases/telegraf-1.8.0-1.x86_64.rpm state=present
tags: telegraf
- name: copy telegraf config #配置文件的复制
copy: src=telegraf.conf dest=/etc/telegraf/
notify: reload telegraf
tags: telegraf
- name: ensure service telegraf is started and enabled
service: name=telegraf state=started enabled=yes
tags: telegraf #确保在受管机上开机启动telegraf服务
-------------------------------------
root@Ansible ~/ansible-test/roles/telegraf $ cat ./handlers/main.yml
---
- name: reload telegraf #异常情况从新加载
service: name=telegraf state=reloaded
复制代码
而对于部分复杂的配置需求,咱们甚至可使用shell脚原本对受管机进行相关的处理,例如磁盘挂载或者分配等系统级别的任务。
root@Ansible ~/ansible-test/roles/parted $ ls
files tasks
-------------------------------------
root@Ansible ~/ansible-test/roles/parted $ tree
.
├── files
│ ├── parted.sh #shell脚本文件
│ └── parted.sh.bak
└── tasks
└── main.yml #主task配置
2 directories, 3 files
-------------------------------------
root@Ansible ~/ansible-test/roles/parted $ cat files/parted.sh
#!/bin/bash
OPTS="noatime,nobarrier,errors=remount-ro,nofail"
x=b
#for x in {b}
#do
echo "mkpart /dev/vd${x}"
parted /dev/vd${x} -s mklabel gpt
parted /dev/vd${x} -s mkpart primary 1 100%
echo ">>> mkfs.ext4 /dev/vd${x}1"
mkfs.ext4 -q /dev/vd${x}1
if [ $? -eq 0 ]; then
UUID=$(blkid /dev/vd${x}1 | sed -e 's/.*\(UUID=.*\) TYPE.*/\1/')
echo -e "${UUID}\t\t/data\t\text4\t\t${OPTS}\t\t0 0" >> /etc/fstab
fi
seq=$(($seq+1))
#done #经过shell脚本进行磁盘的分区与挂载
-------------------------------------
root@Ansible ~/ansible-test/roles/parted $ cat tasks/main.yml
---
#parted
- name: copy parted config
copy: src={{ item }} dest=~ owner=root group=root mode="0777"
with_items: #复制脚本到受管机并配置chown权限
- parted.sh #执行shell脚本
tags: parted
复制代码
关于playbook的其余功能你们能够经过实践和阅读其余案例来学习,ansible很是灵活,请务必善于使用。