ansible基礎以及playbook實戰


ansible比如playbook要寫的多,你沒寫,等於沒學,記不住的,頻繁報錯

ansible架構

在這裏插入圖片描述
ansible的架構主要有下面這幾部分組成:

  • Ansible:ansible核心程序
  • Host Inventory:主機清單,可以定義主機組和主機
  • 模塊:ansible執行任務是由模塊執行的,不是ansible它自己執行的
  • Playbook:劇本,Yaml定義的文件,類似於shell腳本
  • Connect Plugin:連接插件

以搭建LAMP架構爲例,我們的控制端一般擁有多個被控端,並不需要每個被控端都安裝完整的LAMP架構,一般是一些主機安裝Apache,一些安裝MySQL等等,這時候我們可以通過inventory定義主機組和主機,安裝的時候,我們可以編寫playbook或者AD-HOC,然後把模塊等推給被控端,然後被控端再執行playbook或者AH-HOC,完成任務,這個推送過程是使用ssh的方式推送的,確保安全,並且客戶端必須有Python2,確保能夠執行playbook或者AD-HOC。這個就是他的整個架構原理
在這裏插入圖片描述

ansible命令執行過程

  • 加載自己的配置文件,默認/etc/ansible/ansible.cfg;
  • 查找對應的主機配置文件,找到要執行的主機或者組;
  • 加載自己對應的模塊文件,如 command;
  • 通過ansible將模塊或命令生成對應的臨時py文件(python腳本), 並將該文件傳輸至遠程服務器;
  • 對應執行用戶的家目錄的.ansible/tmp/XXX/XXX.PY文件;
  • 給文件 +x 執行權限;
  • 執行並返回結果;
  • 刪除臨時py文件,sleep 0退出;

ansible配置文件

ansible的配置文件是有優先級的:

我們可以進入/etc/ansible/ansible.cfg(默認)的註釋查看

# config file for ansible -- https://ansible.com/
# ===============================================

# nearly all parameters can be overridden in ansible-playbook
# or with command line flags. ansible will read ANSIBLE_CONFIG,
# ansible.cfg in the current working directory, .ansible.cfg in
# the home directory or /etc/ansible/ansible.cfg, whichever it
# finds first

可以看到ansible配置文件存在優先級的問題

  1. ANSIBLE_CONFIG
  2. ansible.cfg 項目目錄
  3. .ansible.cfg 當前用戶的家目錄
  4. /etc/ansible/ansible.cfg 默認就有的

ansible主要配置文件都在註釋說明這裏,可以修改,但是一般不用改

	
[root@manager ~]# cat /etc/ansible/ansible.cfg 
#inventory      = /etc/ansible/hosts      #主機列表配置文件
#library        = /usr/share/my_modules/  #庫文件存放目錄
#remote_tmp     = ~/.ansible/tmp          #臨時py文件存放在遠程主機目錄
#local_tmp      = ~/.ansible/tmp          #本機的臨時執行目錄
#forks          = 5                       #默認併發數
#sudo_user      = root                    #默認sudo用戶
#ask_sudo_pass = True                     #每次執行是否詢問sudo的ssh密碼
#ask_pass      = True                     #每次執行是否詢問ssh密碼
#remote_port    = 22                      #遠程主機端口
host_key_checking = False                 #跳過檢查主機指紋
log_path = /var/log/ansible.log           #ansible日誌

密碼連接的方式不常用,不夠安全
在這裏插入圖片描述
一般使用ssh-keygen先在服務端生成密鑰對,然後把公鑰發給客戶端。實現免密碼登錄,這裏我先生成公鑰,然後發給我的阿里雲主機

[root@lvs ~]# ssh-copy-id [email protected]
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '47.107.65.32 (47.107.65.32)' can't be established.
ECDSA key fingerprint is SHA256:3bZrAWNEKPd87ymeRW56QtvQV7AHzDG52LgBvf7KaRk.
ECDSA key fingerprint is MD5:94:42:fe:2d:ce:5a:c2:2f:79:dc:a4:b4:74:90:09:cb.
Are you sure you want to continue connecting (yes/no)? yu^He
Please type 'yes' or 'no': yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

[root@lvs ~]# ssh [email protected]
Last login: Wed May  6 14:01:03 2020 from 120.231.158.10

Welcome to Alibaba Cloud Elastic Compute Service !

[root@iZwz9hcv43i3gmo6zod6srZ ~]# exit

然後在/etc/ansible/host裏面添加主機組,使用ping模塊測試。
加入這兩行:

[web]
47.107.65.32

使用ping測試

[root@lvs ~]# ansible -m ping web
47.107.65.32 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

可以看到已經ping通。

生產案例1、如果控制端和被控制端第一次通訊,需要確認指紋信息,如果機器特別多的情況下怎麼辦?
將 Ansible 配置文件中的 host_key_checking = False 參數註釋打開即可。但要注意ansible.cfg文件的讀取順序。

在這裏插入圖片描述

ansible模塊

get_url模塊,command,get_url,
在這裏插入圖片描述

ansible playbook基本介紹

playbook是由yaml語法書寫,結構清晰,可讀性強,所以寫playbook必須掌握yaml基礎語法。它有點類似於shell腳本,playbook是把多個要執行的Ad-Hoc寫在一個文件裏邊

編寫playbook的語法

(這裏大家要多寫,只看規則記不住的)

  • 縮進 YAML使用固定的縮進風格表示層級結構,每個縮進由兩個空格組成, 不能使用tabs
  • 冒號 以冒號結尾的除外,其他所有冒號後面所有必須有空格。
  • 短橫線 表示列表項,使用一個短橫槓加一個空格。多個項使用同樣的縮進級別作爲同一列表。
錯誤排查

博主在第一次編寫playbook裏面也遇到粗心的情況,比如

  • 在同一個列表中加了多個-,同一個列表中只要第一個元素加-
  • 忘記加 :
  • hosts與tasks沒有對齊
  • hosts或者tasks漏加了s
  • 空格的問題
  • 注意雙引號的問題

第一種寫法:

- hosts: oldboy
  tasks:

    - name: Installed Httpd Server
      yum: name=httpd state=present

第二種寫法

- hosts: web

  tasks:
    - name: Install httpd
      yum:
        name: 
          - httpd
          - nginx
        state: present

playbook實戰

案例:使用ansible配置安裝httpd服務

[root@m01 project1]# cat http.yaml 
- hosts: web
  tasks:

    - name: Installed Httpd Server
      yum: name=httpd state=present

    - name: Configure Httpd Server
      copy: src=./httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf backup=yes

    - name: Configure Httpd WebSite
      copy: src=./tt.j2 dest=/var/www/html/tt.html owner=http group=http mode=644

    - name: Service Httpd Server
      service: name=httpd state=started enabled=yes

    - name: Service Firewalld Server
      service: name=firewalld state=started

    - name: Configure Firewalld Server
      firewalld: zone=public port=9988/tcp permanent=yes immediate=yes state=enabled
playbook使用變量

爲什麼要使用變量:使用變量更容易的維護,比如我們使用playbook安裝nginx的時候,下次如果想安裝新的版本,可以實現不修改playbook的情況下去安裝,只需要修改存放playbook變量的文件就行

變量怎麼定義

1.通過playbook中的play進行定義變量

  1. 通過vars關鍵字來進行定義變量,使用{{ }}調用

    [root@m01 project1]# cat vars_1.yml 
    - hosts: oldboy
      vars:
        - web_packages: httpd-2.4.6
        - ftp_packages: vsftpd-3.0.2
    
      tasks:
        - name: Installed {{ web_packages }} {{ ftp_packages }}
          yum: 
            name:
              - "{{ web_packages }}"
              - "{{ ftp_packages }}"
            state: present	
    
  2. 通過定義一個yaml變量文件,然後在playbook中使用vars_file指定對應的變量文件,然後{{ }}進行調用

2.通過inventory主機清單進行變量定義

進入/etc/ansible/目錄下面分別新建一個group_varshost_vars文件,(因爲/etc/ansible/目錄裏面有對應的host等文件,這兩個目錄才能生效,隨便進一個目錄創建這兩個目錄是讀取不到變量的)

  1. 進入group_vars目錄創建一個和主機組名字的文件,記得啊要同名,比如我的主機組名字叫web,那麼我創建的存儲變量的文件就叫web,這個文件也是用yaml的語法去寫
[root@lvs group_vars]# cat web 
package: tree
[root@lvs group_vars]# cat tree_install.yaml 
- hosts: web
  
  tasks: 
    - name: Install "{{ package }}"
      yum: name= "{{ package }}" state=present
[root@lvs group_vars]# ansible-playbook  tree_install.yaml

PLAY [web] ****************************************************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************************************
ok: [10.10.31.26]
ok: [10.10.31.28]

TASK [Install "tree"] *****************************************************************************************************************************************************
ok: [10.10.31.26]
ok: [10.10.31.28]

PLAY RECAP ****************************************************************************************************************************************************************
10.10.31.26                : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
10.10.31.28                : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

可以看到執行成功了

ansible變量優先級

定義相同的變量不同的值,來測試變量的優先級。操作步驟如下
1)在plabook中定義vars變量
2)在playbook中定義vars_files變量
3)在host_vars中定義變量
4)在group_vars中定義變量
5)通過執行命令傳遞變量

[root@m01 project1]# cat vars_8.yml

- hosts: oldboy
  vars:
    file_name: play_vars
  vars_files: ./vars_public.yml
  tasks:

    - name: Create Variables {{ file_name }}
      file: path=/tmp/{{ file_name }} state=touch
[root@m01 project1]# vim vars_public.yml 
[root@m01 project1]# vim host_vars/172.16.1.7 
[root@m01 project1]# vim group_vars/oldboy
[root@m01 project1]# vim group_vars/all 

變量的優先級
外置傳參—>playbook(vars_files—>vars)—>inventory(host_vars–>group_vars/group_name—>group_vars-all)

register變量註冊

如果我們想在跑playbook中輸出某個命令的內容,必須使用register關鍵字進行變量註冊,然後命令結果就會保存在這個變量裏面

facts變量

facts變量用來採集被控端的狀態指標,是默認就有的。, 比如: IP地址 主機名稱 cpu信息 內存 等等

默認情況的facts變量名都已經預先定義好了, 只需要採集被控端的信息,然後傳遞至facts變量即.可

facts變量是非常有用的,因爲它可以獲取我們被控端的IP,版本等信息,根據這些信息,我們可以對不同的機器做不同的操作,不如使用fact變量,獲取到系統版本,根據不同的系統版本做不同的操作。

playbook在執行的時候,會採集Facts變量,這個過程比較慢,如果我們的playbook沒有用到這個facts變量,可以吧它關掉,這樣不去採集Facts變量,就會快很多。如果需要在 Play 中關閉 Facts 可以在 Play 這一等級上配置 gather_facts: no

在這裏插入圖片描述

Ansible facts批量修改主機名稱

Linux上生成隨機數的方法,除了使用$RANDOM變量,還可以使用cat /etc/urandom (但是要記得替換掉)
在這裏插入圖片描述
使用ansible批量修改主機名稱有三個思路

一:通過shell模塊執行命令生成隨機數。把這個隨機數作爲主機名
在這裏插入圖片描述
二:可以使用facts變量裏面的一些隨機的東西來生成隨機值

[root@m01 project1]# cat vars_14.yml 
- hosts: web
  tasks:

    - name: SHell
      shell: echo $RANDOM|md5sum |cut -c 5-10
      register: get_random

    - name: Get Facts
      debug:
        msg: "{{ ansible_date_time.epoch }}"

    - name: Hostname
      hostname: name={{ get_random.stdout }}_{{ ansible_date_time.epoch }}
ansible–tasks任務控制
ansible條件語句when

使用when關鍵字進行判斷,條件判斷語句經常會和facts變量一起用,因爲很多時候是根據facts變量進行判斷,常用的facts變量:

在這裏插入圖片描述

實踐案例一:使用when判斷操作系統,Ubuntu安裝httpd2,CentOS安裝httpd

- hosts: web
  tasks:

    - name: Installed {{ ansible_distribution }} Httpd Server
      yum: name=httpd state=present
      when: ( ansible_distribution == "CentOS" )

    - name: Installed {{ ansible_distribution }} Httpd2 Server
      yum: name=httpd2 state=present
      when: ( ansible_distribution == "Ubuntu" )
~                                                   

執行結果可以看出它跳過了安裝httpd2,因爲操作系統不是Ubuntu,這裏因爲其中一臺主機已經安裝過httpd了,所以沒有顯示change

[root@lvs ~]# ansible-playbook install_httpd.yaml --syntax

playbook: install_httpd.yaml
[root@lvs ~]# ansible-playbook install_httpd.yaml 

PLAY [web] ****************************************************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************************************
ok: [10.10.31.26]
ok: [10.10.31.28]

TASK [Installed CentOS Httpd Server] **************************************************************************************************************************************
ok: [10.10.31.28]
changed: [10.10.31.26]

TASK [Installed CentOS Httpd2 Server] *************************************************************************************************************************************
skipping: [10.10.31.28]
skipping: [10.10.31.26]

PLAY RECAP ****************************************************************************************************************************************************************
10.10.31.26                : ok=2    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
10.10.31.28                : ok=2    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    igno
red=0   

實踐案例二:爲web的主機組安裝yum源,其他主機組不安裝

這裏ansible_fqdn是facts變量,表示主機組的名字

[root@m01 project1]# cat tasks_2.yml 
- hosts: all
  tasks:
    - name: Create YUM Repo
      yum_repository:
        name: ansible_nginx
        description: ansible_test
        baseurl: https://mirrors.aliyun.com
        gpgcheck: no
        enabled: no
      when: ( ansible_fqdn is match ("web*"))

實踐案例三:根據命令執行的結果進行判斷

下面代碼中rc表示命令的返回值

[root@m01 project1]# cat tasks_3.yml 
- hosts: all
  tasks:
        #檢查httpd服務是否是活動的
    - name: Check Httpd Server
      command: systemctl is-active httpd
      ignore_errors: yes
      register: check_httpd

	  #如果check_httpd變量中的rc結果等於0,則執行重啓httpd,否則跳過
    - name: Httpd Restart 
      service: name=httpd state=restarted
      when: check_httpd.rc == 0
ansible循環語句

循環語句使用with_items關鍵字,然後調用變量時使用{{ item }}調用,with_items下面都要有-
案例一:使用循環啓動多個服務

[root@m01 project1]# cat tasks_4.yml 
- hosts: webserver
  tasks:

    - name: Service Nginx Server
      service: name={{ item }} state=restarted
      with_items:
        - nginx
        - php-fpm

案例二:循環安裝多個軟件包

[root@m01 playbook]# cat loop-service-v2.yml
- hosts: web
  tasks:
    - name: Installed Httpd Mariadb Package
      yum: name={{ pack }} state=latest
      vars:
       pack:
         - httpd
         - mariadb-server

實踐案例三、使用變量字典循環方式批量創建用戶

[root@m01 project1]# cat tasks_6.yml 
- hosts: web
  tasks:
     - name: Create User 
       user: name={{ item.name }} groups={{ item.groups }} state=present
       with_items:
         - { name: 'www', groups: 'bin'}
         - { name: 'test', groups: 'root'}

使用變量字典循環方式批量拷貝文件

[root@m01 project1]# cat tasks_7.yml 
- hosts: webserver
  tasks:

    - name: Configure Rsyncd Server
      copy: src={{ item.src }} dest={{ item.dest }} mode={{ item.mode }}
      with_items:
        - { src: './rsyncd.conf.j2', dest: '/tmp/rsyncd.conf', mode: '0644' }
        - { src: './rsync.pass.j2', dest: '/tmp/rsync.pass', mode: '0600' }
handlers觸發器

handlers 觸發器 notify監控 —>通知 —> Handlers觸發

  1. 無論多少個task通知了相同的handlers,handlers僅會在所有tasks結束後運行一次。
  2. 只有task發生改變了纔會通知handlers,沒有改變則不會觸發handlers
  3. 不能使用handlers替代tasks、因爲handlers是一個特殊的tasks。

例子
安裝nginx服務,要求能夠實現配置變更,服務自動重載 (萬一配置修改錯誤.怎麼辦?,後面再講錯誤忽略ignore_errors與錯誤處理changed_when)

[root@m01 ~]# cat webserver.yml 
- hosts: webserver

#1.定義變量,在配置文件中調用
  vars:
    http_port: 8881

#2.安裝httpd服務
  tasks:
    - name: Install Httpd Server
      yum: name=httpd state=present

#3.使用template模板,引用上面vars定義的變量至配置文件中
    - name: Configure Httpd Server
      template: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify:   #調用名稱爲Restart Httpd Server的handlers(可以寫多個)
        - Restart Httpd Server

#4.啓動Httpd服務
    - name: Start Httpd Server
      service: name=httpd state=started enabled=yes

#5.如果配置文件發生變化會調用該handlers下面的對應名稱的task
  handlers:
    - name: Restart Httpd Server
      service: name=httpd state=restarted
tags標籤

爲tasks打標籤,可以執行playbook中特定的某個或者某幾個任務,根據指定的標籤執行 調試

指定執行某個tags標籤
[root@m01 docs1]# ansible-playbook -i hosts nginx_php.yml -t "test_user"

忽略執行某個tags標籤
[root@m01 docs1]# ansible-playbook -i hosts nginx_php.yml --skip-tags "test_user"
[root@m01 project1]# cat tasks_8.yml 
- hosts: webserver
  tasks:
    - name: Install Nfs Server
      yum: name=nfs-utils state=present
      tags: install_nfs

    - name: Service Nfs Server
      service: name=nfs-server state=started enabled=yes
      tags: start_nfs-server

include包含

在ansible的playbook中可以使用include關鍵字,把另一個yaml文件的tasks任務導入進來,使用import_playbook關鍵字還可以吧整個完整的playbook文件導入進來

1)編寫restart_httpd.yml文件
[root@ansible project1]# cat restart_httpd.yml	#注意這是一個tasks所有沒有play的任何信息
- name: Restart Httpd Server
  service: name=httpd state=restarted
  
2)A Project的playbook如下
[root@ansible project1]# cat a_project.yml 
- hosts: webserver
  tasks:
    - name: A Project command
      command: echo "A"

    - name: Restart httpd
      include: restart_httpd.yml
	  
3)B Project的playbook如下
[root@ansible project1]# cat b_project.yml 
- hosts: webserver
  tasks:
    - name: B Project command
      command: echo "B"

    - name: Restart httpd
      include_tasks: restart_httpd.ym

導入一個完整的playbook文件   (play task)
[root@m01 project1]# cat tasks_total.yml 
- import_playbook: ./tasks_1.yml
- import_playbook: ./tasks_2.yml
錯誤忽略與錯誤處理

錯誤忽略ignore_errors,錯誤處理changed_when,使用ignore_errors這個關鍵字,如果這個任務執行出錯,會跳過錯誤,繼續執行下一個任務。

change_when

強制調用handlers:force_handlers: yes(加上這個)

[root@m01 project1]# cat tasks_10.yml 
- hosts: webserver
  force_handlers: yes #強制調用handlers

  tasks:
    - name: Touch File
      file: path=/tmp/bgx_handlers state=touch
      notify: Restart Httpd Server

    - name: Installed Packages
      yum: name=sb state=latest

  handlers:
    - name: Restart Httpd Server
      service: name=httpd state=restarted

2.關閉changed的狀態(確定該tasks不會對被控端做任何的修改和變更.,比如執行一些不修改客戶端的命令)
[root@m01 project1]# cat tasks_11.yml 
- hosts: webserver
  tasks:
    - name: Installed Httpd Server
      yum: name=httpd state=present

    - name: Service Httpd Server
      service: name=httpd state=started

    - name: Check Httpd Server
      shell: ps aux|grep httpd
      register: check_httpd
      changed_when: false

    - name: OutPut Variables
      debug:
        msg: "{{ check_httpd.stdout_lines }}"


案例三、使用changed_when檢查tasks任務返回的結果,報錯了就不執行handlers,防止影響網站正常運行
[root@m01 project1]# cat tasks_12.yml 
- hosts: webserver
  tasks: 

    - name: Installed Nginx Server
      yum: name=nginx state=present

    - name: Configure Nginx Server
      copy: src=./nginx.conf.j2 dest=/etc/nginx/nginx.conf
      notify: Restart Nginx Server

    - name: Check Nginx Configure Status
      command: /usr/sbin/nginx -t
      register: check_nginx
      changed_when: 
      # 這裏的意思是如果找到有successful就往下執行,如果沒有,就不往下執行了
       - ( check_nginx.stdout.find('successful')) 
       - false
	   
    - name: Service Nginx Server
      service: name=nginx state=started 


  handlers:
    - name: Restart Nginx Server
      service: name=nginx state=restarted

Jinja2模板引擎

在這裏插入圖片描述
Jinja2跟我們的Django的template模板語法很像,比如我們想要裝一個nginx,配置nginx服務,並且讓他們監聽在不同的端口,那麼我們就可以使用Jinja2模板引擎進行渲染,就不用相同的地方寫多遍,但是其實有它沒它,一樣可以使用,真的是這樣,但使用它可以讓我們提高效率,不過維護成本也比較高,但是去下別人的playbook,別人用了Jinja2,要看得懂
在這裏插入圖片描述
galaxy
下到這裏面去了
在這裏插入圖片描述

ansible roles

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

ansible自定義採集方式

如果我們要自定義某臺機器的採集方式,需要在那臺目標機器上創建/etc/ansible/facts/目錄,然後再這個目錄下創建以.fact結尾的文件,然後我們的setup模塊就可以採集到這個信息

在10.10.31.28這臺機器上,也就是被控端

[root@web02 ~]# mkdir /etc/ansible/facts.d/ -p
[root@web02 ~]# cd /etc/ansible/facts.d/
[root@web02 facts.d]# ls
[root@web02 facts.d]# vim cpu.fact
[root@web02 facts.d]# cat cpu.fact 
[cpu]
cpunum=4
cpuname=i7

在ansible控制端,使用setup模塊採集並過濾,filter='ansible_local',因爲我們自定義的採集的信息,放在ansible_local裏面。可以看到下面採集到的信息,ansible_local是一個字典,鍵是我們ansible.facts目錄下的文件的文件名去掉後綴.fact,然後是參數組(中括號括起來的),然後是變量

[root@lvs cmdb_client]# ansible 10.10.31.28  -m setup -a "filter='ansible_local'"
10.10.31.28 | SUCCESS => {
    "ansible_facts": {
        "ansible_local": {
            "cpu": {
                "cpu": {
                    "cpuname": "i7", 
                    "cpunum": "4"
                }
            }
        }
    }, 
    "changed": false, 
    "failed": false
}
使用Python腳本來自定義採集

注意文件不能以.py爲後綴,要以.fact爲後綴,可以先以.py爲後綴寫好(有語法高亮),然後再改文件名,注意要用print,不要用return

這裏通過Python執行ulimit -n獲取最大的文件描述符的個數,默認是1024

[root@web02 facts.d]# vim get_process.fact
[root@web02 facts.d]# cat get_process.fact 
#!/usr/bin/env python
import os,json
def get_process_num():
	dic={}
	file = os.popen('ulimit -n').read().strip()
	dic['pnum'] = file
	print json.dumps(dic)

if __name__ == "__main__":
	get_process_num()

在ansible控制端採集信息,可以看到採集成功

[root@lvs cmdb_client]# ansible 10.10.31.28  -m setup -a "filter='ansible_local'"
10.10.31.28 | SUCCESS => {
    "ansible_facts": {
        "ansible_local": {
            "cpu": {
                "cpu": {
                    "cpuname": "i7", 
                    "cpunum": "4"
                }
            }, 
            "get_process": {
                "pnum": "1024"
            }
        }
    }, 
    "changed": false, 
    "failed": false
}
ansible自定義模塊

ansible自定義模塊指的是在ansible主控端自己寫一個模塊,ansible自定義採集信息指的是
這裏我自定義一個uptime的模塊(執行uptime命令)

第一步:首先在/etc/ansible/ansible.cfg這裏,把library打開,它默認是註釋的
在這裏插入圖片描述
第二步:進入library定義的目錄,編輯我們的自定義模塊,然後採集信息測試

[root@lvs share]# mkdir my_modules/
[root@lvs share]# vim /etc/ansible/ansible.cfg 
[root@lvs share]# cd my_modules/
[root@lvs my_modules]# vim uptime
[root@lvs my_modules]# cat uptime 
#!/usr/bin/env python
import json
import os
up = os.popen('uptime').read()
dic = {"result":up}
print json.dumps(dic)

採集信息,可以看到採集信息成功

[root@lvs my_modules]# ansible -m uptime LB 
10.10.31.28 | SUCCESS => {
    "changed": false, 
    "failed": false, 
    "result": " 17:38:33 up 2 days, 13:45,  3 users,  load average: 0.00, 0.01, 0.05\n"
}
10.10.31.26 | SUCCESS => {
    "changed": false, 
    "failed": false, 
    "result": " 17:38:33 up 4 days, 22:31,  4 users,  load average: 0.00, 0.01, 0.05\n"
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章