Roles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。基于 roles 对内容进行分组,使得我们可以容易地与其他用户分享 roles。 这样的组织方式使得复用更为简便。每个相对独立的处理动作独立出来,可以适用于更复杂的场景。
一个role 的文件大概包括这些:
- tasks 文件:主要编写某个独立模块的处理动作
- handlers 文件:
- vars 文件: 主要编写某个独立模块的变量
- meta 文件:主要编写依赖关系,即一个独立模块引用另一个role
- defaults 文件:默认的变量文件
- templates 文件: 模板文件
- files 文件
注意文件夹下可以有多个后缀名为yml的文件,但一定要有main.yml 文件
检索路径
在不使用绝对路径的情况下,ansible检索role的默认路径有:
- 执行ansible-playbook命令时所在的当前目录
- playbook文件所在的目录及playbook文件所在目录的roles目录
- 当前系统用户下的~/.ansible/roles目录
- /usr/share/ansible/roles目录
- ansible.cfg 中roles_path指定的目录,默认值为/etc/ansible/roles目录
示例:
- 拷贝管理节点 /home/ubuntu/zartclient 下的 zartcli 和 zartcli.ini 文件至节点主机 /home/centos/zartclient 下
- 在上一步的基础之上,拷贝 /home/centos/zartclient/zartcli 至 /usr/bin/zartcli
- 拷贝管理节点文件/root/yum.tar.gz至节点主机的/home/centos/download目录
- 在节点主机上解压管理节点文件/root/yum.tar.gz至 /temp/data 目录下
- 在节点主机上查看解压后指定文件相应字段
任务执行目录结构如下:
[root@ansible roles_example]# tree
.
├── ansible.cfg
├── hosts
├── roles
│ ├── cat_grep
│ │ └── tasks
│ │ └── main.yml
│ ├── master_copy
│ │ └── tasks
│ │ └── main.yml
│ ├── slave_copy
│ │ ├── defaults
│ │ │ └── main.yml
│ │ └── tasks
│ │ └── main.yml
│ └── unarchive
│ └── tasks
│ └── main.yml
└── role_task.yml
各roles下的tasks文件如下:
[root@ansible roles_example]# cat roles/master_copy/tasks/main.yml
---
- name: is /home/centos/zartclient exists
stat:
path: /home/centos/zartclient
register: result
- name: show result
debug:
msg: "{{result}}"
- name: create dest path in remote
file:
path: "{{item}}"
state: directory
with_items:
- "/home/centos/zartclient"
when: not result.stat.exists
- name: copy file to remote
copy:
src: "{{item.src}}"
dest: "{{item.dest}}"
with_items:
- { src: "/home/centos/zartclient/zartcli", dest: "/home/centos/zartclient" }
- { src: "/home/centos/zartclient/zartcli.ini", dest: "/home/centos/zartclient" }
- name: copy zartcli into /usr/bin
copy:
src: "{{item.src}}"
dest: "{{item.dest}}"
with_items:
- { src: "/home/centos/zartclient/zartcli", dest: "/usr/bin"}
##################################################################################
[root@ansible roles_example]# cat roles/slave_copy/tasks/main.yml
---
- name: is /home/centos/download exists
stat:
path: /home/centos/download
register: result
- name: show result
debug:
msg: "{{result}}"
- name: create /home/centos/download
file:
path: "{{item}}"
state: directory
with_items:
- "/home/centos/download"
when: not result.stat.exists
- name: copy tar_file to remote
copy:
src: "{{master_file}}"
dest: "{{slave_file}}"
# vars: //变量存放至defaults目录,如下所示
# master_file: /root/yum.tar.gz
# slave_file: /home/centos/download
**************************************************************************************************
[root@ansible roles_example]# cat roles/slave_copy/defaults/main.yml
---
#files
master_file: /root/yum.tar.gz
slave_file: /home/centos/download
##################################################################################
[root@ansible roles_example]# cat roles/unarchive/tasks/main.yml
---
- name: create /temp/data
file:
path: "/temp/data"
state: directory
- name: untar file
unarchive:
src: "{{src_path}}" //src为管理主机上的压缩文件
dest: "{{dest_path}}" //dest为远程目标主机的目录
remote_src: False //远程节点不存在要解压的源文件时,则将管理节点文件解压至节点主机
vars:
src_path: "/root/yum.tar.gz"
dest_path: "/temp/data"
##################################################################################
[root@ansible roles_example]# cat roles/cat_grep/tasks/main.yml
---
- name: cat file
shell: cat /temp/data/epel.repo|grep gpgkey
register: result
- name: cat
debug:
msg: "{{result.stdout}}"
任务执行文件如下:
[root@ansible roles_example]# cat role_task.yml
---
- hosts: all
user: root
tasks:
- include_role:
name: master_copy
- include_role:
name: slave_copy
- include_role:
name: unarchive
- include_role:
name: cat_grep
任务执行情况如下:
[root@ansible roles_example]# ansible-playbook -i hosts role_task.yml
PLAY [all] ******************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************
ok: [192.168.2.109]
TASK [include_role] *********************************************************************************************
TASK [master_copy : is /home/centos/zartclient exists] **********************************************************
ok: [192.168.2.109]
TASK [master_copy : show result] ********************************************************************************
ok: [192.168.2.109] => {
"msg": {
"changed": false,
"failed": false,
"stat": {
"exists": false
}
}
}
TASK [master_copy : create dest path in remote] *****************************************************************
changed: [192.168.2.109] => (item=/home/centos/zartclient)
TASK [master_copy : copy file to remote] ************************************************************************
changed: [192.168.2.109] => (item={u'dest': u'/home/centos/zartclient', u'src': u'/home/centos/zartclient/zartcli'})
changed: [192.168.2.109] => (item={u'dest': u'/home/centos/zartclient', u'src': u'/home/centos/zartclient/zartcli.ini'})
TASK [master_copy : copy zartcli into /usr/bin] *****************************************************************
changed: [192.168.2.109] => (item={u'dest': u'/usr/bin', u'src': u'/home/centos/zartclient/zartcli'})
TASK [include_role] *********************************************************************************************
TASK [slave_copy : is /home/centos/download exists] *************************************************************
ok: [192.168.2.109]
TASK [slave_copy : show result] *********************************************************************************
ok: [192.168.2.109] => {
"msg": {
"changed": false,
"failed": false,
"stat": {
"exists": false
}
}
}
TASK [slave_copy : create /home/centos/download] ****************************************************************
changed: [192.168.2.109] => (item=/home/centos/download)
TASK [slave_copy : copy tar_file to remote] *********************************************************************
changed: [192.168.2.109]
TASK [include_role] *********************************************************************************************
TASK [unarchive : create /temp/data] ****************************************************************************
changed: [192.168.2.109]
TASK [unarchive : untar file] ***********************************************************************************
changed: [192.168.2.109]
TASK [include_role] *********************************************************************************************
TASK [cat_grep : cat file] **************************************************************************************
changed: [192.168.2.109]
TASK [cat_grep : cat] *******************************************************************************************
ok: [192.168.2.109] => {
"msg": "gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7"
}
PLAY RECAP ******************************************************************************************************
192.168.2.109 : ok=14 changed=8 unreachable=0 failed=0