rh358 002 fact變數獲取 ansible設定網路 service_facts

2022-08-28 21:00:51

通過ansible 獲取網路資訊

1.如何獲取fact事實變數

方式1:

ansible servera -m  servera

方式2:

劇本

[root@workstation ansible]# cat ake.yaml 
---
- name: get all facts
  hosts: servera
  tasks:
    - name: get all facts
        debug:
                msg: "{{ ansible_facts }}"
[root@workstation ansible]# ansible-playbook ake.yaml 

2.如何獲取某個具體的事實變數

比如:獲取fqdn或者Hostname。得分析變數型別

變數型別

1>list
    list=[1,2,3,4,5]
2>dict
    dict={'a':1,'b':2}
3>set   集合

4>tuple  元組

5>string   字串

有巢狀型別

ansible_facts={"ansible_all_ipv4_addresses": ['xxx','xxxx'],"a":3}
字典的值是列表。各種巢狀可以通過格式觀察

    ansible_facts的一級別的key:對應的value如果是列表[1,2,3,4,5],這樣的值可以用來回圈
    
    ansible_facts的第一級key:對應的value如果是個字典,獲取的方式就是ansible_facts['key1_name']獲取

如果一級key以ansible開頭,需要把ansible去掉

如圖我去掉了一級key ansible_all_ipv4_addresses的ansible
一級key都是以ansible打頭

取value為列表的值
索引取值

迴圈取值

取value為字典的值

取一個深層級深的

只要不是ansible開頭的一級key,那麼就一級一級網上找。才可以

3.網路資訊有關的事實變數

很簡單

4.如何通過MAC地址來獲取對應的網路卡名稱

例子:[我是mac地址 52:54:00:00:fa:09:已知條件 --> 屬於這個mac的網路卡名稱

ansible_facts['nic_name']['macaddress']
通過mac得到name
ansible_facts['interfaces'] --> 能獲取到所有的網路卡名稱,如果把所有的MAC取出,和已知Mac做對比就行

實踐

報錯因為網路卡lo沒有mac,無lo,為空值

得學會對value列表做迴圈並判斷

5.在一個task內定義的變數,是否可以在下一個task呼叫

可以看到變數的作用域被限制


可以看到fact定義的變數未被限制

練習題
1:確認networkmanger服務是否開啟
2:獲取特定MAC的網路卡介面
3:設定這個MAC的網路
4:通過Ansible_facts獲取ip和Mac地址



前兩步

參照角色

[root@workstation ansible]# yum -y install rhel-system-roles.network
[root@workstation roles]# cd rhel-system-roles.network/
[root@workstation rhel-system-roles.network]# ls
defaults  library  LICENSE  meta  module_utils  pylintrc  README.html  README.md  tasks  tests  tox.ini
[root@workstation rhel-system-roles.network]# pwd
/usr/share/ansible/roles/rhel-system-roles.network
[root@workstation rhel-system-roles.network]# 


become可以提權,普通使用者無法改網路卡
使用紅帽的role角色,可以檢視readme

[root@workstation ansible]# ansible-playbook  playbook.yaml 

PLAY [network] **************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************************************************
ok: [servera]

TASK [rhel-system-roles.network : Check which services are running] *********************************************************************************************************************************************
ok: [servera]

TASK [rhel-system-roles.network : Check which packages are installed] *******************************************************************************************************************************************
ok: [servera]

TASK [rhel-system-roles.network : Print network provider] *******************************************************************************************************************************************************
ok: [servera] => {
    "msg": "Using network provider: nm"
}

TASK [rhel-system-roles.network : Install packages] *************************************************************************************************************************************************************
skipping: [servera]

TASK [rhel-system-roles.network : Enable and start NetworkManager] **********************************************************************************************************************************************
ok: [servera]

TASK [rhel-system-roles.network : Enable network service] *******************************************************************************************************************************************************
skipping: [servera]

TASK [rhel-system-roles.network : Ensure initscripts network file dependency is present] ************************************************************************************************************************
skipping: [servera]

TASK [rhel-system-roles.network : Configure networking connection profiles] *************************************************************************************************************************************
[WARNING]: [003] <info>  #0, state:up persistent_state:present, 'eth1': add connection eth1, 1e60e42a-10e8-4a27-ba92-c5698ae322c1
[WARNING]: [004] <info>  #0, state:up persistent_state:present, 'eth1': up connection eth1, 1e60e42a-10e8-4a27-ba92-c5698ae322c1 (not-active)
changed: [servera]

TASK [rhel-system-roles.network : Re-test connectivity] *********************************************************************************************************************************************************
ok: [servera]

TASK [confirm Networkmanager service] ***************************************************************************************************************************************************************************
ok: [servera]

TASK [get interface name] ***************************************************************************************************************************************************************************************
skipping: [servera] => (item=lo) 
ok: [servera] => (item=eth1)
skipping: [servera] => (item=eth0) 
skipping: [servera] => (item=eth2) 

TASK [debug net_name] *******************************************************************************************************************************************************************************************
ok: [servera] => {
    "msg": "eth1"
}

PLAY RECAP ******************************************************************************************************************************************************************************************************
servera                    : ok=10   changed=1    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0   

很明顯角色先開始跑,後面才跑了任務,但是我任務裡有一個檢查服務。這個得先執行

pre_tasks改變優先順序

也可以在tasks內匯入角色
匯入角色的方式有兩種
import_role 執行前 執行role
include_role 執行後 執行role

上面兩次方式改變了順序
預設先執行role

自動化服務管理

service模組
無法執行daemon-reload: yes

[root@workstation ansible]# cat fox.yaml 
---
- name: network
  hosts: servera
        
  tasks:

    - name: abc
      service_facts:
    - name: print
      debug:
                msg: "{{ ansible_facts }}"

會使fact多出服務的資訊
增加了事實變數,關於服務的
手機服務狀態,儲存為ansible事實變數

service_facts

檢視sshd服務狀態

舉個牽強的例子使用serice_facts的變數

service_facts: 用來收集系統當前所有的服務狀態
並設定為ansible_facts['service']