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_taskspost_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   可视化模式列出所有的主机

 

posted @ 2024-04-07 14:59  q_7  阅读(24)  评论(0)    收藏  举报