Ansible系列-基礎篇-Ansible 常見模塊的使用

2022-01-10 全棧運維

 上一篇中簡單嘗鮮了幾個模塊,本篇整理下實際中用到的模塊及其用法Demo,總計有19個模塊,分別為 ping、setup、debug、user、group、authorized_key、shell、script、command、service、systemd、copy、template、synchronize、file、lineinfile、yum、cron

基本模塊ping

ping 模塊主要是驗證管理節點和目標節點之間的連通性,是否正常配置好了對應帳號的ssh免密登錄

(kfz-ansible) [james@devops-jumpserver-vm ]$ ansible devops-gitlab-vpc -m ping
devops-gitlab-vpc | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}

setup

上一篇中配置的時候提到ansible facts 收集目標主機信息,也可以使用 setup 模塊。

(kfz-ansible) [james@devops-jumpserver-vm]$ ansible devops-gitlab-vpc -m setup
devops-gitlab-vpc | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"172.17.115.136"
],
"ansible_all_ipv6_addresses": [],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "04/01/2014",
"ansible_bios_vendor": "SeaBIOS",
"ansible_bios_version": "8c24b4c",
"ansible_board_asset_tag": "NA",
... ...
"ansible_virtualization_type": "kvm",
"gather_subset": [
"all"
],
"module_setup": true
},
"changed": false
}

這個模塊的好處就是讓了解到 Ansible 都有哪些內置的變量,這些變量在我們後續寫playbook的時候,在role templates 中配置很有幫助,

舉個列子,Ansible 批量部署 zabbix agent,每個agent的配置文件中的 ListenIP 和 Hostname 我們就可以使用facts中的變量 ansible_default_ipv4.address 和 ansible_hostname

另外一旦知道知道都有哪些變量的時候,下次我們就可以再收集信息展示的時候,加參數通過filter來過濾我們想看的變量就可。比如

# 這裡只看 ansible_default_ipv4 變量
(kfz-ansible) [james@devops-jumpserver-vm]$ ansible devops-gitlab-vpc -m setup -a 'filter=ansible_default_ipv4'
devops-gitlab-vpc | SUCCESS => {
"ansible_facts": {
"ansible_default_ipv4": {
"address": "172.17.115.136",
"alias": "eth0",
"broadcast": "172.17.255.255",
"gateway": "172.17.255.253",
"interface": "eth0",
"macaddress": "00:16:3e:2e:6e:cf",
"mtu": 1500,
"netmask": "255.255.0.0",
"network": "172.17.0.0",
"type": "ether"
}
},
"changed": false
}

debug

顧名思義,就是我們想調試輸出一些結果的時候,比如上面提到的我想知道目標主機的IP位址

這裡有兩種用法,一種是msg輸出,需要帶{{ variable-name }}, 另外一種是 var 用法,直接寫變量名即可,不用添加 {{ }}

(kfz-ansible) [james@devops-jumpserver-vm]$ ansible devops-gitlab-vpc -m debug -a 'msg={{ ansible_default_ipv4.address }}'
devops-gitlab-vpc | SUCCESS => {
"msg": "172.17.115.136"
}
(kfz-ansible) [james@devops-jumpserver-vm ]$ ansible devops-gitlab-vpc -m debug -a 'var=ansible_default_ipv4.address'
devops-gitlab-vpc | SUCCESS => {
"ansible_default_ipv4.address": "172.17.115.136"
}

用戶相關user/group

遠程管理用戶/用戶組

# 添加組
ansible devops-demo-vpc -m group -a 'name=demogroup'
# 添加用戶
ansible devops-demo-vpc -m user -a 'name=demouser group=demogroup shell=/bin/bash password=newpasswd'

authorized_key

主要用來給目標主機用戶配置公鑰,默認到目標用戶家目錄的.ssh目錄的authorized_keys文件 沒有則創建authorized_keys文件

# 
- name: deliver authorized_keys
authorized_key:
user: james
key: "{{ lookup('file', '/etc/ansible/roles/authorized_keys') }}" # 使用 lookup從本地authorized_keys文件讀取公鑰內容
state: present # absent刪除key

shell/script/command/raw

這裡是把 shell 和 script、command放到一起做對比,其實還有個raw

其中 command 執行單一命令不能使用管道符、重定向符等,raw 類型command,可以使用管道符等;

shell 和 script 類似,都可以執行腳本,卻別在於script執行的腳本在ansible管理機上,而shell執行的腳本必須先放到目標節點上去,才能執行;

另外shell執行可以使用環境變量,bash等,但是script只是執行腳本,不能帶 bash

# check remote host load
ansible devops-demo-vpc -m command -a 'uptime'
# check remote host data disk
ansible devops-demo-vpc -m raw -a 'df -h |grep data'

# execute bash script
# check if exist t.sh on remote host, not exist on remote ,exist on local
(kfz-ansible) [root@devops-ansible /data/temp]# ansible devops-demo-vpc -m shell -a ' ls -l /tmp/t.sh'
devops-demo-vpc | FAILED | rc=2 >>
ls: cannot access /tmp/t.sh: No such file or directorynon-zero return code

# if use base when script, error here
(kfz-ansible) [root@devops-ansible /data/temp4]# ansible devops-demo-vpc -m script -a 'bash /data/temp/t.sh'
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: If you are using a module and expect the file to exist on the remote, see the remote_src option
devops-demo-vpc | FAILED! => {
"changed": false,
"msg": "Could not find or access 'bash'\nSearched in:\n\t/data/temp/files/bash\n\t/data/temp/bash\n\t./files/bash\n\t./bash on the Ansible Controller.\nIf you are using a module and expect the file to exist on the remote, see the remote_src option"
}

# script on local and use script module to execute on remote host
(kfz-ansible) [root@devops-ansible /data/temp]# ansible devops-demo-vpc -m script -a ' /data/temp/t.sh |grep result'
devops-demo-vpc | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to test-liuchao-01-vm closed.\r\n",
"stderr_lines": [
"Shared connection to test-liuchao-01-vm closed."
],
"stdout": "result: I am on host [test-liuchao-01-vm]\r\n",
"stdout_lines": [
"result: I am on host [test-liuchao-01-vm]"
]
}

(kfz-ansible) [root@devops-ansible /data/temp]# ansible devops-demo-vpc -m copy -a 'src=t.sh dest=/tmp/t-remote.sh mode=0755'
devops-demo-vpc | CHANGED => {
"changed": true,
"checksum": "14d91fbe7abd4e406124460149048fd7d88d2216",
"dest": "/tmp/t-remote.sh",
"gid": 0,
"group": "root",
"md5sum": "916c5f68555199e2019030dd0b3cdc62",
"mode": "0755",
"owner": "root",
"size": 84,
"src": "/root/.ansible/tmp/ansible-tmp-1637916752.9830978-13704-278698223191801/source",
"state": "file",
"uid": 0
}
(kfz-ansible) [root@devops-jumpserver-vm /data/temp Fri Nov 26 16:52:34]# ansible devops-demo-vpc -m shell -a 'bash /tmp/t-remote.sh'
devops-demo-vpc | CHANGED | rc=0 >>
hello Ansible
result: I am on host [devops-demo-vpc]

服務管理service / systemd

都是用來管理伺服器上的服務,區別在於Service服務管理用於centos6及以前的系統,而systemd命令應用於centos7系統

核心參數 name\state\enabled

# enable and start nginx
ansible devops-demo-vpc -m service -a 'name=nginx enabled=true state=started'

# reload
ansible devops-demo-vpc -m service -a 'name=nginx state=reloaded'

文件管理copy

把管理節點的文件copy到目標節點,並配置相關屬性

# 常規copy文件到目標主機
ansible devops-demo-vpc -m copy -a 'scr=t.sh dest=/tmp/t-remote.sh mode=0755 owner=james group=james'

# 有時候不是copy文件,而是直接指定內容
ansible devops-demo-vpc -m copy -a 'content="hello world, hello Ansible" dest=/tmp/t-remote.txt'

# force=yes 遠程存在同名文件則強制覆蓋
ansible devops-demo-vpc -m copy -a 'scr=t.sh dest=/tmp/t-remote.txt force=yes'

# backup是遠程存在同名文件則先備份在覆蓋
ansible devops-demo-vpc -m copy -a 'scr=t.sh dest=/tmp/t-remote.txt backup=yes'

template

template 的作用和copy一樣,區別在於源文件是jinja2格式,文件中可以配置 Ansible變量,然後在目標節點上替換成對應的目標值

(kfz-ansible) [james@devops-jumpserver-vm]$ ansible devops-baseimage-vpc -m template -a 'src=/tmp/ansible-template-jinja2.j2 dest=/tmp/ansible-template-jinja2.txt mode=0644 '
devops-baseimage-vpc | CHANGED => {
"changed": true,
"checksum": "60fcb9b1049408735a56fd7282254abf52fd6125",
"dest": "/tmp/ansible-template-jinja2.txt",
"gid": 0,
"group": "root",
"md5sum": "ef974d5fd45dddce50b765d6b20d6abe",
"mode": "0644",
"owner": "root",
"size": 61,
"src": "/home/james/.ansible/tmp/ansible-tmp-1637489176.9135442-5845-46738029442091/source",
"state": "file",
"uid": 0
}
(kfz-ansible) [james@devops-jumpserver-vm]$ ansible devops-baseimage-vpc -m shell -a 'cat /tmp/ansible-template-jinja2.txt'
devops-baseimage-vpc | CHANGED | rc=0 >>
Hostname is: devops-baseimage-vpc
Host IP is: 172.17.115.134

另外一個需要住的就是在roles中,copy默認是從files目錄獲取文件,template默認是 templates 文件夾獲取模板文件

synchronize

主要用於目錄、文件的同步,基於 rsync實現,主要是有push 和 pull 兩種方式, 如果是push 推送,則src是管理節點,dest是目標節點;如果是pull拉取,則src是目標節點,dest是管理節點

# 推送至遠程目標節點
ansible devops-demo-vpc -m synchronize -a 'mode=push src=/opt/scripts dest=/opt/target/scripts recursive=yes archive=yes
# 從遠程目標節點獲取到本地
ansible devops-demo-vpc -m synchronize -a 'mode=pull src=/opt/target/scripts dest=/opt/scripts recursive=yes archive=yes

file

在目標節點創建文件或目錄,刪除文件或目錄,修改文件或目錄的權限等;核心參數有:path、state、owner、group、mode、recurse

# 創建目錄
ansible devops-demo-vpc -m file -a 'path=/opt/script state=directory'
# 創建文件並設置屬主、屬組及權限
ansible devops-demo-vpc -m file -a 'path=/opt/script/test.sh owner=test group=test mode=755'
# 刪除文件
ansible devops-demo-vpc -m file -a 'path=/opt/script/test.sh state=absent'
# 遞歸創建目錄
ansible devops-demo-vpc -m file -a 'path=/opt/script/sub1/sub2/sub3 state=directory recurse=true'

lineinfile

在文件中添加、修改、刪除一行記錄,在實踐中用的很多,這裡做簡單介紹,後續有單獨文章詳細介紹

# 在文件的匹配行之前插入一行記(在匹配的 Listen 80這行後面插入 server_name www.colinspace.com)
- name: insert after match line demo
lineinfile:
dest: /etc/nginx.conf
insertafter: '^listen 80'
line: 'server_name www.colinspace.com'

# 修改匹配的行
- name: update match line demo
lineinfile:
dest: /etc/nginx.conf
regex: 'server_name www.*'
line: 'server_name blog.colinspace.com'
mode: 0644

Linux系統維護yum

顧名思義,就是我們在Centos下進行yum安裝,核心參數主要關注:name 需要安裝的軟體名、state 軟體的狀態(present、absent、removed、latest)和 enablerepo 特殊情況指定yum源

# 安裝Nginx
ansible devops-demo-vpc -m yum -a 'name=nginx state=present'
# 卸載Nginx (absent和removed一樣)
ansible devops-demo-vpc -m yum -a 'name=nginx state=remove'

cron

管理Linux定時任務,核心參數說明 name 定時任務的名稱、 state 任務的狀態、minute/hour/day/month/weekday 分別設定任務執行的時間配置、user指定是哪個用戶配置任務,默認是管理員

# 每天凌晨 01:05 執行腳本
ansible devops-demo-vpc -m cron -a 'name="Demo cron" hour=1 minute=05 job="bash /tmp/1.sh" '
# 刪除上述任務(注意任務名保持一致)
ansible devops-demo-vpc -m cron -a 'name="Demo cron" state=absent"

相關焦點

  • Ansible系列-基礎篇-Ansible 的安裝、配置和基本使用
    3.0以上版本,雖然系統預裝了2.7.5 但是官方都宣布不再維護該版本了,其他類似 openssl、git 等系統默認的版本就已經滿足4、本系列教程用到的環境# python (kfz-ansible) [jumproot@devops-jumpserver-vm]$ python -VPython 3.9.8
  • Ansible 常用模塊
    Ansible 默認提供了非常多的模塊我們使用。我們可以使用ansible-doc 命令顯示模塊幫助。
  • ansible使用小結:ansible的安裝
    apt-add-repository ppa:ansible/ansible$ sudo apt-get update$ sudo apt-get install ansible3、源碼安裝源碼安裝需要python2.6以上版本,其依賴模塊paramiko、PyYAML、Jinja2、httplib2、simplejson、pycrypto模塊,以上模塊可以通過
  • ansible role 基礎
    必須包含一個 main(.yaml .yml) 文件library/my_module.py - 自定義模塊文件(如果自定義的模塊已經存放到module search path下了,這裡可以不用添加)defaults/main.yml - 存放默認變量,優先級最低
  • 可能是最強網工ansible入門及深入教程之 ansible雜談
    我的這個系列也視圖帶你從原始碼角度去看看ansible的強,放心,原始碼我也就大概其一講,幫助你更加理解ansible。這個時候你需要去看浩瀚的官方文檔或者在原始碼裡翻翻,發現有一個模塊叫cli模塊基於network_cli模塊,可能滿足你的需求,試著弄懂它的邏輯,然後自己適配一個新的國產平臺,這樣你的ansible就支持新的network_os了。這是hard模式,hard模式下你可以使用ansible。
  • Ansible 介紹
    Playbook 中包含一個或多個 play,每個 play 會在一組或多組計算機上按順序執行已經定義好的一系列 task,每個 task 都是一個執行模塊。模塊(Module): 用於確保主機處於某一個特定的狀態,例如可以使用 yum(對於不同發行版本的 Linux,模塊名可能有所不同個,如,在 Ubuntu 中與之對應的是 apt 模塊。)
  • Ansible使用及YAML語法介紹
    所有的這幾個目標本質上來說都是在一個臺或者幾臺伺服器上,執行一系列的命令而已,而如果你要管理的伺服器是成千上萬臺的,那你用一臺伺服器去管理控制這大批量的伺服器,勢必會造成這臺主控機的相當可觀的資源消耗和性能的低下(即使可以使用 Ansible -f 參數並行執行),這時就需要有種 p2p 的概念,讓每一臺被同步、配置的伺服器也可以做為一臺 ansible 中控機去同步配置其它的伺服器。
  • Ansible 日常使用技巧 (下)
    在日常運維工作中,在有的時候 ansble-playbook 的結果依賴於變量、fact 或者是前一個任務的執行結果,從而需要使用到條件語句。使用 ansible-playbook 時,可能需要對某些條件進行判斷,只有當滿足條件才執行相應的tasks。
  • 使用 Ansible 管理 Windows
    本文主要介紹在如何使用 Ansible 管理 Windows 客戶端,Ansible 官方提供了一個很方便的安裝腳本,對於外網用戶來說安裝真的很輕鬆,可惜筆者遇到的問題是如何在內網部署,有相同煩惱的小夥伴不妨參考下輕輕鬆鬆使用 Ansible 管理 Windows 客戶端Ansible 在 2.3 版本之前對於 Windows 支持的並不算很友好,從 2.4 版本開始已經可以使用原生模塊實現很多需求
  • 如何使用 Ansible 安裝軟體 | Linux 中國
    與可擴展框架一樣,Ansible 本身功能有限,它真正的功能體現在許多模塊中。在某種程度上,Ansible 模塊就是 Linux 系統的命令。它們針對特定問題提供解決方案,而維護計算機時的一項常見任務是使所有計算機的更新和一致。我曾經使用軟體包的文本列表來保持系統或多或少的同步:我會列出筆記本電腦上安裝的軟體包,然後將其與臺式機或另一臺伺服器之間進行交叉參考,手動彌補差異。
  • ansible 入門使用
    Ansible模塊Module什麼是Ansible Module?下面文件中使用了兩個變量ansible_hostname和ansible_default_ipv4.address。都是facts變量,ansible會替我們搜索,直接可以在playbook中使用,當然也可以直接在template中使用。
  • 一個高效使用Ansible的小技巧
    但其實 Ansible 是基於模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是 ansible 所運行的模塊, Ansible 只是提供一種框架。常用模塊模塊列表[2] 你就當成是工具目錄,上面介紹也說了:「Ansible 是基於模塊工作的」,所有你熟悉了模塊,也就熟悉了 Ansible 的使用。
  • 一文詳解 Ansible 的自動化運維
    ansible-console ansible-doc-2.7 ansible-playbook-2 ansible-vault1)ansibleansible 是生產環境中使用非常頻繁的命令之一,主要在以下場景使用:非固化需求是指臨時性的維護,如查看web伺服器組磁碟使用情況、複製一個文件到其他機器等。
  • 一文詳解Ansible自動化運維
    可以自行從網際網路上直接下載Ansible所需軟體包,本篇博客提供安裝Ansible自動化運維工具所需的依賴軟體包,網盤連結:https://pan.baidu.com/s/1EduwbjYwoj2Pzl9Ye14HEw,提取碼:hsvm。如果使用本人提供的網盤連結,自己建立yum配置文件,掛載光碟這些就不說了啊,畢竟太基礎了!使用網際網路直接安裝即可(實驗環境我這裡是關閉防火牆和SELinux的)。
  • 極簡教程|20 分鐘玩轉Ansible系列手冊!
    # ansible-doc -l                列出ansible所有的模塊# ansible-doc -s MODULE_NAME    查看指定模塊具體適用Ansible命令應用基礎語法:ansible <host-pattern> [-f forks] [-m module_name] [-a args]<
  • 使用 Ansible 管理 MySQL 複製
    如果您想指定清單文件的路徑,那麼使用 – i 參數,加上文件路徑即可,如下:ansible webserver – i /etc/ansible/other-hosts – a「whoami」以上是一條 ad-hoc 命令,也即臨時執行命令。
  • 一文帶你了解Ansible
    更詳細的參數說明,您可以使用ansible --help查看,這裡不做說明!該部分只介紹ansible的簡單使用,下面我將分模塊具體介紹Ansible。和主機使用方式一樣,使用主機組時,直接調用主機組名即可。比如:ansible -i /hosts centos6 -m ping3.3 動態Inventoryinventory不僅僅只有靜態文件,我們也可以動態的獲取外部的主機數據。由於動態inventory不是這篇文章的重點,我們就不再贅述了。
  • Ansible 架構與工作原理
    默認使用 SSH 進行遠程連接。無需在被管理節點上安裝附加軟體,可使用各種程式語言進行擴展。一、Ansible基本架構上圖為ansible的基本架構,從上圖可以了解到其由以下部分組成:核心:ansible核心模塊(Core Modules):這些都是ansible自帶的模塊擴展模塊(Custom Modules):如果核心模塊不足以完成某種功能,可以添加擴展模塊
  • Ansible:99%的運維人比掌握技能!
    這家公司還提供 Tower 軟體和諮詢服務,這個款軟體能使開發者輕鬆地建立和管理規模化應用程式的 IT 基礎架構。所以,希望大家可以進一個好公司,把技術提升好了,做一個好產品。模塊執行shell命令,command:作為ansible的默認模塊,可以運行遠程權限範圍內的所有shell命令例1:使用ping檢查『web-servers』組或者ansible節點的連通性。
  • [原創] Ansible Ad-Hoc命令集之一
    二、Ad-Hoc命令集介紹上節我們介紹了Ad-Hoc的使用場景,本小節為大家介紹通過Ad-Hoc 命令集Ansible查看系統設置,通過Ad-Hoc研究Ansible的並發特性,通過Ad-Hoc研究Ansible的模塊使用。磨刀不誤砍柴工,開始之前做一些簡單的初始化化檢查,如系統時間正確與否,磁碟容量是否充足等,這些檢查工作是很有必要的。