Fork me on GitHub

role

Ad-Hoc适用于临时命令的执行,Playbook合适中小项目,Roles适合大项目

构建role

Roles主要依赖于目录的命名和摆放,默认tasks/main.yaml是所有任务的入口,所以使用Roles的过程可以理解为目录规范化命名的过程

role_name/
  meta/
  tasks/

每个目录下均由main.yaml定义该功能的任务集

tasks/main.yaml默认执行所有指定的任务

roles的调用文件playbook_role.yaml内容如下

---
  - hosts: all
    roles:
     - role_name

这样,目录名为 role_name 下的tasks/main.yaml下的所有任务都会被执行

ansible-playbook playbook_role.yaml

role 目录可以在/etc/ansible/ansible.cfg中通过role_path定义,也可以在playbook_role.yaml所在同级目录下

fab2ansible
├── group_vars│ 
│             └── all
├── roles│ 
         ├── git│ 
         │ ├── files│ 
         │ │ └── main.yaml│ 
         │ ├── tasks│ 
         │ │ ├── create_dir.yaml│ 
         │ │ ├── git_checkout.yaml│ 
         │ │ ├── main.yaml│ 
         │ │ └── static_git_pull.yaml│ 
         │ └── vars│ 
         │ └── main.yaml│ 
         └── user│ 
         ├── tasks│ 
         │ ├── main.yaml│ 
         │ └── user-config.yaml│ 
         └── vars│ 
         └── main.yaml
└── playbook_role.yaml

Roles模块调用结构

编辑roles目录

变量文件

group_vars/all 文件

---
# 以下列出的变量对所有主机和组有效,即全局有效
---
repository_static: "https://github.com/ansible/ansible.git"
package_dir: "/opt/"
project: "ansible"
git_commit: "devel"
flag: "2.17.3"
username: "test"
service_name: "memcached"

group_vars目录下的文件定义Roles中调用的变量,Roles对应调用该目录同名文件中定义的变量,文件名为all的文件定义的变量针对所有Roles生效

调用role

playbook_role.yaml

---
  - hosts: ubuntu
    roles:
    - role: git

reoles 是关键字
role: git 表示调用git角色
如果也想调用多个其他角色只需要添加列表元素

---
...
    roles:
    - role: git
    - role: user
    - role: config

tasks main 文件

roles/git/tasks/main.yaml

---
   #设置调用git模块实现的功能
   - import_tasks: create_dir.yaml
   - import_tasks: static_git_pull.yaml
   - import_tasks: git_checkout.yaml

import_tasks: 用于静态引用任务

include_tasks: 用于动态引用任务

import_playbook: 可以在主playbook文件中静态引入子剧本
如果要在任务中引入playbook,可以通过command模块指定ansible-playbook 执行,不推荐这样做

playbook文件只建议在主playbook中引入,如果有其他引入方式,说明规划没做好,是编写者的问题

tasks create_dir.yaml,git_checkout.yaml,static_git_pull.yaml 文件

roles/git/tasks/create_dir.yaml

---
# 这些任务负责检出git变量
#
- name: create dir
  file: 
    path: "{{ package_dir }}{{ project }}-release-{{ git_commit}}/{{ flag}}-{{ project }}" 
    owner: "{{ username }}" 
    group: "{{ username }}"  
    mode: 0755 
    recurse: yes 
    state: directory

roles/git/tasks/git_checkout.yaml

---
# 这些任务负责检出git变量
- name: Git init before git pull
  command: /usr/bin/git fetch
  args:
       chdir: "{{ package_dir }}{{ project }}-release-{{ git_commit }}/{{ flag }}-{{ project }}"
- name: Git reset
  command: /usr/bin/git reset --hard
  args:
       chdir: "{{ package_dir }}{{ project }}-release-{{ git_commit }}/{{ flag }}-{{ project }}"
- name: Git checkout
  command: /usr/bin/git checkout {{ git_commit }}
  args:
       chdir: "{{ package_dir }}{{ project }}-release-{{ git_commit }}/{{ flag }}-{{ project }}"

roles/git/tasks/static_git_pull.yaml

---
    - name: Git pull
      git: 
        repo: "{{ repository_static }}"
        dest: "{{ package_dir }}{{ project }}-release-{{ git_commit }}/{{ flag }}-{{ project }}"
        version: "{{ git_commit }}" 
        force: yes # git模块,结合Ansible后用于自动化版本管理

ansible-playbook playbook_role.yml

PLAY [ubuntu] *****

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

TASK [git : create dir] *****
changed: [107.151.199.209]

TASK [git : Git pull] *****
changed: [107.151.199.209]

TASK [git : Git pull] *****
ok: [107.151.199.209]

TASK [git : Git init before git pull] *****
changed: [107.151.199.209]

TASK [git : Git reset] *****
changed: [107.151.199.209]

TASK [git : Git checkout] *****
changed: [107.151.199.209]

PLAY RECAP *****
107.151.199.209            : ok=7    changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
posted on 2024-08-21 11:10  anyux  阅读(35)  评论(0)    收藏  举报