目录
1. 了解角色
2. 手把手创建角色
3. 使用角色
4.系统自带的角色
5. 修改端口上下文
6. 使用Ansible Galaxy
正常情况下,配置一个服务如 apache时,要做一系列的操作:安装、拷贝、启动服务等。如果要在不同的机器上重复配置此服务,需要重新执行这些操作。
如果想在其他机器上安装并配置apache,只要调用此角色即可,这样就可以实现一次劳动、永久回报的效果。
所有的角色都放在一个目录中等待被调用,默认目录为ansible.cfg所在目录的roles目录, 如果要修改路径可以在ansible.cfg中用roles path选项指定。
[bdqn@RHEL813 ~]$ mkdir demo5
[bdqn@RHEL813 ~]$ cp ansible.cfg hosts demo5
[bdqn@RHEL813 ~]$ cd demo5
[bdqn@RHEL813 demo5]$ ls
ansible.cfg hosts
[bdqn@RHEL813 demo5]$
[bdqn@RHEL813 demo5]$ cat ansible.cfg
[defaults]
inventory = ./hosts
roles_path = ./roles
[privilege_escalation]
become=True
become_method=sudo
become_user=root
[bdqn@RHEL813 demo5]$
[bdqn@RHEL813 demo5]$ ansible-galaxy init roles/apache
- Role roles/apache was created successfully
[bdqn@RHEL813 demo5]$ ls roles/
apache
[bdqn@RHEL813 demo5]$
[bdqn@RHEL813 demo5]$ ls roles/apache/
defaults files handlers meta README.md tasks templates tests vars
[bdqn@RHEL813 demo5]$
[bdqn@RHEL813 demo5]$ cat ../demo4/hand-1.yaml
---
- hosts: server2
vars:
myport: 808
tasks:
- name: tasks1安装httpd
yum: name=httpd state=installed
- name: tasks2拷贝配置文件
template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
- name: tasks3启动httpd服务
service: name=httpd state=restarted
handlers:
- name: restart httpd1
service: name=httpd state=restarted
- name: restart httpd2
service: name=httpd state=restarted
[bdqn@RHEL813 demo5]$
[bdqn@RHEL813 demo5]$ cat roles/apache/tasks/main.yml
---
- name: tasks1 安装httpd
yum: name=httpd state=installed
- name: tasks2 拷贝配置文件
template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify: restart httpd1
- name: tasks3 启动httpd服务
service: name=httpd state=started
[bdqn@RHEL813 demo5]$
[bdqn@RHEL813 demo5]$ cat roles/apache/handlers/main.yml
---
- name: restart httpd1
service: name=httpd state=restarted
- name: restart httpd2
service: name=httpd state=restarted
[bdqn@RHEL813 demo5]$
[bdqn@RHEL813 demo5]$ cp ../demo4/httpd.conf.j2 roles/apache/templates/
[bdqn@RHEL813 demo5]$ ls roles/apache/templates/
httpd.conf.j2
[bdqn@RHEL813 demo5]$
[bdqn@RHEL813 demo5]$ cat roles/apache/vars/main.yml
---
myport: 8080
[bdqn@RHEL813 demo5]$
[bdqn@RHEL813 demo5]$ tree roles/apache/
roles/apache/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
│ └── httpd.conf.j2
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 9 files
[bdqn@RHEL813 demo5]$
roles:
‐ name: 名称1
role: rolesname1
‐ name: 名称2
role: rolesname2
或者
roles:
‐ role: rolesname1
‐ role: rolesname2
[bdqn@RHEL813 demo5]$ cat test-role1.yaml
---
- hosts: server3
roles:
- role: apache
[bdqn@RHEL813 demo5]$
[bdqn@RHEL813 demo5]$ ansible-playbook test-role1.yaml
PLAY [server3] *********************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************
ok: [server3]
TASK [apache : tasks1 安装httpd] *****************************************************************************************************
ok: [server3]
TASK [apache : tasks2 拷贝配置文件] ******************************************************************************************************
changed: [server3]
TASK [apache : tasks3 启动httpd服务] ***************************************************************************************************
ok: [server3]
RUNNING HANDLER [apache : restart httpd1] ******************************************************************************************
changed: [server3]
PLAY RECAP *************************************************************************************************************************
server3 : ok=5 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
所以,如果同一个变量同时在这三个地方被定义了,则角色的vars中定义的变量生效。先把在roles/apache/vars/main.yml中定义变量myport 的那行注释掉,这个变量将在playbook中定义,如下所示。
[bdqn@RHEL813 demo5]$ cat roles/apache/vars/main.yml
---
#myport: 8080
[bdqn@RHEL813 demo5]$
修改test-tole1.yaml的内容如下。
[bdqn@RHEL813 demo5]$ cat test-role1.yaml
---
- hosts: server3
vars:
myport: 8080
roles:
- role: apache
[bdqn@RHEL813 demo5]$
运行此playbook,命令如下。
[bdqn@RHEL813 demo5]$ ansible-playbook test-role1.yaml
PLAY [server3] *********************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************
ok: [server3]
TASK [apache : tasks1 安装httpd] *****************************************************************************************************
ok: [server3]
TASK [apache : tasks2 拷贝配置文件] ******************************************************************************************************
ok: [server3]
TASK [apache : tasks3 启动httpd服务] ***************************************************************************************************
ok: [server3]
PLAY RECAP *************************************************************************************************************************
server3 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[bdqn@RHEL813 demo5]$
[root@RHEL812 conf]# netstat -ntulp | grep httpd
tcp6 0 0 :::8080 :::* LISTEN 3805/httpd
[root@RHEL812 conf]#
[root@RHEL813 ~]# yum -y install rhel-system-roles.noarch
正在更新 Subscription Management 软件仓库。
无法读取客户身份
本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。
上次元数据过期检查:0:00:26 前,执行于 2023年12月26日 星期二 21时55分53秒。
依赖关系解决。
====================================================================================================================================
软件包 架构 版本 仓库 大小
====================================================================================================================================
.......
已安装:
python3-jmespath-0.9.0-11.el8.noarch python3-netaddr-0.7.19-8.el8.noarch rhel-system-roles-1.7.3-2.el8.noarch
完毕!
[root@RHEL813 ~]#
[bdqn@RHEL813 demo5]$ cp -r /usr/share/ansible/roles/rhel-system-roles.selinux roles/
[bdqn@RHEL813 demo5]$ ls roles/
apache rhel-system-roles.selinux
[bdqn@RHEL813 demo5]$
[root@RHEL812 conf]# getenforce 0
Permissive
[root@RHEL812 conf]#
[bdqn@RHEL813 demo5]$ cat roles/rhel-system-roles.selinux/defaults/main.yml
---
selinux_state: null
selinux_policy: null
# Set up empty lists for SELinux changes.
selinux_booleans: []
selinux_fcontexts: []
selinux_logins: []
selinux_ports: []
selinux_restore_dirs: []
# Purging local modifications is disabled by default.
selinux_all_purge: no
selinux_booleans_purge: no
selinux_fcontexts_purge: no
selinux_ports_purge: no
selinux_logins_purge: no
[bdqn@RHEL813 demo5]$
[bdqn@RHEL813 demo5]$ cat test-role2.yaml
---
- hosts: server3
vars:
selinux_state: enforcing
roles:
- role: rhel-system-roles.selinux
[bdqn@RHEL813 demo5]$
[bdqn@RHEL813 demo5]$ ansible-playbook test-role2.yaml
PLAY [server3] *********************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************
ok: [server3]
TASK [rhel-system-roles.selinux : Install SELinux python2 tools] *******************************************************************
skipping: [server3]
......
[root@RHEL812 conf]# getenforce
Enforcing
[root@RHEL812 conf]#
[bdqn@RHEL813 demo5]$ cat roles/rhel-system-roles.selinux/defaults/main.yml
---
selinux_state: null
selinux_policy: null
# Set up empty lists for SELinux changes.
selinux_booleans: []
selinux_fcontexts: []
selinux_logins: []
selinux_ports: []
selinux_restore_dirs: []
# Purging local modifications is disabled by default.
selinux_all_purge: no
selinux_booleans_purge: no
selinux_fcontexts_purge: no
selinux_ports_purge: no
selinux_logins_purge: no
[bdqn@RHEL813 demo5]$
[bdqn@RHEL813 demo5]$ vim roles/rhel-system-roles.selinux/tasks/main.yml
.....
114 - name: Set an SELinux label on a port
115 seport:
116 ports: "{{ item.ports }}"
117 proto: "{{ item.proto | default('tcp') }}"
118 setype: "{{ item.setype }}"
119 state: "{{ item.state | default('present') }}"
120 with_items: "{{ selinux_ports }}"
121
......
[bdqn@RHEL813 demo5]$ cat test-role1.yaml
---
- hosts: server3
vars:
myport: 808
selinux_ports:
- ports: "{{myport}}"
setype: http_port_t
roles:
- role: rhel-system-roles.selinux
- role: apache
[bdqn@RHEL813 demo5]$
[bdqn@RHEL813 demo5]$ ansible-playbook test-role1.yaml
进入搜索页面,如下图所示。
在搜索框中输入我们要查找的角色名,例如,输人“vsftpd”之后按【Enter】键,会看到一系列和vstpd相关的角色,如图下图所示。
这里单击第一个,可以看到安装方法,复制这个命令即可把这个角色安装在机器上,如下图所示。
[bdqn@RHEL813 demo5]$ ansible-galaxy install ftp://ftp.rhce.cc/auto/web.tar.gz
- downloading role from ftp://ftp.rhce.cc/auto/web.tar.gz
- extracting web to /home/bdqn/demo5/roles/web
- web was installed successfully
[bdqn@RHEL813 demo5]$
[bdqn@RHEL813 demo5]$ ls roles/
apache rhel-system-roles.selinux web
[bdqn@RHEL813 demo5]$
/path选项指定安装目录。例如,安装在/opt目录中,可以用如下命令
[bdqn@RHEL813 demo5]$ ansible-galaxy install ftp://ftp.rhce.cc/auto/web.tar.gz -p
/opt
[bdqn@RHEL813 demo5]$ cat aa.yaml
---
- src: ftp://ftp.rhce.cc/auto/web.tar.gz
name: webx
[bdqn@RHEL813 demo5]$
[bdqn@RHEL813 demo5]$ ansible‐galaxy install ‐r aa.yaml ‐p roles/
‐ downloading role from ftp://ftp.rhce.cc/auto/web.tar.gz
‐ extracting webx to /home/blab/demo5/roles/webx
‐ webx was installed successfully
[bdqn@RHEL813 demo5]$
[bdqn@RHEL813 demo5]$ ls roles/
apache rhel‐system‐roles.selinux web webx