怎么推广网站建设业务,手机百度官网首页,在线制作图标免费,网站代码需要注意什么东西本章主要介绍ansible中角色的使用
了解什么是角色独立地写一个角色使用角色系统自带角色地使用
1.了解角色 正常情况下#xff0c;配置一个服务如 apache时#xff0c;要做一系列的操作:安装、拷贝、启动服务等。如果要在不同的机器上重复配置此服务#xff0c;需要重新执…本章主要介绍ansible中角色的使用
了解什么是角色独立地写一个角色使用角色系统自带角色地使用
1.了解角色 正常情况下配置一个服务如 apache时要做一系列的操作:安装、拷贝、启动服务等。如果要在不同的机器上重复配置此服务需要重新执行这些操作。 为了简化这些重复劳动可以把安装、拷贝、启动 服务等操作打包成一个整体,这个整体称为角色如图34-1所示。 如果想在其他机器上安装并配置apache只要调用此角色即可,这样就可以实现一次劳动、永久回报的效果。 一个角色本质上就是一个文件夹此文件夹名就是角色名此文件夹中包含许多文件,有的是用于执行各种模块的文件有的是用于拷贝到被管理主机的jinj2模板文件有的是定义的变量文件。 为了防止文件太多太乱在此角色的文件夹中再创建一个个的子目录用于存放不同的文 件。例如jinja2模板放在templates目录中普通的文件放在files目录中变量文件放在vars目录中,执行模块的各个task放在tasks目录中等。角色目录中每个子目录的作用总结如表34-1所示。 所有的角色都放在一个目录中等待被调用默认目录为ansible.cfg所在目录的roles目录, 如果要修改路径可以在ansible.cfg中用roles path选项指定。 本章实验都在/home/lduan/demo5下操作先把demo5目录创建出来并把 ansible.cfg 和hosts拷贝进去命令如下。
[blabnode01 ~]$ mkdir demo5
[blabnode01 ~]$ cp ansible.cfg hosts demo5/
[blabnode01 ~]$ cd demo5/
[blabnode01 demo5]$
修改ansible.cfg添加 roles path ./roles命令如下。
[blabnode01 demo5]$ cat ansible.cfg
[defaults]
inventory ./hosts
command_warningsFalse //增加内容
roles_path ./roles //增加内容[privilege_escalation]
becomeTrue
become_methodsudo
become_userroot[blabnode01 demo5]$
2.手把手创建一个角色
创建一个名称为apache的角色
[blabnode01 demo5]$ ansible-galaxy init roles/apache
- Role roles/apache was created successfully
[blabnode01 demo5]$ ls roles/
apache
[blabnode01 demo5]$
这里apache就是一个角色,看一下apache 中的内容
[blabnode01 demo5]$ ls roles/apache/
defaults files handlers meta README.md tasks templates tests vars
[blabnode01 demo5]$ 里面有不少目录如前面介绍的这些目录分别用于存放不同的文件。回顾在上期内容 demo4目录中写好的hand-1.yaml的内容。
[blabnode01 demo5]$ cat /home/blab/demo4/hand-1.yml
---
- hosts: node03vars:myport: 80tasks:- name: task1安装httpyum: namehttpd stateinstalled- name: tasks2拷贝配置文件template: srchttpd.conf.j2 dest/etc/httpd/conf/httpd.conf- name: task3启动httpd服务service: namehttpd statestartedhandlers:- name: restart httpd1service: namehttpd staterestarted- name: restart httpd2service: namehttpd staterestarted
[blabnode01 demo5]$ 这个文件中包含了以下内容 vars中是定义变量地tasks中的代码是正常要执行的handler中的代码是被触发执行才会执行的httpd.conf.j2是引用的jinja2模板 下面把这个YAML文件中的内容拆分放在apache角色的不同目录中把 tasks下的代码放在tasks目录中,把 handlers下的代码放在handlers目录中等。 把 tasks的内容写入roles/apache/tasks/main.yml 中
[blabnode01 demo5]$ cat roles/apache/tasks/main.yml
---
- name: task1 安装httpdyum: namehttpd stateinstalled
- name: task2 拷贝配置文件template: srchttpd.conf.j2 dest/etc/httpd/conf/httpd.confnotify: restart httpd1
- name: task3 启动httpd 服务service: namehttpd statestarted
[blabnode01 demo5]$ 把 handlers 的内容写入roles/apache/handlers/main.yml 中
[blabnode01 demo5]$ cat roles/apache/handlers/main.yml
---
- name: restart httpd1service: namehttpd staterestarted
- name: restart httpd2service: namehttpd staterestarted
[blabnode01 demo5]$ 在roles/apache/tasks/main.yml 中template模块拷贝的文件 http.conf.j2所在的目录是roles!apache/templates所以先把需要的 httod.conf.i2据贝到 roles/apache/templates中
[blabnode01 demo5]$ cp ../demo4/httpd.conf.j2 roles/apache/templates/
[blabnode01 demo5]$ ls roles/apache/templates/
httpd.conf.j2
[blabnode01 demo5]$
把变量myport写入roles/apache/vars/main.yml中
[blabnode01 demo5]$ cat roles/apache/vars/main.yml
---
myport: 8080
[blabnode01 demo5]$ 这里把myport的值改为8080原来的值为80会使 httpd.conf.j2中的端口发生变化从而会触发handler。 也可以不在roles/apache/vars/main.yml中定义变量而是在playbook 中定义myport 变量,如果在角色的vars 和 playbook 中都定义了myport变量且变量的值不同则角色的 vars中定义的变量生效。 下面查看apache这个角色的结构
[blabnode01 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.yml8 directories, 9 files
[blabnode01 demo5]$ 这样apache这个角色我们就算是最终写好了。 3.使用角色 角色写好之后只要在playbook中直接调用即可在playbook中的roles下调用调用的语法如下。 roles:‐ name: 名称1role: rolesname1‐ name: 名称2role: rolesname2
或 roles:‐ role: rolesname1‐ role: rolesname2 下面写一个名称为test-role1.yaml的 playbook里面调用apache这个角色
[blabnode01 demo5]$ cat test-roles1.yml
---
- hosts: node02roles:- role: apache
[blabnode01 demo5]$
运行此playbook
[blabnode01 demo5]$ ansible-playbook test-roles1.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [apache : task1 安装httpd] **************************************************
changed: [node02]TASK [apache : task2 拷贝配置文件] ***************************************************
changed: [node02]TASK [apache : task3 启动httpd 服务] ***********************************************
changed: [node02]RUNNING HANDLER [apache : restart httpd1] **************************************
changed: [node02]PLAY RECAP *********************************************************************
node02 : ok5 changed4 unreachable0 failed0 skipped0 rescued0 ignored0 [blabnode01 demo5]$ 这里是运行test-rolel vam1之后的完整结果可以看到运行的结果与前面运行的结果一样。变量可以在角色的defaults. vars中定义也可以在nlavbook中定义优先级的顺序是: 角色的vars中定义的变量→playbook中定义的变量→角色的defaults 中定义的变量。 所以如果同一个变量同时在这三个地方被定义了则角色的vars中定义的变量生效。先把在roles/apache/vars/main.yml中定义变量myport 的那行注释掉这个变量将在 playbook中定义如下所示。 [blabnode01 demo5]$ cat roles/apache/vars/main.yml
---
myport: 8080
[blabnode01 demo5]$ 修改test-tole1.yaml的内容如下 [blabnode01 demo5]$ cat test-roles1.yml
---
- hosts: node02vars:myport: 808roles:- role: apache
[blabnode01 demo5]$ 运行此playbook [blabnode01 demo5]$ ansible-playbook test-roles1.yml PLAY [node02] ******************************************************************TASK [Gathering Facts] *********************************************************
ok: [node02]TASK [apache : task1 安装httpd] **************************************************
ok: [node02]TASK [apache : task2 拷贝配置文件] ***************************************************
ok: [node02]TASK [apache : task3 启动httpd 服务] ***********************************************
ok: [node02]PLAY RECAP *********************************************************************
node02 : ok4 changed0 unreachable0 failed0 skipped0 rescued0 ignored0 [blabnode01 demo5]$ 到node02上验证 httpd 开启的端口是多少 [rootnode02 ~]# netstat -napt | grep httpd
tcp6 0 0 :::8080 :::* LISTEN 6297/httpd
[rootnode02 ~]# 可以看到。httpd现在使用的端口是8080 4.系统 自带的角色 除我们自己创建的角色外系统中也包含了一些内置的角色。 在node02上切换到root 用户然后安装软件包rhel-system-roles.noarch [rootnode01 ~]# yum -y install rhel-system-roles.noarch //root用户安装
[rootnode01 ~]# su - blab //切换用户 安装好这个软件包之后在/usr/share/ansible/roles目录中会有许多角色如图34-2所示。 下面演示rhel-system-roles.selinux这个角色使用lduan用户把rhel-system-roles.selinux拷贝到demo5下的roles目录中 [blabnode01 ~]$ cp -r /usr/share/ansible/roles/rhel-system-roles.selinux/ /home/blab/demo5/
[blabnode01 ~]$ cd demo5
[blabnode01 demo5]$ ls
ansible.cfg hosts rhel-system-roles.selinux roles test-roles1.yml
[blabnode01 demo5]$ 前面在讲解handlers时为httpd 配置了其他端口808但是因为SELinux的问题我们临时把 SELinux关闭了 [rootnode02 ~]# setenforce 0 //临时关闭
[rootnode02 ~]# getenforce //查看是否关闭
Permissive
[rootnode02 ~]# 可以看到node02上 SELinux的模式是Permissive。下面我们利用角色rhel-system- roles.selinux把 node02上 SELinux的模式改为 Enforcing。 查看角色rhel-system-roles.selinux中默认的变量 [blabnode01 demo5]$ cat 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
[blabnode01 demo5]$ 其中第一个变量是selinux state这个变量用于指定SELinux的模式默认值设置为了 null。可以在playbook中定义这个变量覆盖这个默认的变量值 [blabnode01 demo5]$ cat test-role2.yml
---
- hosts: node02vars:selinux_state: enforcingroles:- role: rhel-system-roles.selinux
[blabnode01 demo5]$ 运行此playbook PLAY RECAP *********************************************************************
node02 : ok7 changed1 unreachable0 failed0 skipped16 rescued0 ignored0 [blabnode01 demo5]$ 到 node02上查看验证, [rootnode02 ~]# getenforce
Enforcing
[rootnode02 ~]# 这里已经把 node02上 SELinux的模式改为了 Enforcing。 5.修改端口上下文 在介绍handler 时可以通过变量myport随意修改端口。但是端口上下文不对httpd是启动不起来的,所以当初把 node02上的 SELinux 临时关闭了。 下面介绍如何使用角色rhel-system-roles.selinux修改端口上下文。 查看角色 rhel-system-roles.selinux中默认的变量
[blabnode01 demo5]$ cat 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
[blabnode01 demo5]$ 这里变量selinux_ports是一个列表里面的元素需要定义多个变量但是变量名是什么我们现在还不清楚。 用vim 编辑器打开roles/rhel-system-roles.selinux/tasks/main.yml大概第116行是用于定义端口上下文
[blabnode01 demo5]$ vim 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 }}这里只截取了部分代码可以看到循环列表selinux ports中的4个变量。其中 proto和 state有默认值ports和setvpe没有默认值所以我们在定义列表selinux ports时至少要在列表的元素中定义ports和 setype这两个变量。 修改test-role1.yml的内容
[blabnode01 demo5]$ cat test-roles1.yml
---
- hosts: node02vars:myport: 808selinux_ports:- ports: {{myport}}setype: http_port_troles:- role: rhel-system-roles.selinux- role: apache
[blabnode01 demo5]$ 这里定义了一个变量myport的值为808然后定义了一个列表selinux_ports。这个列表中只有一个元素元素中有两个变量ports和 setype。其中 ports这个变量引用myport 的值记得要用双引号引起来,setype的值被设置为了http_port_t。 注释roles/apache/vars/main.yml 中的变量 否则会因为优先级的问题导致端口号不能更改
[blabnode01 demo5]$ cat roles/apache/vars/main.yml
---
#myport: 8080
[blabnode01 demo5]$ 运行此 playbook
[blabnode01 demo5]$ ansible-playbook test-roles1.yml PLAY RECAP *********************************************************************
node02 : ok10 changed1 unreachable0 failed0 skipped16 rescued0 ignored0 [blabnode01 demo5]$
然后到node02上检查httpd所使用的端口
[rootnode02 ~]# netstat -napt | grep httpd
tcp6 0 0 :::808 :::* LISTEN 13421/httpd
[rootnode02 ~]# 可以看到httpd此时使用的端口是808。