【运维知识进阶篇】Ansible Roles详解

news/2024/5/9 8:25:21 标签: 运维, ansible, linux, centos, 系统架构

在使用Ansible写一键部署的时候,我们不可能把所有的操作都写入一个playbook中,这样不利于后面的排错,我们希望把文件根据不同的工作模块拆分开来,解耦,所以我们需要学习官方推荐的roles,因为roles的目录结构层次非常清晰,可以清晰我们的编写思路,优化我们的工作效率。

Ansible Roles目录结构

[root@Ansible ~]# mkdir /ansible/roles    #roles目录默认在/etc/ansible/roles,也可以自定义,我把ansible放在了根下,所以roles也跟着放在根目录下的ansible
[root@Ansible ~]# cd /ansible/roles
[root@Ansible roles]# ansible-galaxy init test
- Role test was created successfully
[root@Ansible roles]# tree
.
└── test
    ├── defaults             #默认文件存放位置
    │   └── main.yml
    ├── files                #配置文件存放位置
    ├── handlers             #handler存放位置
    │   └── main.yml
    ├── meta                 #存放角色依赖的位置,比如要安装wordpress,我们需要先安装nginx和php,我们把playbook引用在这里,会优先执行这里的内容
    │   └── main.yml
    ├── README.md
    ├── tasks                
    │   └── main.yml         #建议每个roles只使用一个tasks,方便我们去调用
    ├── templates            #带变量文件存放位置
    ├── tests                
    │   ├── inventory
    │   └── test.yml
    └── vars                 #变量存放位置
        └── main.yml

9 directories, 8 files
[root@Ansible roles]# 

Ansible Roles依赖关系

role允许在使用roles时自动引入其他的roles,role依赖关系存储在roles目录中meta/main.yml文件中。

以部署wordpress项目为例,前提是安装nginx和php,把服务跑起来,才能运行wordpress页面,此时,我们可以在wordpress的roles中定义依赖nginx和php的roles

[root@Ansible roles]# ansible-galaxy init wordpress
[root@Ansible roles]# cat /ansible/roles/wordpress/meta/main.yml
dependencies:
  - { role: nginx }
  - { role: php }

如果编写了meta目录下的main.yml文件,那么Ansible会自动先执行meta目录的main.yml文件中的dependencies

Ansible Roles实践

1、roles小技巧

创建roles目录结构,进入roles目录后,使用ansible-galaxy init test自动创建

2、roles重构rsync

1、创建目录结构

[root@Ansible ~]# cd /ansible/roles/
[root@Ansible roles]# ll
total 0
[root@Ansible roles]# ansible-galaxy init rsync
- Role rsync was created successfully
[root@Ansible roles]# tss
-bash: tss: command not found
[root@Ansible roles]# tree
.
└── rsync
    ├── defaults
    │   └── main.yml
    ├── files
    ├── handlers
    │   └── main.yml
    ├── meta
    │   └── main.yml
    ├── README.md
    ├── tasks
    │   └── main.yml
    ├── templates
    ├── tests
    │   ├── inventory
    │   └── test.yml
    └── vars
        └── main.yml

9 directories, 8 files

2、定义主机列表,定义在roles目录下面,方便打包的时候可以-i hosts直接调用

[root@Ansible roles]# cat hosts
[backup]
172.16.1.41

3、指定backup主机组,执行哪个roles

[root@Ansible roles]# cat site.yml
- hosts: backup
  remote_user: root
  roles:
    - rsync

4、编写rsync角色的tasks任务 

[root@Ansible ~]# cat /ansible/roles/rsync/tasks/main.yml 
- name: install rsync server
  yum:
    name: rsync
    state: present
- name: configure rsync server
  template:
    src: "{{ item.src }}"
    dest: /etc/{{ item.dest }}
    mode: "{{ item.mode }}"
  loop:
    - { src: "rsyncd.conf.j2" ,dest: "rsynd.conf" ,mode: "0644"}
    - { src: "rsync.passwd.j2" ,dest: "rsync.passwd" ,mode: "0600"}
  notify: restart rsync server
- name: start rsync server
  systemd:
    name: rsyncd
    state: started
    enabled: yes
- name: create group "{{ rsync_dir }}"
  file:
    path: /{{ rsync_dir }}
    state: directory
    owner: "{{ rs_user }}"
    group: "{{ rsg_user }}"

5、编写rsync角色的handlers

[root@Ansible roles]# cat rsync/handlers/main.yml
- name: restart rsync server
  service:
    name: rsyncd
    state: restarted

6、收集rsync角色的配置文件至files目录

[root@Ansible roles]# ll /ansible/roles/rsync/templates/
total 8
-rw-r--r-- 1 root root 318 Apr 20 17:49 rsyncd.conf.j2
-rw-r--r-- 1 root root  24 Apr 20 17:50 rsyncd.passwd.j2

[root@Ansible roles]# cat /ansible/roles/rsync/templates/rsyncd.conf.j2
uid = {{ rs_user }}
gid = {{ rsg_user }}
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[backup]
path = /backup

[root@Ansible roles]# cat /ansible/roles/rsync/templates/rsyncd.passwd.j2
rsync_backup:{{ pass }}

7、编写变量配置文件所需的变量

[root@Ansible roles]# cat rsync/vars/main.yml
rs_user : www
rsg_user : www
pass : 123456
rsync_dir: /backup

8、执行roles,测试rsync角色执行效果

[root@Ansible roles]# ansible-playbook -i hosts site.yml 

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

TASK [Gathering Facts] *********************************************************
ok: [172.16.1.31]
ok: [172.16.1.41]

TASK [install rsync server] ****************************************************
skipping: [172.16.1.31]
ok: [172.16.1.41]

TASK [configure rsync server] **************************************************
skipping: [172.16.1.31] => (item={u'dest': u'rsynd.conf', u'src': u'rsyncd.conf.j2', u'mode': u'0644'}) 
skipping: [172.16.1.31] => (item={u'dest': u'rsync.passwd', u'src': u'rsync.passwd.j2', u'mode': u'0600'}) 
ok: [172.16.1.41] => (item={u'dest': u'rsynd.conf', u'src': u'rsyncd.conf.j2', u'mode': u'0644'})
changed: [172.16.1.41] => (item={u'dest': u'rsync.passwd', u'src': u'rsync.passwd.j2', u'mode': u'0600'})

TASK [start rsync server] ******************************************************
skipping: [172.16.1.31]
ok: [172.16.1.41]

TASK [rsync : create group "/backup"] ******************************************
skipping: [172.16.1.31]
ok: [172.16.1.41]

RUNNING HANDLER [restart rsync server] *****************************************
changed: [172.16.1.41]

PLAY RECAP *********************************************************************
172.16.1.31                : ok=1    changed=0    unreachable=0    failed=0    skipped=4    rescued=0    ignored=0   
172.16.1.41                : ok=6    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

3、roles重构nfs

1、构建nfs的用户目录

[root@Ansible ~]# cd /ansible/roles/
[root@Ansible roles]# ansible-galaxy init nfs
- Role nfs was created successfully
[root@Ansible roles]# tree nfs
nfs
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

8 directories, 8 files

2、 定义roles主机清单

[root@Ansible roles]# cat hosts
[nfs]
172.16.1.31

[backup]
172.16.1.41

3、指定nfs主机组,执行哪个roles

[root@Ansible roles]# cat site.yml
- hosts: all
  roles:
    - role: nfs                                #此处是用的相对路径找的nfs
      when: ansible_hostname is match "NFS" 
    - role: rsync
      when: ansible_hostname is match "rsync"

4、编写nfs的tasks

[root@Ansible nfs]# cat tasks/main.yml 
- name: install nfs server
  yum:
    name: nfs-utils
    state: present
- name: configure nfs server
  template:
    src: exports
    dest: /etc/exports
  notify: restart nfs server
- name: create directory data
  file:
    path: "{{ share_dir }}"
    state: directory
    owner: www
    group: www
    mode: 0755
- name: start nfs server
  systemd:
    name: nfs
    state: started
    enabled: yes

 5、编写nfs角色的handlers

[root@Ansible roles]# cat nfs/handlers/main.yml
- name: restart nfs server
  systemd:
    name: nfs
    state: restarted

6、 准备nfs所需配置文件

[root@Ansible roles]# cat nfs/templates/exports
{{ share_dir }} {{ share_ip }}(rw,sync,all_squash,anonuid=666,anongid=666)

7、 定义nfs所需的变量

[root@Ansible roles]# cat nfs/vars/main.yml 
share_dir: /data
share_ip : 172.16.1.0/24

8、执行roles,测试nfs角色执行效果

[root@Ansible roles]# ansible-playbook -i hosts site.yml 

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

TASK [Gathering Facts] *********************************************************
ok: [172.16.1.41]
ok: [172.16.1.31]

TASK [install nfs server] ******************************************************
skipping: [172.16.1.41]
ok: [172.16.1.31]

TASK [configure nfs server] ****************************************************
skipping: [172.16.1.41]
changed: [172.16.1.31]

TASK [nfs : create directory data] *********************************************
skipping: [172.16.1.41]
ok: [172.16.1.31]

TASK [start nfs server] ********************************************************
skipping: [172.16.1.41]
ok: [172.16.1.31]

RUNNING HANDLER [restart nfs server] *******************************************
changed: [172.16.1.31]

PLAY RECAP *********************************************************************
172.16.1.31                : ok=6    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.41                : ok=1    changed=0    unreachable=0    failed=0    skipped=4    rescued=0    ignored=0  

Ansible Galaxy

Galaxy是一个免费网站,类似于github,网站上基本都是共享roles,从Galaxy下载roles是最快启动项目方式之一

ansible提供了一个命令ansible-galaxy,可以用来对roles项目进行初始化,查找,安装,移除等操作。

[root@Ansible ~]# ansible-galaxy --help    #查看帮助

1、使用galaxy搜索项目

[root@Ansible ~]# ansible-galaxy search openvpn

2、查看详细信息

[root@Ansible ~]# ansible-galaxy info kostyrevaa.openvpn

3、安装项目

[root@Ansible ~]# ansible-galaxy install kyl191.openvpn

我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!


http://www.niftyadmin.cn/n/393980.html

相关文章

利用线程池来控制访问频率

背景:某资源的查询接口,一共有四个渠道,均要调用查询接口落缓存,且均有QPS限制,现要通过线程池配置来控制查询频率。 渠道A渠道B渠道C渠道DQPS52102 思路:通过涉及线程池中的核心线程数、最大线程数、队列…

JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO

JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO 这是一篇总结文章。 文章目录 JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO1、学习技术的梳理1.1、jdbc的引入1.2、ResultSet[结果集]1.3API小结 2、数据库连接池3、Apache公司的DBUtils工具-BasicDAO…

连接万物,创造未来,多角度看物联网技术如何影响我们的生活

连接万物,创造未来。从智能家居到智慧医疗,从智能车联到智慧城市,物联网技术的影响已经悄然渗透到了我们的方方面面。接下来我们将从物联网技术概述、发展的历史原因、物联网技术应用、创新和挑战几个角度深度了解物联网已经深入我们日常生活…

网络安全学术顶会——NDSS 2023 议题清单、摘要与总结(下)

51、Let Me Unwind That For You: Exceptions to Backward-Edge Protection 通过堆栈缓冲区溢出进行反向边控制流劫持是软件利用的终极目标。直接控制关键的堆栈数据和劫持目标使得攻击者特别喜欢这种利用策略。因此,社区已经部署了强大的反向边保护,如影…

20230531----重返学习-redux总步骤-TaskOA-react路由管理方案react-router-dom

day-082-eighty-two-20230531-redux总步骤-TaskOA-react路由管理方案react-router-dom redux总步骤 确定基础骨架目录。 fang/f20230531/src/store/index.jsfang/f20230531/src/store/reducers/ fang/f20230531/src/store/reducers/index.jsfang/f20230531/src/store/reducers…

【Linux】基本开发工具包使用

目录 一, yum ——linux软件包管理器 1. 软件包是啥子? 2. yum基本使用 1. 步骤: 2. 开发工具推荐(centos 7.6) 二,vim —— linux文本编辑器 1. Normal mode —— 命令模式(记不住没关系&#x…

Spring(四)基于xml的自动装配

自动装配:根据指定的策略,在IOC容器中匹配某一个bean,自动为指定的bean中所依赖的类类型或接口类型属性赋值。 首先我们来熟悉三层架构的创建过程: 三层架构为controller层,service层,dao层。 在service层里面创建ser…

​LeetCode解法汇总2465. 不同的平均值数目

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给你一个下标从 0 开始长度为 偶数 的整数数组 nums 。 只要 nums 不是 空数组…