一:介绍
Ansible 的 Galaxy 工具,类似程序员使用的 github,docker 镜像仓库,yum仓库和deb仓库等。可以将自己编写的 Role 通过 Galaxy 这个平台进行分享。同样,我们也可以通过 Galaxy 这个平台去获取一些我们想要的 Role
Galaxy 官网:https://galaxy.ansible.com
ansible-galaxy 则是一个使用 Galaxy 命令行的工具。
二进制文件一般不放到角色中管理,因此我们下载的角色基本都是文本文件
galaxy有银河、星系的意思,没啥特殊含义,就是起了这么个名字
1.获取帮助信息
[root@jettoloader test]# ansible-galaxy -h
usage: ansible-galaxy [-h] [--version] [-v] TYPE ...
Perform various Role and Collection related operations.
positional arguments:
TYPE
collection Manage an Ansible Galaxy collection.
role Manage an Ansible Galaxy role.
optional arguments:
--version show program's version number, config file location,
configured module search path, module location, executable
location and exit
-h, --help show this help message and exit
-v, --verbose verbose mode (-vvv for more, -vvvv to enable connection
debugging)
1.1 ansible-galaxy role:
[root@jettoloader test]# ansible-galaxy role -h
usage: ansible-galaxy role [-h] ROLE_ACTION ...
positional arguments:
ROLE_ACTION
init Initialize new role with the base structure of a role. 初始化新角色的基本结构
remove Delete roles from roles_path.从角色路径中删除角色。
delete Removes the role from Galaxy. It does not remove or alter the
actual GitHub repository. 从Galaxy中删除角色。它不会删除或更改实际的GitHub存储库
list Show the name and version of each role installed in the
roles_path.查看角色列表
search Search the Galaxy database by tags, platforms, author and
multiple keywords.搜索角色
import Import a role.导入角色
setup Manage the integration between Galaxy and the given source.管理Galaxy和给定源之间的集成
info View more details about a specific role.查看有关特定角色的详细信息
install Install role(s) from file(s), URL(s) or Ansible Galaxy.从文件、URL或Ansible Galaxy安装角色
optional arguments:
-h, --help show this help message and exit
1.2 ansible-galaxy collection:
[root@jettoloader test]# ansible-galaxy collection -h
usage: ansible-galaxy collection [-h] COLLECTION_ACTION ...
positional arguments:
COLLECTION_ACTION
init Initialize new collection with the base structure of a
collection.使用集合的基本结构初始化新集合
build Build an Ansible collection artifact that can be publish
to Ansible Galaxy.构建一个可发布到Ansible Galaxy的Ansible集合工件
publish Publish a collection artifact to Ansible Galaxy.向Ansible Galaxy发布一个集合工件
install Install collection(s) from file(s), URL(s) or Ansible
Galaxy.从文件、URL或Ansible Galaxy安装集合
optional arguments:
-h, --help show this help message and exit
1.3 Collections 和role关系:
Collections是Ansible比较新的版本引入的一个概念,它是roles的集合,比如我们可以把很多相关的roles定义成Collections。以下在galaxy 可以看到
Collections:
roles:
大家执行下载命令的时候也可以看到,基本上都是到github上去下载的,毕竟这些roles只是一组文本文件,文件大小都不大,我们也可以自己去github上下载并解压,不过那样还是有些麻烦。
1.4 常用指令
1.4.1)在 galaxy 上搜索共享的 role
[root@jettoloader test]# ansible-galaxy search nginx
Found 1641 roles matching your search. Showing first 1000.
Name Description
---- -----------
0x0i.prometheus Prometheus - a multi-dimensional time-series data monitoring and alerting toolkit
0x5a17ed.ansible_role_netbox Installs and configures NetBox, a DCIM suite, in a production setting.
1davidmichael.ansible-role-nginx Nginx installation for Linux, FreeBSD and OpenBSD.
1it.sudo Ansible role for managing sudoers
1.4.2)安装 galaxy 上共享的 role
[root@jettoloader test]# ansible-galaxy role install -v -p ./ nginx
参考资料
https://docs.ansible.com/ansible/latest/galaxy/user_guide.html
https://galaxy.ansible.com
http://www.ansible.com.cn/docs/galaxy.html
二 案例 nfs
2.1 主机规划
主机名称 | 操作系统版本 | 内网IP | 安装软件 | |
---|---|---|---|---|
172.16.10.21 | CentOS7.5 | 172.16.10.21 | ansible | |
172.16.10.15 | CentOS7.5 | 172.16.10.15 | 不用安装 | |
172.16.10.5 | CentOS7.5 | 172.16.10.5 | 不用安装 |
2.2 添加用户账号
说明:
1、 运维人员使用的登录账号;
2、 所有的业务都放在 /app/jettech 下「jettech用户的家目录」,避免业务数据乱放;
3、 该用户也被 ansible 使用,因为几乎所有的生产环境都是禁止 root 远程登录的(因此该 jettech用户也进行了 sudo 提权)。
# 使用一个专门的用户,避免直接使用root用户
# 添加用户、指定家目录并指定用户密码
# sudo提权
# 让其它普通用户可以进入该目录查看信息
[root@jettoloader k3s-ansible-master]# mkdir /app
[root@jettoloader k3s-ansible-master]# useradd -u 1050 -d /app/jettech -m jettech
[root@jettoloader k3s-ansible-master]# echo '123456aA' | /usr/bin/passwd --stdin jettech
Changing password for user jettech.
passwd: all authentication tokens updated successfully.
[root@jettoloader k3s-ansible-master]# echo "jettech ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
[root@jettoloader k3s-ansible-master]# chmod 755 /app
2.3 Ansible 配置清单Inventory
之后文章都是如下主机配置清单
[root@jettoloader jettech]# cd /app/jettech/
[root@jettoloader jettech]# mkdir ansible
[root@jettoloader ansible]# pwd
/app/jettech/ansible
[root@jettoloader ansible]# cat hosts.ini
[master]
#172.16.10.5 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
#方式1 别名 + 主机 + 端口 + 密码
#web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
#web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
#web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
# 方式2、主机 + 端口 + 密钥
172.16.10.5:22
#[master:vars]
[node]
#172.16.10.15 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
172.16.10.15
172.16.10.21
[k3s_cluster:children]
master
node
[registry]
172.16.10.21
2.4 Ansible Roles 基本概述
前面已经学习了 变量、tasks 和 handlers,那怎样组织 playbook 才是最好的方式呢?
使用 roles。roles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。以便 playbook 更好的调用。相比 playbook,roles 的结构更加的清晰有层次。
2.5 Roles 目录结构
在 roles 目录下,可以使用如下命令创建目录
[root@jettoloader ansible]# mkdir ansible_roles
[root@jettoloader ansible]# cd ansible_roles/
[root@jettoloader ansible_roles]# ansible-galaxy role init roles/nfs
[root@jettoloader ansible]# tree
.
├── ansible_roles
│ └── roles
│ └── nfs #角色名称
│ ├── defaults # 角色默认变量(最低优先级)
│ │ └── main.yml
│ ├── files # 文件存放
│ ├── handlers # 触发任务
│ │ └── main.yml
│ ├── meta # 依赖关系
│ │ └── main.yml
│ ├── README.md # 使用说明
│ ├── tasks # 具体任务
│ │ └── main.yml
│ ├── templates # 模板文件
│ ├── tests # 本role测试
│ │ ├── inventory
│ │ └── test.yml
│ └── vars # 角色其他变量
│ └── main.yml
└── hosts.ini # 主机信息
目录说明:
1、首先要有 roles 目录,然后在 roles 目录下创建相应的目录。
2、roles 下的目录名最好见文知意,如 common 目录表示基础目录,是必要的;nfs 目录表示安装 nfs 服务;redis目录表示安装 redis服务;等等。
3、可以根据自身需要创建 roles 下的二级目录,不需要的目录可以不创建,没需要全目录创建。
4、roles 目录下的二级目录中,有些目录必须包含一个 main.yml 文件,以便 ansible 使用。
2.6 Roles 依赖关系
roles 允许在使用 role 时自动引入其他 role。roles 的依赖关系存储在 role 目录中的 meta/main.yml 文件中。
例如:安装 nfs是需要先确保 nginx和 mysql都能正常运行,此时都可以在 nfs的 role 中定义依赖 nginx和mysql 的 role。
[root@jettoloader ansible]# cat ansible_roles/roles/nfs/meta/main.yml
---
dependencies:
- { role: nginx }
- { role: mysql }
此时 nfs 的 role 会先执行 nginx的 role,然后执行mysql 的 role,最后再执行 nfs 本身的 role。
2.7 Ansible Roles 案例-部署 NFS 服务
2.7.1)整体目录结构
[root@jettoloader ansible_roles]# pwd
/app/jettech/ansible/ansible_roles
[root@jettoloader ansible_roles]# ll
total 4
-rw-r--r-- 1 root root 55 Feb 9 10:39 all.yml
drwxr-xr-x. 2 root root 41 Feb 9 10:31 group_vars
drwxr-xr-x 3 root root 17 Feb 9 10:14 roles
[root@jettoloader ansible_roles]# tree
.
├── all.yml
├── group_vars #全局变量
│ └── all.yml
└── roles
├── nfs # 服务端
│ ├── defaults
│ │ └── main.yml
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── README.md
│ ├── tasks
│ │ ├── config.yml
│ │ ├── install.yml
│ │ ├── main.yml
│ │ ├── mkdir.yml
│ │ ├── start_NFS.yml
│ │ └── start_rpcbind.yml
│ ├── templates
│ │ └── exports.j2
│ ├── tests
│ │ ├── inventory
│ │ └── test.yml
│ └── vars
│ └── main.yml
└── nfs_client #客户端
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
2.7.2)整体目录结构服务端信息
目录结构
[root@jettoloader ansible_roles]# tree roles/nfs
roles/nfs
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ ├── config.yml
│ ├── install.yml
│ ├── main.yml
│ ├── mkdir.yml
│ ├── start_NFS.yml
│ └── start_rpcbind.yml
├── templates
│ └── exports.j2
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 14 files
2.7.2.1)tasks任务目录信息
[root@jettoloader ansible_roles]# cat roles/nfs/tasks/main.yml
---
# tasks file for roles/nfs
- include_tasks: install.yml
- include_tasks: config.yml
- include_tasks: mkdir.yml
- include_tasks: start_rpcbind.yml
- include_tasks: start_NFS.yml
[root@jettoloader ansible_roles]# cat roles/nfs/tasks/install.yml
- name: "install package NFS "
yum:
name:
- nfs-utils
- rpcbind
state: present
[root@jettoloader ansible_roles]# cat roles/nfs/tasks/config.yml
- name: "NFS server config and edit restart"
template:
src: exports.j2
dest: /etc/exports
owner: root
group: root
mode: '644'
notify: "reload NFS server"
[root@jettoloader ansible_roles]# cat roles/nfs/tasks/mkdir.yml
- name: "create NFS dir"
file:
path: "{{ nfs_dir }}"
owner: root
group: root
state: directory
recurse: yes
[root@jettoloader ansible_roles]# cat roles/nfs/tasks/start_rpcbind.yml
- name: "rpcbind server start"
systemd:
name: rpcbind
state: started
daemon_reload: yes
enabled: yes
[root@jettoloader ansible_roles]# cat roles/nfs/tasks/start_NFS.yml
- name: "NFS server start"
systemd:
name: nfs
state: started
daemon_reload: yes
enabled: yes
2.7.2.2)handlers任务目录信息
[root@jettoloader ansible_roles]# cat roles/nfs/handlers/main.yml
---
# handlers file for roles/nfs
- name: "reload NFS server"
systemd:
name: nfs
state: reloaded
2.7.2.2)模板目录信息
[root@jettoloader ansible_roles]# cat roles/nfs/templates/exports.j2
{{ nfs_dir }} *(rw,sync,root_squash,all_squash,anonuid=1050,anongid=1050)
2.7.2.3)变量信息
全局的:
[root@jettoloader ansible_roles]# cat group_vars/all.yml
---
# NFS 服务端目录
nfs_dir: /opt/jettech/work/nfs/data
局部的:
[root@jettoloader ansible_roles]# cat roles/nfs/defaults/main.yml
---
# defaults file for roles/nfs
nfs_dir: /opt/jettech/work/nfs/data
[root@jettoloader ansible_roles]# cat roles/nfs/vars/main.yml
---
# vars file for roles/nfs[root@jettoloader ansible_roles]#
nfs_dir: /opt/jettech/work/nfs/data
优先级: group_vars/all.yml > roles/nfs/vars/main.yml > roles/nfs/defaults/main.yml
2.7.3)整体目录结构客户端信息
2.7.3.1)目录结构,客户端就比较简单了,就一个挂载任务
[root@jettoloader ansible_roles]# tree roles/nfs_client/
roles/nfs_client/
├── 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.7.3.2)tasks任务目录信息
# vars file for roles/nfs[root@jettoloader ansible_roles]# cat roles/nfs_client/tasks/main.yml
---
# tasks file for roles/nfs_client
- name: "mount NFS server"
mount:
src: 172.16.10.21:{{ nfs_dir }}
path: /mnt
fstype: nfs
opts: defaults
state: mounted
2.7.4)playbook 信息
[root@jettoloader ansible_roles]# cat all.yml
---
# NFS server
- hosts: registry
roles:
- nfs
- hosts: node
roles:
- nfs_client
2.7.5) 任务执行
[root@jettoloader ansible_roles]# ansible-playbook -b -i ../hosts.ini --syntax-check all.yml # 语法检测
playbook: all.yml
[root@jettoloader ansible_roles]# ansible-playbook -b -i ../hosts.ini -C all.yml # 预执行,测试执行
PLAY [registry] *******************************************************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************************************************
ok: [172.16.10.21]
TASK [nfs : include_tasks] ********************************************************************************************************************************************************
included: /app/jettech/ansible/ansible_roles/roles/nfs/tasks/install.yml for 172.16.10.21
TASK [nfs : install package NFS] **************************************************************************************************************************************************
ok: [172.16.10.21]
TASK [nfs : include_tasks] ********************************************************************************************************************************************************
included: /app/jettech/ansible/ansible_roles/roles/nfs/tasks/config.yml for 172.16.10.21
TASK [nfs : NFS server config and edit restart] ***********************************************************************************************************************************
ok: [172.16.10.21]
TASK [nfs : include_tasks] ********************************************************************************************************************************************************
included: /app/jettech/ansible/ansible_roles/roles/nfs/tasks/mkdir.yml for 172.16.10.21
TASK [nfs : create NFS dir] *******************************************************************************************************************************************************
ok: [172.16.10.21]
TASK [nfs : include_tasks] ********************************************************************************************************************************************************
included: /app/jettech/ansible/ansible_roles/roles/nfs/tasks/start_rpcbind.yml for 172.16.10.21
TASK [nfs : rpcbind server start] *************************************************************************************************************************************************
ok: [172.16.10.21]
TASK [nfs : include_tasks] ********************************************************************************************************************************************************
included: /app/jettech/ansible/ansible_roles/roles/nfs/tasks/start_NFS.yml for 172.16.10.21
TASK [nfs : NFS server start] *****************************************************************************************************************************************************
ok: [172.16.10.21]
PLAY [node] ***********************************************************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************************************************
ok: [172.16.10.21]
ok: [172.16.10.15]
TASK [nfs_client : mount NFS server] **********************************************
************************************************************************************************
changed: [172.16.10.21]
changed: [172.16.10.15]
PLAY RECAP ************************************************************************************************************************************************************************
172.16.10.15 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.16.10.21 : ok=13 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@jettoloader ansible_roles]# ansible-playbook -b -i ../hosts.ini all.yml # 执行
PLAY [registry] *******************************************************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************************************************
ok: [172.16.10.21]
TASK [nfs : include_tasks] ********************************************************************************************************************************************************
included: /app/jettech/ansible/ansible_roles/roles/nfs/tasks/install.yml for 172.16.10.21
TASK [nfs : install package NFS] **************************************************************************************************************************************************
ok: [172.16.10.21]
TASK [nfs : include_tasks] ********************************************************************************************************************************************************
included: /app/jettech/ansible/ansible_roles/roles/nfs/tasks/config.yml for 172.16.10.21
TASK [nfs : NFS server config and edit restart] ***********************************************************************************************************************************
ok: [172.16.10.21]
TASK [nfs : include_tasks] ********************************************************************************************************************************************************
included: /app/jettech/ansible/ansible_roles/roles/nfs/tasks/mkdir.yml for 172.16.10.21
TASK [nfs : create NFS dir] *******************************************************************************************************************************************************
ok: [172.16.10.21]
TASK [nfs : include_tasks] ********************************************************************************************************************************************************
included: /app/jettech/ansible/ansible_roles/roles/nfs/tasks/start_rpcbind.yml for 172.16.10.21
TASK [nfs : rpcbind server start] *************************************************************************************************************************************************
ok: [172.16.10.21]
TASK [nfs : include_tasks] ********************************************************************************************************************************************************
included: /app/jettech/ansible/ansible_roles/roles/nfs/tasks/start_NFS.yml for 172.16.10.21
TASK [nfs : NFS server start] *****************************************************************************************************************************************************
ok: [172.16.10.21]
PLAY [node] ***********************************************************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************************************************
ok: [172.16.10.21]
ok: [172.16.10.15]
TASK [nfs_client : mount NFS server] **********************************************************************************************************************************************
changed: [172.16.10.21]
changed: [172.16.10.15]
PLAY RECAP ************************************************************************************************************************************************************************
172.16.10.15 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.16.10.21 : ok=13 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2.7.5) 检查各节点挂载 情况:
[root@jettoloader ~]# mount | grep 172
172.16.10.21:/opt/jettech/work/nfs/data on /mnt type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.16.10.15,local_lock=none,addr=172.16.10.21)