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號