Ansible的roles角色详解
1. Roles目录结构
2. Roles基本使用
3. 实例:使用Roles一键部署httpd,memcached(可根据自己需求增加task,以及roles的角色,比如再部署docker,可根据不同主机部署相关的任务,指定tags和hosts。
这个roles主要是将已知的文件结构预先是由roles定义好的,它会自动的加载这里面的文件内容,例如任务handlers,都会自动去加载,也就是roles对已知的进行分类分组,使我们很容易的去管理,roles提供一种层次化和结次化组织你的playbook,这也是我们去使用它的目的,它不像playbook是一个具体的使用,而roles它是一个组织的方式,这种方式也是通过ansible的一个最佳实践。
1. roles的目录结构
它在目录下有个site,yaml,这个是一个统一的入口,因为它会关联很多的文件,所以我们只需要对着这个统一的入口进行操作另外就是角色或者功能模块进行部署,像下面的webservers.yaml和fooservers.yml
site.yml 统一的入口,会关联很多的文件
webservers.yml 角色或者功能模块进行部署
fooservers.yml hosts 角色或者功能模块进行部署
roles/ 角色目录,下面又分为不同的模块
common/ 像common 和webservers,相当于两个模块,common用于存放一些公共资源的地方,例如可能会有很多的项目会用到共同的变量,或者有相同的依赖,那么都可以在common的这模块下去定义,这个模块也可以称为角色,这个角色下面还有很多的目录,像下面的文件都是属于它的目录,这些目录就是区别不同的文件或者不同的任务
files/ 这个是角色部署时用到的文件,例如安装一个包,安装一个软件可能会用到它的一个包,那么这个包可以放在这个位置,
templates/ 这个是它角色部署时用到的模版,例如jinja渲染一个配置文件,这里存放一些动态生成文件的,而其他文件的一个目录,
tasks/ 任务,具体要做哪些事
handlers/ 处理程序
vars/ 角色的变量
defaults/ 角色的默认变量
meta/ 角色定义的一些元数据
webservers/ 跟上面的common一样属于模块,下面是所属的文件
files/。 角色部署时用到的文件
templates/ 角色部署时用到的模版
tasks/ 任务,具体要做哪些事
handlers/ 处理程序
vars/ 定义的变量
2. Roles的基本使用
- hosts: webservers 主机组
roles:- common 模块,下面可以定义很多的属于它的目录或者不同的任务
- nginx. 这里就是引用下面的变量的,部署一个
- php Nginx和php的网站平台
定义角色来定义变量,
- hosts: webservers
roles:- common 使用这个roles后面也可以直接定义变量
- role: nginx vars:
dir: '/opt/a'
app_port: 5000- role: php 在这个roles中直接去使用,
vars:
dir: '/opt/b'
app_port: 5001
- role: php 在这个roles中直接去使用,
这里我们创建了hosts,这个我们的主机清单,roles需要放我们的模块以及不同任务的目录,要有一个site.yaml
[root@ansible roles-demo]# lshosts roles site.yaml[root@ansible roles-demo]# mkdir roles/{common,nginx,php}/{file,templates,tasks,handlers}
在每个tasks下面都写一个main的yaml,因为它会在你的task下找这个main,也就是这个tasks下的一个入口
查看目录树结构
[root@ansible roles-demo]# tree ..|-- hosts|-- roles| |-- common| | |-- file| | |-- handlers| | |-- tasks| | | -- main.yaml| | -- templates| |-- nginx| | |-- file| | |-- handlers| | |-- tasks| | | -- main.yaml| | -- templates| -- php| |-- file| |-- handlers| |-- main.yaml| |-- tasks| -- templates- site.yaml
检查语法,执行[root@ansible roles-demo]# ansible-playbook site.yaml -i hosts --syntax-check
[root@ansible roles-demo]# ansible-playbook site.yaml -i hosts
在site下去定义新的调用的变量这个会找目录下对应的任务比如tasks下的任务
---- hosts: webservers gather_facts: no remote_user: root roles: - role: common - role: nginx vars: dir: /opt/a app_port: 80 - role: php vars: dir: /opt/b app_port: 81
在tasks下面去定义任务这个会找site.yaml下面的roles,然后执行相关目录下面的操作
[root@ansible nginx]# cat tasks/main.yaml - name: nginx task test debug: msg="nginx task test > {{dir}} {{app_port}}"
也可以写一个组,在组里面去定义变量,这个all会帮你交给所有组,也可以定义webservers,就是定义单一这个组
[root@ansible roles-demo]# lsgroup_vars hosts roles site.yaml[root@ansible roles-demo]# cd group_vars/[root@ansible group_vars]# lsall[root@ansible group_vars]# cat all nginx_ver: 1.15php_ver: 5.6
如果单一给这个site的单独单个任务就可以定义标签在执行的时候就可以执行单个roles下的任务
[root@ansible roles-demo]# vim site.yaml ---- hosts: webservers gather_facts: no remote_user: root roles: - role: common - role: nginx vars: dir: /opt/a app_port: 80 tags: nginx - role: php vars: dir: /opt/b app_port: 81 tags: php[root@ansible roles-demo]# ansible-playbook site.yaml -i hosts --tags nginxPLAY [webservers] *******************************************************************************************************************TASK [nginx : nginx task test] ******************************************************************************************************ok: [10.4.7.21] => { "msg": "nginx task test > /opt/a 80 1.15 5.6"}ok: [10.4.7.22] => { "msg": "nginx task test > /opt/a 80 1.15 5.6"}PLAY RECAP **************************************************************************************************************************10.4.7.21 : ok=1 changed=0 unreachable=0 failed=0 10.4.7.22 : ok=1 changed=0 unreachable=0 failed=0
用register变量获取k8s-master主机组上的状态
这里也可以换成var: test,可以获取全部的状态,使用msg进行调式查看某个字段,获取那个字段就可以使用msg
上述中使用"register"关键字将当前shell任务的返回值写入了名为test的变量中,第二个debug模块输出第一个任务中的注册变量的值
- name: test shell: kubectl get node register: test- name: shell debug: msg: "{{test.stdout_lines}}"
执行命令
[root@hdss7-200 test]# ansible-playbook -i hosts test.yaml PLAY [test] *************************************************************************************************************************************************TASK [nginx : test] *****************************************************************************************************************************************changed: [10.4.7.11]TASK [nginx : shell] ****************************************************************************************************************************************ok: [10.4.7.11] => { "msg": [ "NAME STATUS ROLES AGE VERSION", "k8s-master1 Ready 4h47m v1.16.0", "k8s-node1 Ready 4h47m v1.16.0", "k8s-node2 Ready 4h47m v1.16.0" ]}PLAY RECAP **************************************************************************************************************************************************10.4.7.11 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ig
3.一键使用Roles角色部署memcached和httpd
查看我的目录树
[root@hdss7-200 test-roles]# tree ..├── hosts├── roles│ ├── httpd│ │ └── tasks│ │ └── main.yml│ └── memcached│ └── tasks│ └── main.yml└── site.yaml5 directories, 4 files
两个文件一个目录
[root@hdss7-200 test-roles]# lshosts roles site.yaml[root@hdss7-200 test-roles]# ll总用量 8-rw-r--r-- 1 root root 18 12月 5 10:43 hostsdrwxr-xr-x 4 root root 36 12月 5 11:10 roles-rw-r--r-- 1 root root 146 12月 5 11:18 site.yaml
主机组,这里可以根据你想部署到哪台服务器,写好你的主机组,如果想部署某一个服务,根据roles的角色的tags部署某个服务
[root@hdss7-200 test-roles]# cat hosts[roles]10.4.7.22
统一的入口,包含部署的角色任务,可以定义多个角色
[root@hdss7-200 test-roles]# cat site.yaml ---- hosts: roles gather_facts: no remote_user: root roles: - role: httpd tags: httpd - role: memcached tags: memcached
这就是我们的roles下的tasks的任务,之前的是写在一个yml里面,对于复杂的任务我们就可以使用roles来实现
[root@hdss7-200 test-roles]# cd roles/httpd/ memcached/ [root@hdss7-200 test-roles]# cat roles/httpd/tasks/main.yml - name: install httpd yum: name=httpd state=present- name: start httpd systemd: name=httpd state=started enabled=yes- name: httpd status shell: ps -ef |grep httpd register: test- name: shell debug: msg: "{{test.stdout_lines}}"- name: debug: msg: "{{inventory_hostname}}"
msg是一个调试工具,里面的stdout_lines是这个取全局变量的一个值,可以取var: test 就可以得到所有的输入的内容,因为ansible执行完是不会将执行成功的内容帮我们去输出出来,所以我们需要自己去调他的系统输出的变量
[root@hdss7-200 test-roles]# cat roles/memcached/tasks/main.yml - name: install memcached yum: name=memcached state=present- name: start memcached systemd: name=memcached state=started enabled=yes daemon_reload=yes- name: memcached status shell: ps -ef |grep memcached register: test- name: memcached ps debug: msg: "{{test.stdout}}"
查看输出的整体内容
[root@hdss7-200 test-roles]# ansible-playbook -i hosts site.yamlPLAY [roles] ***************************************************************************************************TASK [httpd : install httpd] ***********************************************************************************changed: [10.4.7.22]TASK [httpd : start httpd] *************************************************************************************changed: [10.4.7.22]TASK [httpd : httpd status] ************************************************************************************changed: [10.4.7.22]TASK [httpd : shell] *******************************************************************************************ok: [10.4.7.22] => { "msg": [ "root 10375 1 3 11:28 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND", "apache 10376 10375 0 11:28 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND", "apache 10377 10375 0 11:28 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND", "apache 10378 10375 0 11:28 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND", "apache 10379 10375 0 11:28 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND", "apache 10380 10375 0 11:28 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND", "root 10417 10416 0 11:28 pts/1 00:00:00 /bin/sh -c ps -ef |grep httpd", "root 10419 10417 0 11:28 pts/1 00:00:00 grep httpd" ]}TASK [memcached : install memcached] ***************************************************************************ok: [10.4.7.22]TASK [memcached : start memcached] *****************************************************************************ok: [10.4.7.22]TASK [memcached : memcached status] ****************************************************************************changed: [10.4.7.22]TASK [memcached : memcached ps] ********************************************************************************ok: [10.4.7.22] => { "msg": "memcach+ 10136 1 0 11:21 ? 00:00:00 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024\nroot 10575 10574 18 11:28 pts/1 00:00:00 /bin/sh -c ps -ef |grep memcached\nroot 10577 10575 0 11:28 pts/1 00:00:00 grep memcached"}PLAY RECAP *****************************************************************************************************10.4.7.22 : ok=8 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
比如单独执行某个任务,就部署一个httpd,这样的话就很灵活,这里还有一个debug这个的话,就是打印主机名
[root@hdss7-200 test-roles]# ansible-playbook -i hosts site.yaml --tags httpdPLAY [roles] ***************************************************************************************************TASK [httpd : install httpd] ***********************************************************************************ok: [10.4.7.22]TASK [httpd : start httpd] *************************************************************************************ok: [10.4.7.22]TASK [httpd : httpd status] ************************************************************************************changed: [10.4.7.22]TASK [httpd : shell] *******************************************************************************************ok: [10.4.7.22] => { "msg": [ "root 10375 1 0 11:28 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND", "apache 10376 10375 0 11:28 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND", "apache 10377 10375 0 11:28 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND", "apache 10378 10375 0 11:28 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND", "apache 10379 10375 0 11:28 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND", "apache 10380 10375 0 11:28 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND", "root 10744 10743 0 11:46 pts/1 00:00:00 /bin/sh -c ps -ef |grep httpd", "root 10746 10744 0 11:46 pts/1 00:00:00 grep httpd" ]}TASK [httpd : debug] *******************************************************************************************ok: [10.4.7.22] => { "msg": "10.4.7.22"}PLAY RECAP *****************************************************************************************************10.4.7.22 : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
还可以增加一些新的任务比如批量创建文件
这里使用的{{item}}循环,就可以减少我们去写多个name
- name: create file file: path=/tmp/{{item}} state=touch with_items: - "1.txt" - "2.txt" - "3.txt" - "4.txt"
执行效果
[root@hdss7-200 test-roles]# ansible-playbook -i hosts site.yaml --tags nginxPLAY [roles] ***************************************************************************************************TASK [nginx : create file] *************************************************************************************changed: [10.4.7.22] => (item=1.txt)changed: [10.4.7.22] => (item=2.txt)changed: [10.4.7.22] => (item=3.txt)changed: [10.4.7.22] => (item=4.txt)PLAY RECAP *****************************************************************************************************10.4.7.22 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0