RHCE(jinjia2模块管理和角色管理)
一:jinjia2模版
1:为什么需要这个
比如,有多台主机都要搭建httpd服务,将一个httpd的配置文件拷贝到其余的主机上面去,上面的ip地址都是一样的,很死板,不会因为主机的不同导致Ip的不同,因此就出现了jinja2模版文件,生成通用的配置文件,对于这类的配置文件,是需要更改小部分的内容,其他大部分的内容无需更改
通过使用带有变量的模版文件拷贝到被控节点,变量会自动的识别出来值
例如ip地址能自动的识别出来,关键就是facts变量,收集被控节点的事实变量,既能自动的识别出来
2:操作
需要使用template模块,能够识别变量,变量不需要使用" "引号引起来,template会自动识别变量,也不需要关闭facts变量,因为模版中的变量依赖于facts变量
将httpd的配置文件拷贝到其他的被控节点上面,然后能够自动的识别主机的ip地址
#修改httpd的主配置文件
Listen {{ansible_ens160.ipv4.address}}:80
编写一个剧本,使用template模块,这个模块,就可以发送这个jinja2这个模版
[root@controller mnt]# cat f1.yml
- hosts: all
tasks:
- template:
src: /mnt/httpd.conf.j2
dest: /mnt/httpd.conf
#执行剧本即可,将模版发送过去,然后就能自动的识别这个变量
3:jinjia模版语句
1、条件语句(if判断)
总而言之就是if判断能够使用很多的表达式,when能够使用的,他都能使用
需求:如果服务器的网卡不是ens160,那么上述的ip地址就无法实现监听,如果一个服务器有多张网卡的话,就需要判断,来判断条件是否满足
格式:
{% if 表达式 %}
执行语句
{% elif 表达式 %}
执行语句
{% else %}
执行语句
{% endif %}
案例:
判断这个变量是否被定义了,如果定义了就执行,否则的话就是另外的一种情况,如果被控节点有ens160网卡,那么就监听ens160网卡,如果被控节点有ens224网卡的话。如果都没有的话,就监听所有的ip地址即可
if ansible_ens160.ipv4.address is defined %}
Listen {{ansible_ens160.ipv4.address}}:80
{% elif ansible_ens224.ipv4.address is defined %}
Listen {{ansible_ens224.ipv4.address}}:80
{% else %}
Listen 0.0.0.0:80
{% endif %}
案例:
如果是node1主机上,则内容显示node1 is ok,如果是在node2主机上,则内容为node2 is ok
{% if ansible_hostname == 'node1' %}
"node1 is ok"
{% elif ansible_hostname == 'node2' %}
{% else %}
error
{% endif %}
- hosts: all
tasks:
- template:
src: /mnt/h1
dest: /mnt/h1.conf
2、for循环
for循环的格式
{% for 变量 in 循环体 %}
执行语句
{% endof %}
案例:
在node1主机上面,/etc/hosts中包含所有主机的ip地址和FQDN和主机名的映射关系
groups.all就是遍历主机清单中的所有主机,然后就是定义了这个模版,不同的主机有不同的变量,然后将其内容都拷贝到一个文件里面即可
注意就是:需要提前获取这些节点的信息,才能将里面的内容拷贝过去
[root@controller mnt]# cat h2
{% for i in groups.all %}
{{hostvars[i].ansible_ens160.ipv4.address}} {{hostvars[i].ansible_fqdn}{{hostvars[i].ansible_hostname}}
{% endfor %}
- hosts: all
tasks:
- template:
src: /mnt/h2
dest: /etc/hosts
4:jinja2过滤器
1、default过滤器
使用default的jinjia2过滤器
当变量没有定义值的时候,就使用默认的值来进行替代
格式:
"{{变量名|jinja2过滤器}}"
案例:
定义2个用户名,一个有家目录,另一个没有家目录,没有家目录的话,就自动的默认设置一个目录即可
- hosts: all
vars:
users:
- name: zhangsan
home: /opt/zhangsan
- name: lisi
tasks:
- user:
name: "{{item.name}}"
home: "{{ item.home|default('/tmp/default') }}"
state: present
loop: "{{users}}"
2、常见的过滤器:
password_hash
dict2items
loop循环里面有
案例:
#创建用户的时候,使用password_hash过滤器进行过滤 因为版本的问题,rhel9的ansible的版本太低了,没有这个过滤器,解决的方法就是安装更加高版本的nasible的软件包
二:角色和到导航器
1:为什么需要角色
主要就是为了解决这个剧本之间的移植的关系,在没有角色之前的话,定义的变量或者是引入大外部的变量的文件,都很分散,所以的话就是移植到其他的主机上,可能缺乏某个变量导致剧本无法的运行,有了角色之后,就相当于是一个目录里面有不同的目录,分别做不同的事情,将一个剧本拆分成不同的任务来进行完成,因此的话,剧本就非常高效的移植到其他的主机上面,就能够进行运行了
2:角色的组成部分
生成一个角色后,就是有不同的目录,
files:用于存放一些非模版文件的文件,就是一些普通的文件,会被复制到被控节点上面的
templates:用于存放角色相关的jinja2模版文件,当使用角色相关的模版时,如果没有明确指定模版的路径,则默认使用此目录中的模版
tasks:角色所需要执行的所有任务文件都存放于此,包含一个主文件main.yml,可以通过include的方式引入其他任务文件,就是可以创建多个tasks任务,然后在main,yml里面进行引用
handlers:用于定义角色中需要调用的handlers,包含一个主配置文件main.yml,也可以通过include引入其他的handlers文件
vars:定义此角色要用到的变量,包含一个主文件main.yml
meta:用于存储角色的元数据信息,这个写元数据用于描述角色的相关属性,作者等
defaults:除了vars目录,也可以定义角色用到的变量,定义的变量的优先级是最低的
3:角色相关操作
#通过ansible-galaxy init apache 就可以初始化角色目录结构,生成目录和文件
#当然ansible的主配置文件里面一定要定义好角色的路径,生成角色的时候,默认的路径
[root@controller roles]# ansible-galaxy init apache
- Role apache was created successfully
[root@controller roles]# ls
apache
#执行一个任务
将所有的目录里面的东西都要运用到
#安装httpd服务,然后监听安装成功后,创建一个s.txt的文件,使用模版将httpd的配置文件拷贝过去,网站的访问的根文件,创建出来,防火墙放行http服务,使用循环来完成,
tasks目录下面的内容
[root@controller tasks]# cat main.yml
---
# tasks file for apache
- name: use yum
yum:
name: httpd
state: present
notify: get_status
- name: conent
copy:
src: index.html
dest: /var/www/html
- name: use template
template:
src: httpd.conf.j2
dest: /opt/httpd.conf
- name: firewalld
firewalld:
service: http
permanent: yes
state: enabled
immediate: yes
- name: service
service:
name: "{{ item }}"
state: started
enabled: yes
loop:
- firewalld
- httpd
- name: touch q7
file:
path: "{{http}}"
state: touch
#file目录下面
[root@controller files]# ls
index.html
[root@controller files]# cat index.html
hello rhce
#handlers下面的内容
[root@controller handlers]# ls
main.yml
[root@controller handlers]# cat main.yml
---
# handlers file for apache
- name: get_status
file:
path: /opt/s.txt
state: touch
#templates下面的内容
[root@controller templates]# ls
httpd.conf.j2
#vars下面的内容
[root@controller vars]# cat main.yml
---
# vars file for apache
http: q7.com
#执行这个剧本
[root@controller ansible]# cat r1.yml
- hosts: node1
roles:
- apache
列表的形式执行这个剧本,可以使用多个角色进行执行
2、include_tasks和pre_tasks(之前)和post_tasks(之后)
当然也可以将这个任务拆分成好几块,使用include来引用这些任务
就是当任务过多的情况下,可以这样的使用,就不用在main.yml里面进行编写了
案例:
[root@controller tasks]# pwd
/etc/ansible/roles/apache/tasks
[root@controller tasks]# ls
copy.yml firewalld.yml main.yml template.yml
[root@controller tasks]# cat main.yml
---
# tasks file for apache
- name: use yum
yum:
name: httpd
state: present
notify: get_status
- include_tasks:
file: copy.yml
- include_tasks:
file: template.yml
- include_tasks:
file: firewalld.yml
- name: service
service:
name: "{{ item }}"
state: started
enabled: yes
loop:
- firewalld
- httpd
- name: touch q7
file:
path: "{{http}}"
state: touch
pre_tasks和post_tasks就是一个在角色之前执行,一个在后面角色之后进行执行
就是在使用角色之前需要一个环境,提前将这个环境配置好即可,定义的位置在剧本之间,不在角色之间
[root@controller ansible]# cat r1.yml
- hosts: node1
roles:
- apache
pre_tasks:
- debug:
msg: pre_tasks
post_tasks:
- debug:
msg: post_tasks
4:角色的获取,安装,集合
1、获取角色的方式
1)通过官网进行下载
galaxy.ansible.com

2、通过本地的软件包进行获取
挂载镜像,安装红帽系统角色,rhel-system-roles
yum -y install rhel-system-roles.noarch #这个目录下面有很多个角色 [root@controller roles]# pwd /usr/share/ansible/roles
2、安装角色
ansible-galaxy role install role-name
安装角色,可以使用几个选项
-r 指定文件,编写一个yaml文件,里面要有url
-p 指定路径
3、查找角色
ansible-galaxy search role-name
4、列出系统上面的角色
ansible-galaxy role list
5:集合
ansible版本来说的
2.9之前的话,都是roles集合,普通文件,tasks任务等
2.9之后的话,使用就是集合collection,里面包含了roles角色,plugin插件,模块等
和安装角色一样的方式
5:ansible的加密
就是不想让别人查看这个剧本,就使用加密,也可以使用在普通文件上
创建一个加密文件,ansible-vault create filename 输入密码
查看一个加密文件,ansible-vault view filename 输入密码
解密一个加密文件,ansible-vault decrypt filename,就能直接的进行查看这个文件了
加密一个已经存在的文件,ansible-vault encrypt filename,可以使用--vault-password-file来使用密码文件对其进行加密的操作
修改一个加密文件密码:ansible-vault rekey passwd
但是呢,可以进行到这个加密文件里面,修改里面的内容,然后原来的密码就失效了
对于一个剧本进行加密后不能直接的使用这个剧本
使用密码文件对于剧本进行加密
ansible-vault encrypt --vault-password-file p1 parted.yml #解密的操作 [root@controller ansible]# ansible-vault decrypt --vault-password-file p1 parted.yml Decryption successful #都可以使用密码文件进行加密和解密的操作 #创建文件时,就进行加密的操作 [root@controller ansible]# ansible-vault create p2 New Vault password: Confirm New Vault password: #浏览文件(不对其进行解密的操作) [root@controller ansible]# ansible-vault view p2 Vault password: asadad #解密文件 [root@controller ansible]# ansible-vault decrypt p2 Vault password: Decryption successful [root@controller ansible]# cat p2 asadad
1:执行一个加密的剧本?
1、在命令行模式下输入密码
#对于这个剧本进行加密 [root@controller mnt]# ansible-playbook q1.yml --ask-vault-pass Vault password:
2、通过密码文件执行剧本
就是将密码保存到文件里面即可
[root@controller mnt]# ansible-playbook q1.yml --vault-password-file=p1.txt
6:导航器和集合
1、集合
集合路径的定义
ansible的主配置文件里面定义了的
安装集合就是为了弥补模块的缺少,有了更多的模块,就能进行更多的操作
安装集合的方式:
ansible-galaxy collection install 集合
如果定义了集合的路径的话,就会安装在里面
2、导航器
就是执行剧本的另外的一种方式,不能使用ad-hoc命令执行
1、操作:
安装导航器,需要挂载ansible的镜像,搭建一个yum仓库,然后进行安装
每次使用导航器执行剧本的时候,都会重新拉取一个最新的镜像,结束后,挂掉
可以搭建自动化执行的环境,从本地镜像中执行,就不需要每次都去网上进行拉取镜像
[root@controller ~]# cat .ansible-navigator.yml ansible-navigator: execution-environment: image: registry.redhat.io/ansible-automation-platform-22/ee-supported-rhel8 pull: policy: missing
使用导航器运行一个剧本
ansible-navigator run 剧本 -i /etc/ansible/hosts -m stdout(命令行的模式)
run 运行的剧本
-i 指定主机清单
-m 指定输出的格式,可视化和字符模式,
可视模式就是进入里面了
2、命令:
查看导航器的模块:ansible-navigator doc -l
ansible-navigator doc vmware.vmware_rest.vcenter_vm_hardware_cpu_info 查看模块的帮助信息
ansible-navigator inventory --list -m stdout -i /etc/ansible/hosts 查看所有的主机
ansible-navigator inventory --list -i /etc/ansible/hosts 可视化模式列出所有的主机

浙公网安备 33010602011771号