创建角色和变量
角色创建流程
在Ansible中创建角色不需要特别的开发工具。创建和使用角色包含三个步骤:
- 创建角色目录结构
- 定义角色内容
- 在playbook中使用角色
创建角色目录(独享)
[root@control2 test]# mkdir -p httpd/{defaults,vars,files,templates,tasks,handlers,test}
[root@control2 test]# tree httpd/
httpd/
|-- defaults
|-- files
|-- handlers
|-- tasks
|-- templates
|-- tests
`-- vars
[root@control2 test]# touch httpd/{defaults/main.yml,tasks/main.yml,vars/main.yml}
[root@control2 test]# tree httpd/
httpd/
|-- defaults
| `-- main.yml
|-- files
|-- handlers
|-- tasks
| `-- main.yml
|-- templates
|-- tests
`-- vars
`-- main.yml
创建角色(共享)
[root@control2 test]# ansible-galaxy init apache
- Role apache was created successfully
[root@control2 test]# ls
apache httpd roles
[root@control2 test]# tree apache/
apache/
|-- README.md
|-- defaults //默认值
| `-- main.yml
|-- files
|-- handlers //触发程序
| `-- main.yml
|-- meta
| `-- main.yml
|-- tasks //任务文件
| `-- main.yml
|-- templates //模板文件 .j2
|-- tests //play文件
| |-- inventory
| `-- test.yml
`-- vars
`-- main.yml //变量
用角色安装httpd
在apache/tasks/main.yml编写play
[root@control2 tasks]# cat main.yml
---
# tasks file for apache
- name: install apache
yum:
name: httpd
state: present
- name: install policycoreutils-python-utils //可有可无
yum:
name: policycoreutils-python-utils
state: present
- name: config apache
template:
src: httpd.conf.j2 //事先准备好httpd.conf.j2模板
dest: /etc/httpd/conf/httpd.conf
- name: service apache
service:
name: httpd
state: restarted #重启服务 #也可以写started 开启服务 两者性质不一样根据防火墙规则来修改
- name: service firewalld #防火墙可关可不关
service:
name: firewalld
state: stopped
修改httpd.conf.j2模板
[root@control2 apache]# vim templates/httpd.conf.j2
#Listen 12.34.56.78:80
Listen {{ PORT }} //把端口号定义成一个变量
定义模板变量
[root@control2 apache]# cat defaults/main.yml
---
# defaults file for apache
PORT: 80
编写执行角色的play
[root@control2 roles]# cat apache.yml
---
- hosts: server4
roles:
- apache
[root@control2 roles]# ls
apache apache.yml //角色文件和角色执行play必须在同一级别
执行apache.yml
[root@control2 project]# ansible-playbook playbook/roles/apache.yml
PLAY [server4] *****************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.56.133]
TASK [install apache] **********************************************************
ok: [192.168.56.133]
TASK [config apache] **********************************************************
ok: [192.168.56.133]
TASK [service apache] **********************************************************
changed: [192.168.56.133]
TASK [apache : service firewalld] **********************************************
changed: [192.168.56.133]
PLAY RECAP *********************************************************************
192.168.56.133 : ok=5 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
在server4上查看
[root@server4 ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 [::]:22 [::]:*
//80端口已启动
通过变量更改角色的行为
编写良好的角色利用默认变量来改变角色行为,使之与相关的配置场景相符。这有助于让角色变得更为通用,可在各种不同的上下文中重复利用。
如果通过以下方式定义了相同的变量,则角色的defaults目录中定义的变量的值将被覆盖:
- 在清单文件中定义,作为主机变量或组变量
- 在playbook项目的group_vars或host_vars目录下的YAML文件中定义
- 作为变量嵌套在play的vars关键字中定义
- 在play的roles关键字中包含该角色时作为变量定义
下例演示了如何将motd角色与system_owner角色变量的不同值搭配使用。角色应用到受管主机时,指定的值someone@host.example.com将取代变量引用。
1、在vars目录编写变量
[root@control2 apache]# cat vars/main.yml
---
# vars file for apache
PORT: 82
[root@control2 apache]# cat defaults/main.yml
---
# defaults file for apache
PORT: 80
####如果关闭了防火墙就直接开始第二步
执行apache.yml
//会报错
TASK [service apache] **********************************************************
fatal: [192.168.56.133]: FAILED! => {"changed": false, "msg": "Unable to restart service httpd: Job for httpd.service failed because the control process exited with error code.\nSee \"systemctl status httpd.service\" and \"journalctl -xe\" for details.\n"}
那是应为受控主机上没有82端口,要安装服务,添加端口
[root@server4 ~]# yum -y install policycoreutils-python-utils
Failed to set locale, defaulting to C.UTF-8
用semanage查看已添加端口
[root@server4 ~]# semanage port --list | grep http
http_cache_port_t tcp 8080, 8118, 8123, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 80, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
//可以发现没有82端口
这时我们添加端口
[root@server4 ~]# semanage port -a -t http_port_t -p tcp 81
ValueError: 已定义端口 tcp/81
[root@server4 ~]# semanage port --list | grep http
http_cache_port_t tcp 8080, 8118, 8123, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 85, 84, 83, 82, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
//添加多个端口
也可以用系统角色添加
[root@control2 roles]# cat apache.yml
---
- hosts: server4
vars:
selinux_ports:
- ports: "{{ PORT }}"
setype: 'httpd_port_t'
state: 'present'
porto: 'tcp'
PORT: 82 //添加82端口
roles:
- apache
2、执行
[root@control2 project]# ansible-playbook playbook/roles/apache.yml
可以看出vars变量替代了defaults变量 vars>defaults
[root@server4 ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:82 *:*
LISTEN 0 128 [::]:22 [::]:*
3、更换变量位子 play清单里的变量大于defaults
[root@control2 roles]# cat apache/vars/main.yml
---
# vars file for apache
#PORT: 82
[root@control2 roles]# cat apache.yml
---
- hosts: server4
vars:
PORT: 85
roles:
- apache
//执行
[root@control2 project]# ansible-playbook playbook/roles/apache.yml
//查看结果
[root@server4 ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:85 *:*
LISTEN 0 128 [::]:22 [::]:*
4、更换变量位置
[root@control2 roles]# cat apache/defaults/main.yml
---
# defaults file for apache
PORT: 80
[root@control2 roles]# cat apache/vars/main.yml ---
# vars file for apache
PORT: 82
[root@control2 roles]# cat apache.yml
---
- hosts: server4
vars:
PORT: 83
roles:
- role: apache
PORT: 81
//执行
[root@control2 project]# ansible-playbook playbook/roles/apache.yml
//查看
[root@server4 ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:81 *:*
LISTEN 0 128 [::]:22 [::]:*
角色内嵌参数变量 > vars/main.yml 变量 > 在playbook清单中定义vars定义变量 > 在playbook项目的group_vars或host_vars目录下的YAML文件中定义主机变量 主机组变量 > defaults/main.yml定义变量(默认变量)
使用ansible galaxy部署角色
介绍ansible galaxy
Ansible Galaxy [https://galaxy.ansible.com]是一个Ansible内容公共资源库,这些内容由许许多多Ansible管理员和用户编写。它包含数千个Ansible角色,具有可搜索的数据库,可帮助Ansible用户确定或许有助于他们完成管理任务的角色。Ansible Galaxy含有面向新的Ansible用户和角色开发人员的文档和视频链接
安装角色
ansible-galaxy role install xxx.httpd
|