Ansible學(xué)習(xí)筆記——基礎(chǔ)與配置

〇、Ansible整體介紹

Ansible是一個(gè)當(dāng)時(shí)最為流行的集群部署與配置工具渗饮,在服務(wù)器配置和運(yùn)維管理的過程中有重要的作用和優(yōu)勢(shì)但汞。本文主要為結(jié)合個(gè)人的學(xué)習(xí)心得,向?qū)nsible有興趣的朋友盡可能深入簡(jiǎn)出互站、詳盡的介紹這個(gè)工具的原理和用法私蕾。

Ansible是由Ansible Inc.和Red Hat共同開發(fā)的一款開源集群配置軟件,編寫語言為python胡桃,使用時(shí)的配置文件語言為yaml踩叭。核心組件使用了paramiko和PyYaml。其中paramiko是python的ssh支持庫翠胰,而PyYaml則用于支持yaml配置文件的使用和playbook的應(yīng)用容贝。

Ansible有著非常突出的優(yōu)點(diǎn),從而使其在saltstack等集群配置工具中脫穎而出亡容。優(yōu)勢(shì)如下:

  • 僅需管理主機(jī)安裝并配置即可嗤疯,所有的配置工作都通過ssh連接下發(fā)至被管理主機(jī)。
  • 輕量化
  • Python編寫闺兢,源代碼可讀性強(qiáng)茂缚。同時(shí)playbook使用yml配置戏罢,容易上手
  • 對(duì)于集群和ECS的支持非常完美。
  • 支持大量API接入脚囊,并且對(duì)于python的擴(kuò)展支持良好龟糕。
  • 由于架構(gòu)出色,理論上在管理主機(jī)性能到位的情況下可以同時(shí)配置近乎無限的主機(jī)悔耘。

一讲岁、Ansible基本配置和受管主機(jī)接入

1、安裝和基本配置

  • 首先是Ansible的安裝配置衬以,以CentOS為例:
$ yum install -y ansible
  • 其次配置宿主機(jī)對(duì)受管機(jī)的免密登錄缓艳,如果已經(jīng)配置可以直接跳過
$ ssh-keygen -t rsa     ##如果之前已經(jīng)生成過秘鑰了則不需要這一步
$ ssh-copy-id root@<agent_ip>  ##向受管機(jī)配置管理機(jī)的公鑰,這一步可能需要輸入受管機(jī)密碼
  • 在配置完公鑰之后記得把受管機(jī)的IP信息記錄到/etc/ansible/hosts文件中看峻,如果你需要使用的是之后的ansible-playbook阶淘,則需要在對(duì)應(yīng)的工作文件夾內(nèi)創(chuàng)建一個(gè)hosts文件記錄受管機(jī)IP。以下為一個(gè)標(biāo)準(zhǔn)的ansible hosts文件的格式:
172.26.0.81    ##不分組直接聲明IP
172.26.0.82:54208    ##申明特殊的ssh端口

[fangwei-test]           ##申明了受管機(jī)的列表和分類名
172.26.0.83        ##直接聲明IP
Printer     ansible_ssh_host=172.26.0.84    ##定義別名和IP
EMR-master  ansible_ssh_host=172.26.0.85
Snipe-it    ansible_ssh_host=172.26.0.86
Kubernetes  ansible_ssh_host=172.26.0.87

[fangwei-test:vars]      ##配置對(duì)應(yīng)的用戶等ansible變量
ansible_user=root

這里順便介紹一下hosts文件中常用的ansible變量聲明:

ansible_ssh_host ##連接目標(biāo)主機(jī)的地址

ansible_ssh_port ##連接目標(biāo)主機(jī)的端口互妓,默認(rèn) 22 時(shí)無需指定

ansible_ssh_user ##連接目標(biāo)主機(jī)默認(rèn)用戶

ansible_ssh_pass ##連接目標(biāo)主機(jī)默認(rèn)用戶密碼

ansible_ssh_connection ##目標(biāo)主機(jī)連接類型溪窒,可以是 local 、ssh 或 paramiko

ansible_ssh_private_key_file ##連接目標(biāo)主機(jī)的 ssh 私鑰冯勉,用于安全要求高的機(jī)器澈蚌。可以使用其他管理主機(jī)的公鑰來登錄特定的主機(jī)灼狰。

ansible_*_interpreter ##指定采用非 Python 的其他腳本語言
  • 在這一切都配置完畢后宛瞄,可以對(duì)這個(gè)類的受管機(jī)進(jìn)行ping測(cè)試,具體為:
$ ansible fangwei-test -m ping

2. Ansible命令參數(shù)介紹

ansible本身自帶非常多的參數(shù)選項(xiàng)伏嗜,可以適配幾乎任何集群部署的需求和各種測(cè)試需求坛悉。
這些參數(shù)在ansible-playbook等延伸指令中往往也通用伐厌。

$ ansible --help

Usage: ansible <host-pattern> [options]

Define and run a single task 'playbook' against a set of hosts  ##單純的ansible指令用于對(duì)一個(gè)或者一組受管機(jī)執(zhí)行一個(gè)playbook任務(wù)

普通參數(shù):
  -a MODULE_ARGS, --args=MODULE_ARGS
                        #[重要]模塊參數(shù)
  --ask-vault-pass     # 要求輸入管理密碼
  -B SECONDS, --background=SECONDS
                        #異步運(yùn)行承绸,X秒后失敗(默認(rèn)關(guān)閉)
  -C, --check           #不對(duì)受管機(jī)執(zhí)行任何改變,但是假設(shè)已執(zhí)行語句并返回結(jié)果(用于測(cè)試)
  -D, --diff            #當(dāng)改變小體積文件的時(shí)候挣轨,顯示兩者的區(qū)別军熏,常常和-C參數(shù)一起用(用于測(cè)試)
  -e EXTRA_VARS, --extra-vars=EXTRA_VARS
                        #將其他變量設(shè)置為key = value或YAML / JSON,如果filename前綴為@
  -f FORKS, --forks=FORKS
                        #指定要使用的并行進(jìn)程數(shù)(默認(rèn)值= 5)
  -h, --help            #顯示此幫助消息并退出
  -i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY
                        #指定庫存主機(jī)路徑或逗號(hào)分隔的主機(jī)列表卷扮。PS: --inventory-file已棄用
  -l SUBSET, --limit=SUBSET
                        #進(jìn)一步將所選主機(jī)限制為其他模式
  --list-hosts          #輸出匹配主機(jī)列表;不會(huì)執(zhí)行任何其他操作
  -m MODULE_NAME, --module-name=MODULE_NAME
                        ##[重要]要執(zhí)行的模塊名稱(默認(rèn)為command)
  -M MODULE_PATH, --module-path=MODULE_PATH
                        ##將冒號(hào)分隔的路徑預(yù)先添加到模塊庫(默認(rèn)為[u'/root/.ansible/plugins/modules',u'/usr/share/ansible/plugins/modules'])
  -o, --one-line        ##壓縮輸出荡澎。
  --playbook-dir=BASEDIR
                        ##由于此工具不使用playbooks,因此將其用作替代playbook目錄晤锹。這將設(shè)置許多功能的相對(duì)路徑摩幔,包括roles/group_vars/etc. 也就是變相實(shí)現(xiàn)部分playbook功能。
  -P POLL_INTERVAL, --poll=POLL_INTERVAL
                        ##如果使用-B(默認(rèn)值= 15)鞭铆,則設(shè)置輪詢間隔或衡。
  --syntax-check        ##對(duì)playbook執(zhí)行語法檢查,但不執(zhí)行它.
  -t TREE, --tree=TREE  ##將輸出記錄到此目錄
  --vault-id=VAULT_IDS  ##顯示要使用的保管庫標(biāo)識(shí)
  --vault-password-file=VAULT_PASSWORD_FILES
                        ##保管庫密碼文件
  -v, --verbose         ##詳細(xì)模式(-vvv表示更多,-vvvv表示啟用連接調(diào)試)
  --version             ##顯示ansible版本并退出

  連接相關(guān)參數(shù):
    主要關(guān)于控制哪些受管機(jī)以及如何連接到主機(jī)封断。

    -k, --ask-pass      ##要求輸入受管機(jī)密碼
    --private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE
                        ##使用特點(diǎn)文件來認(rèn)證鏈接
    -u REMOTE_USER, --user=REMOTE_USER
                        ##以特定user來進(jìn)行連接斯辰。
    -c CONNECTION, --connection=CONNECTION
                        ##要使用的連接類型(默認(rèn)=智能)
    -T TIMEOUT, --timeout=TIMEOUT
                        ##以秒為單位覆蓋連接超時(shí)(默認(rèn)值= 10)
    --ssh-common-args=SSH_COMMON_ARGS
                        ##指定傳遞給sftp / scp / ssh的公共參數(shù)(例如ProxyCommand)
    --sftp-extra-args=SFTP_EXTRA_ARGS
                        ##指定僅傳遞給sftp的額外參數(shù)(例如-f,-l)
    --scp-extra-args=SCP_EXTRA_ARGS
                        ##指定僅傳遞給scp的額外參數(shù)(例如-l)
    --ssh-extra-args=SSH_EXTRA_ARGS
                        ##指定僅傳遞給ssh的額外參數(shù)(例如-R)

  特權(quán)升級(jí)參數(shù):
    控制你在目標(biāo)主機(jī)上如果成為或者成為哪個(gè)用戶

    -s, --sudo          ##用sudo(nopasswd)運(yùn)行操作(不推薦坡疼,推薦使用--become-method)
    -U SUDO_USER, --sudo-user=SUDO_USER
                        ##所需的sudo用戶(默認(rèn)= root)(不建議使用彬呻,推薦使用--become-method)
    -S, --su            ##用su運(yùn)行操作 (不建議使用,推薦使用--become-method)
    -R SU_USER, --su-user=SU_USER
                        ##以su作為此用戶運(yùn)行操作(默認(rèn)=無)(不建議使用柄瑰,推薦使用--become-method)
    -b, --become        ##用run運(yùn)行操作(不顯示密碼提示)
    --become-method=BECOME_METHOD
                        ##要使用的權(quán)限升級(jí)方法(默認(rèn)= sudo)闸氮,可選項(xiàng)有: [ sudo | su | pbrun | pfexec | doas | dzdo | ksu | runas | pmrun | enable | machinectl ]
    --become-user=BECOME_USER
                        ##以此用戶身份運(yùn)行操作(默認(rèn)= root)
    --ask-sudo-pass     ##請(qǐng)求sudo密碼(不推薦使用,推薦使用--become-method)
    --ask-su-pass       ##請(qǐng)求su密碼 (不推薦使用教沾,推薦使用--become-method)
    -K, --ask-become-pass
                        ##要求提供權(quán)限提升密碼

二湖苞、Ansible模塊介紹與使用

Ansible內(nèi)置了海量的原生模塊和大量的用于連接第三方API的支持模塊,熟練掌握基礎(chǔ)模塊详囤,并且活用各種擴(kuò)展模塊财骨,是熟練掌握Ansible的必經(jīng)之路。這一章里面我們會(huì)對(duì)Ansible的模塊進(jìn)行基礎(chǔ)的介紹和使用案例分析藏姐。至于詳細(xì)的模塊介紹可以查看我寫的Ansible支持模塊詳表隆箩。

在ansible中查看所有的模塊只需要一個(gè)命令:

$ ansible-doc -l

如果需要查看某一個(gè)特定的模塊的詳細(xì)解釋則可以直接查詢,以ping模塊為例:

[root@Host ~]# ansible-doc ping
> PING    (/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py)

        A trivial test module, this module always returns `pong' on successful contact. It does not make sense in playbooks, but it is useful from
        `/usr/bin/ansible' to verify the ability...     ##之后省略

模塊的重要性除了本身的強(qiáng)大功能外羔杨,熟練地掌握模塊也是之后playbook部分的基礎(chǔ)捌臊。一個(gè)優(yōu)秀的playbook使用者必然對(duì)常用模塊的參數(shù)了如指掌。

0兜材、Ping模塊

ping這個(gè)模塊主要用來測(cè)試能否連通目標(biāo)服務(wù)器理澎。

$ ansible test -m ping

1. Command模塊

Command模塊自如其名,就是一個(gè)很純粹的命令執(zhí)行模塊曙寡,用于在受管機(jī)上進(jìn)行命令的執(zhí)行糠爬,其本身也可以配合很多二級(jí)參數(shù)和指令進(jìn)行功能的擴(kuò)展。不支持管道功能举庶。例如最簡(jiǎn)單的查看hostname功能:

[root@Printer ~]# ansible fangwei -m command -a 'hostname'
EMRtest | CHANGED | rc=0 >>
EMR-master

Snipeit | CHANGED | rc=0 >>
localhost.localdomain

需要注意的是执隧,在沒有特地指定ansible的-m參數(shù)的時(shí)候,默認(rèn)調(diào)用的Module就是command户侥。
下面是command常用的幾個(gè)二級(jí)參數(shù):

  • creates:判斷镀琉,當(dāng)該文件存在時(shí),則該命令不執(zhí)行
  • free_form:需要執(zhí)行的Linux指令
  • chdir:在執(zhí)行命令之前蕊唐,先切換到該指定的目錄
  • removes:判斷屋摔,當(dāng)該文件不存在時(shí),則該選項(xiàng)不執(zhí)行
  • executable:切換shell來執(zhí)行命令替梨,該執(zhí)行路徑必須是一個(gè)絕對(duì)路徑
    下面為chdir的用法舉例钓试,其他的指令也是類似的用法署尤,可以自行嘗試。具體的格式為:
    ansible $目標(biāo)host -a '$二級(jí)參數(shù)=$目標(biāo)文件或路徑 $待執(zhí)行指令'
[root@Printer ~]# ansible fangwei -a 'chdir=/etc/ansible ls -l'
EMRtest | CHANGED | rc=0 >>
總用量 28
-rw-r--r-- 1 root root 20277 12月 14 13:57 ansible.cfg
-rw-r--r-- 1 root root  1070 12月 26 11:26 hosts
drwxr-xr-x 2 root root  4096 12月 14 13:57 roles

2. Shell模塊(或者Raw模塊)

這個(gè)模塊的主要特點(diǎn)就是囊括了所有的command的功能和二級(jí)參數(shù)支持亚侠,并且支持管道曹体。

[root@Printer ~]# ansible fangwei -m shell -a 'ps -ef | grep crond | grep -v grep'
EMRtest | CHANGED | rc=0 >>
root      6030     1  0  2018 ?        00:00:13 /usr/sbin/crond -n

Snipeit | CHANGED | rc=0 >>
root      1042     1  0 2月12 ?       00:00:04 /usr/sbin/crond -n

3. File模塊

File模塊主要是對(duì)于文件的一些簡(jiǎn)單操作,主要是創(chuàng)建或者權(quán)限設(shè)定硝烂,已經(jīng)文件的存在判斷等箕别。

  • force:在兩種情況下強(qiáng)制創(chuàng)建軟鏈接。1滞谢、源文件不存在但之后會(huì)建立的情況串稀;2、目標(biāo)軟件已存在狮杨,需要先取消之前的軟鏈接母截,然后創(chuàng)建新的軟鏈接。選項(xiàng):yes|no
  • group:定義文件/目錄的屬組
  • mode:定義文件/目錄的權(quán)限
  • path:必選項(xiàng)橄教,定義文件/目錄的路徑
  • recurse:遞歸的設(shè)置文件的屬性清寇,只對(duì)目錄有效
  • src:要被鏈接到的路徑,只應(yīng)用于state=link的情況
  • dest:被鏈接到的路徑护蝶,只應(yīng)用于state=link的情況
  • state:
    directory:如果目錄不存在华烟,創(chuàng)建目錄
    file:即使文件不存在,也不會(huì)被創(chuàng)建
    link:創(chuàng)建軟鏈接持灰;hard:創(chuàng)建硬鏈接
    touch:如果文件不存在盔夜,則會(huì)創(chuàng)建一個(gè)新的文件,如果已存在堤魁,則更新其最后修改時(shí)間
    absent:刪除目錄/文件或者取消鏈接文件
[root@Printer ~]# ansible fangwei -m file -a 'path=/root/ninngenn.cfg state=touch'
Snipeit | CHANGED => {
    "changed": true,
    "dest": "/root/ninngenn.cfg",
    "gid": 0,
    "group": "root",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "state": "file",
    "uid": 0
}
EMRtest | CHANGED => {
    "changed": true,
    "dest": "/root/ninngenn.cfg",
    "gid": 0,
    "group": "root",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "state": "file",
    "uid": 0
}

4. Copy模塊

Copy模塊主要用于復(fù)制文件到遠(yuǎn)程主機(jī)喂链。具體參數(shù)如下:

  • backup:在覆蓋之前將源文件備份,備份文件包含時(shí)間信息妥泉,選項(xiàng):yes|no
  • content:用于替代”src”椭微,可以直接設(shè)定文件的值
  • directory_node:遞歸的設(shè)定目錄權(quán)限,默認(rèn)為系統(tǒng)默認(rèn)權(quán)限
  • force:如果目標(biāo)主機(jī)包含該文件涛漂,但內(nèi)容不同赏表,如果設(shè)置為yes检诗,則強(qiáng)制覆蓋匈仗;如果設(shè)置為no,則只有當(dāng)目標(biāo)主機(jī)的目標(biāo)位置不存在該文件時(shí)逢慌,才復(fù)制悠轩。默認(rèn)為yes
  • others:所有file模塊里的選項(xiàng)都可以在這里使用
  • src:要復(fù)制到遠(yuǎn)程主機(jī)的文件在本地的地址,可以是絕對(duì)路徑攻泼,也可以是相對(duì)路徑火架。如果路徑是一個(gè)目錄鉴象,它將遞歸復(fù)制。在這種情況下何鸡,如果路徑使用“/”來結(jié)尾纺弊,則只復(fù)制目錄里的內(nèi)容,如果沒有使用“/”來結(jié)尾骡男,則包含目錄在內(nèi)的整個(gè)內(nèi)容全部復(fù)制淆游,類似于rsync
[root@Printer ~]# ansible fangwei -m copy -a 'src=/root/ninngenn.cfg dest=/root/ninngenn.cfg force=yes'
EMRtest | CHANGED => {
    "changed": true,
    "checksum": "458bd6a39e16bc1e00255b66c67b5cb92180166b",
    "dest": "/root/ninngenn.cfg",
    "gid": 0,
    "group": "root",
    "md5sum": "cf35206b8cca3e51082bb32ce278ed8d",
    "mode": "0644",
    "owner": "root",
    "size": 56,
    "src": "/root/.ansible/tmp/ansible-tmp-1551949966.41-24885251361529/source",
    "state": "file",
    "uid": 0
}
Snipeit | CHANGED => {
    "changed": true,
    "checksum": "458bd6a39e16bc1e00255b66c67b5cb92180166b",
    "dest": "/root/ninngenn.cfg",
    "gid": 0,
    "group": "root",
    "md5sum": "cf35206b8cca3e51082bb32ce278ed8d",
    "mode": "0644",
    "owner": "root",
    "size": 56,
    "src": "/root/.ansible/tmp/ansible-tmp-1551949966.4-190980703709511/source",
    "state": "file",
    "uid": 0
}

5. Service模塊

用于受管機(jī)服務(wù)的配置與管理,類似于systemd隔盛,常用選項(xiàng):

  • arguments:為命令提供一些附加參數(shù)
  • enabled:是否開機(jī)啟動(dòng)犹菱,選項(xiàng) yes|no
  • name:必選項(xiàng),服務(wù)名稱
  • pattern:定義一個(gè)模式吮炕,如果通過status指令來查看服務(wù)狀態(tài)時(shí)腊脱,沒有響應(yīng),它會(huì)通過ps命令在進(jìn)程中根據(jù)該模式進(jìn)行查找龙亲,如果匹配到陕凹,則認(rèn)為該服務(wù)依然運(yùn)行
  • runlevel:運(yùn)行級(jí)別
  • sleep:如果執(zhí)行了restarted,則在stop和start之間等待幾秒鐘
  • state:對(duì)當(dāng)前服務(wù)執(zhí)行啟動(dòng)/停止/重啟/重新加載等操作(started/stopped/restarted/reloaded)
[root@Printer ~]# ansible fangwei -m service -a 'name=sshd state=restarted enabled=yes'
Snipeit | CHANGED => {
    "changed": true,
    "enabled": true,
    "name": "sshd",
    "state": "started"
}
EMRtest | CHANGED => {
    "changed": true,
    "enabled": true,
    "name": "sshd",
    "state": "started"
}

6. Cron模塊

類似于Linux的Crontab功能鳄炉,用來控制服務(wù)或者進(jìn)程的定時(shí)執(zhí)行功能捆姜。常用參數(shù):

  • backup:對(duì)遠(yuǎn)程主機(jī)上的原計(jì)劃任務(wù)內(nèi)容修改之前做備份
  • cron_file:如果指定該選項(xiàng),則用該文件替換遠(yuǎn)程主機(jī)上cron.d目錄下的用戶的任務(wù)計(jì)劃
  • day:日(1-31,,/2,…)
  • hour:小時(shí)(0-23,,/2,…)
  • minute:分鐘(0-59,,/2,…)
  • month:月(0-12,*,…)
  • weekday:周(0-7,*,…)
  • job:要執(zhí)行的任務(wù)迎膜,依賴于state=present
  • name:該任務(wù)的描述
  • special_time:指定什么時(shí)候執(zhí)行泥技,參數(shù):reboot,yearly,annually,monthly,weekly,daily,hourly
  • state:確認(rèn)該任務(wù)計(jì)劃是創(chuàng)建還是刪除
  • user:以哪個(gè)用戶身份執(zhí)行
[root@Printer ~]# ansible fangwei -m cron -a 'name="check home directory" minute=*/10 job="ls -lht /home"'
Snipeit | CHANGED => {
    "changed": true,
    "envs": [],
    "jobs": [
        "check home directory"
    ]
}
EMRtest | CHANGED => {
    "changed": true,
    "envs": [],
    "jobs": [
        "check home directory"
    ]
}

7. FileSystem

FileSystem模塊用于配置受管機(jī)的文件系統(tǒng)。改模塊涉及高位操作磕仅,請(qǐng)務(wù)必小心珊豹,常用參數(shù)為:

  • dev:目標(biāo)塊設(shè)備
  • force:在一個(gè)已有文件系統(tǒng)的設(shè)備上強(qiáng)制創(chuàng)建
  • fstype:文件系統(tǒng)的類型
  • opts:傳遞給mkfs命令的選項(xiàng)
[root@Printer ~]# ansible test_hosts -m filesystem -a 'dev=/dev/sdb fstype=ext4'
172.26.0.84 | SUCCESS => {
    "changed": true
}

8. Mount模塊

Mount模塊用于配置受管機(jī)的磁盤掛載,高危模塊榕订,請(qǐng)慎重使用店茶,下面為常用參數(shù):

  • dump:存儲(chǔ)(見fstab文件第5列)。注意劫恒,如果設(shè)置為null并且狀態(tài)設(shè)置為present贩幻,它將停止工作,并且將在后續(xù)運(yùn)行中進(jìn)行重復(fù)條目两嘴。對(duì)Solaris系統(tǒng)沒有影響丛楚。
  • fstype:必選項(xiàng),文件系統(tǒng)類型憔辫,要求狀態(tài)是present或mounted
  • name:必選項(xiàng)趣些,掛載點(diǎn)
  • opts:傳遞給mount命令的參數(shù)
  • src:必選項(xiàng),要掛載的設(shè)備路徑贰您。要求狀態(tài)是present或mounted
  • state:必選項(xiàng)坏平。選項(xiàng)如下:
    present:只處理fstab中的配置
    absent:刪除掛載點(diǎn)
    mounted:自動(dòng)創(chuàng)建掛載點(diǎn)并掛載
    unmounted:卸載
[root@Ansible ~]# ansible test_hosts -m mount -a 'name=/mnt src=/dev/sdb1 fstype=ext4 state=mounted opts=rw'
172.26.0.84 | SUCCESS => {
    "changed": true, 
    "dump": "0", 
    "fstab": "/etc/fstab", 
    "fstype": "ext4", 
    "name": "/mnt", 
    "opts": "rw", 
    "passno": "0", 
    "src": "/dev/sdb1"

9. Yum模塊

如果熟悉CentOS的朋友應(yīng)該就會(huì)知道拢操,這是使用yum包管理器來管理軟件包的模塊,參數(shù)如下:

  • conf_file:yum的配置文件
  • disable_gpg_check:關(guān)閉gpg_check
  • disablerepo:不啟用某個(gè)源
  • enablerepo:?jiǎn)⒂媚硞€(gè)源
  • list:查看yum列表
  • name:要進(jìn)行操作的軟件包名字舶替,也可以傳遞一個(gè)url或者一個(gè)本地的rpm包的路徑
  • state:狀態(tài)(present/installed/absent/removed/latest)
[root@Printer ~]# ansible fangwei -m yum -a 'name=sl state=latest'
Snipeit | CHANGED => {
    "ansible_facts": {
        "pkg_mgr": "yum"
    },
    "changed": true,
    "msg": "",
    "obsoletes": {
        "grub2": {
            "dist": "x86_64",
            "repo": "@anaconda",
            "version": "1:2.02-0.65.el7.centos.2"
        },
        "grub2-tools": {
            "dist": "x86_64",
            "repo": "@anaconda",
            "version": "1:2.02-0.65.el7.centos.2"
        }
    },
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * ius: dfw.mirror.rackspace.com\n * webtatic: uk.repo.webtatic.com\nResolving Dependencies\n--> Running transaction check\n---> Package sl.x86_64 0:5.02-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package       Arch              Version                  Repository       Size\n================================================================================\nInstalling:\n sl            x86_64            5.02-1.el7               epel             14 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 14 k\nInstalled size: 17 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : sl-5.02-1.el7.x86_64                                         1/1 \n  Verifying  : sl-5.02-1.el7.x86_64                                         1/1 \n\nInstalled:\n  sl.x86_64 0:5.02-1.el7                                                        \n\nComplete!\n"
    ]
}
EMRtest | CHANGED => {
    "ansible_facts": {
        "pkg_mgr": "yum"
    },
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\nResolving Dependencies\n--> Running transaction check\n---> Package sl.x86_64 0:5.02-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package       Arch              Version                  Repository       Size\n================================================================================\nInstalling:\n sl            x86_64            5.02-1.el7               epel             14 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 14 k\nInstalled size: 17 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : sl-5.02-1.el7.x86_64                                         1/1 \n  Verifying  : sl-5.02-1.el7.x86_64                                         1/1 \n\nInstalled:\n  sl.x86_64 0:5.02-1.el7                                                        \n\nComplete!\n"
    ]
}

10. User模塊

User模塊顧名思義就是用于用戶參數(shù)設(shè)置的模塊令境。常用參數(shù):

  • home:指定用戶家目錄
  • group:設(shè)置用戶主組
  • groups:設(shè)置用戶的附屬組
  • uid:設(shè)置用戶的UID
  • password:設(shè)置用戶的密碼,密碼必須為加密后的值
  • name:創(chuàng)建用戶的用戶名
  • createhhome:選項(xiàng)yes|no顾瞪,值為yes時(shí)才創(chuàng)建用戶家目錄
  • system:選項(xiàng)yes|no展父,默認(rèn)為no,值為yes時(shí)創(chuàng)建的用戶為系統(tǒng)用戶
  • remove:當(dāng)state=absent時(shí)玲昧,remove=yes則表示連同家目錄一起刪除栖茉,等價(jià)于userdel -r
  • state:選項(xiàng)present|absent,創(chuàng)建用戶或刪除用戶
  • shell:設(shè)置用戶的shell環(huán)境
[root@Ansible ~]# ansible test_hosts -m user -a 'name=user1 uid=1001 group=yfshare createhome=yes home=/home/user1 password="P@ssw0rd" shell=/bin/bash state=present'
172.26.0.84 | SUCCESS => {
    "changed": true, 
    "comment": "", 
    "createhome": true, 
    "group": 1000, 
    "home": "/home/user1", 
    "name": "user1", 
    "password": "NOT_LOGGING_PASSWORD", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 1001
}

11. Group模塊

顧名思義用于配置Group信息的模塊孵延,參數(shù)如下:

  • gid:設(shè)置組的GID
  • name:組名
  • state:選項(xiàng)為present|absent吕漂,創(chuàng)建組或刪除組
  • system:選項(xiàng)為yes|no,值為yes尘应,則創(chuàng)建系統(tǒng)組
    用法與User模塊雷同惶凝,不再舉例。

12. get_url模塊

主要用于從http犬钢、ftp苍鲜、https服務(wù)器上下載文件(類似于wget),主要參數(shù)如下:

  • checksum:文件下載完成后進(jìn)行校驗(yàn)
  • timeout:請(qǐng)求超時(shí)時(shí)間玷犹,默認(rèn)為10s
  • url:文件下載地址
  • url_username:用戶名混滔,基于HTTP的基本認(rèn)證
  • url_password:密碼
  • -use_proxy:選項(xiàng)yes|no,默認(rèn)為yes歹颓,即使用代理
  • dest:下載文件存儲(chǔ)的絕對(duì)路徑
[root@Printer ~]# ansible fangwei -m get_url -a 'dest=/root url=http://172.26.0.84/file/drivers/Canon/mac-10-14-canon.dmg'
EMRtest | CHANGED => {
    "changed": true,
    "checksum_dest": null,
    "checksum_src": "eff3bd83c5966373f04d8c4576cbbe610ba0d638",
    "dest": "/root/mac-10-14-canon.dmg",
    "gid": 0,
    "group": "root",
    "md5sum": "59b6a0a3dcb9dd3e6e46d1e8374d9c43",
    "mode": "0644",
    "msg": "OK (23166785 bytes)",
    "owner": "root",
    "size": 23166785,
    "src": "/root/.ansible/tmp/ansible-tmp-1551951882.53-86480089864174/tmp_7guIp",
    "state": "file",
    "status_code": 200,
    "uid": 0,
    "url": "http://172.26.0.84/file/drivers/Canon/mac-10-14-canon.dmg"
}
Snipeit | CHANGED => {
    "changed": true,
    "checksum_dest": null,
    "checksum_src": "eff3bd83c5966373f04d8c4576cbbe610ba0d638",
    "dest": "/root/mac-10-14-canon.dmg",
    "gid": 0,
    "group": "root",
    "md5sum": "59b6a0a3dcb9dd3e6e46d1e8374d9c43",
    "mode": "0644",
    "msg": "OK (23166785 bytes)",
    "owner": "root",
    "size": 23166785,
    "src": "/root/.ansible/tmp/ansible-tmp-1551951882.52-38856232211770/tmpPLN4Wf",
    "state": "file",
    "status_code": 200,
    "uid": 0,
    "url": "http://172.26.0.84/file/drivers/Canon/mac-10-14-canon.dmg"

13. Setup模塊

playbooks自動(dòng)收集遠(yuǎn)程主機(jī)上可用變量坯屿,這些變量用于playbooks配置。

[root@Ansible ~]# ansible test_hosts -m setup
172.26.0.84 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "172.26.0.84"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80:****:****:fe5c:dc6d"
        ], 
        "ansible_architecture": "x86_64",

14. Script模塊

這個(gè)模塊用于在受管機(jī)上執(zhí)行sh腳本巍扛。

[root@Ansible ~]# ansible test_hosts -m script -a '/tmp/script.sh'
Enter passphrase for key '/root/.ssh/id_rsa': 
172.26.0.84 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 172.26.0.84 closed.\r\n", 
    "stdout": "", 
    "stdout_lines": []

三领跛、神器ansible-playbook的使用

1、Yaml語言

Yaml語言是一種配置語言撤奸,主要用于配置文件的設(shè)定和數(shù)據(jù)塊的儲(chǔ)存吠昭,作為一種xml語言的進(jìn)化形態(tài)出現(xiàn)。起主要的優(yōu)勢(shì)在于:

  • YAML的可讀性好胧瓜。
  • YAML和腳本語言的交互性好矢棚。
  • YAML使用實(shí)現(xiàn)語言的數(shù)據(jù)類型。
  • YAML有一個(gè)一致的信息模型贷痪。
  • YAML易于實(shí)現(xiàn)幻妓。

上面5條也就是XML不足的地方。同時(shí)劫拢,YAML也有XML的下列優(yōu)點(diǎn):

  • YAML可以基于流來處理肉津;
  • YAML表達(dá)能力強(qiáng),擴(kuò)展性好舱沧。
    總之妹沙,YAML試圖用一種比XML更敏捷的方式,來完成XML所完成的任務(wù)熟吏。

更多的內(nèi)容及規(guī)范參見yaml官網(wǎng)距糖。
語法結(jié)構(gòu)通過空格來展示岭皂。Sequence里的項(xiàng)用"-"來代表挥萌,Map里的鍵值對(duì)用":"分隔。
這幾乎就是所有的語法了机断。以下為一個(gè)標(biāo)準(zhǔn)的ansible-playbook的yaml配置文件:

---
- hosts: rotest2
  roles:
    - sshd
    - snmp
    - hostname
    - vim
    - parted
    - authorized_keys

2帽氓、playbook模塊

<b>roles:角色</b>(主模塊趣斤,和主yaml文件、ansible配置文件黎休、host文件同在playbook根目錄浓领,同時(shí)在roles文件夾下則是各種自定義的role。在role文件夾下才包括了后續(xù)的其他次級(jí)模塊)

root@Ansible ~/ansible-test $ ls
ansible.cfg  hosts  roles  main.yml
root@Ansible ~/ansible-test/roles $ ls
audit  authorized_keys  hostname  megacli  nrpe  parted  snmp  sshd  telegraf  vim

在role文件夾下势腮,會(huì)調(diào)用下面的各個(gè)子模塊联贩,但是除了task以外都不是必須,而是可選項(xiàng)捎拯。例如這個(gè)telegraf的部署role泪幌,下面只包含了files、handlers署照、tasks三個(gè)子模塊座菠。在子模塊中我們可以調(diào)用任何ansible支持的模塊功能,尤其是<b>上一章我們介紹的那些重要功能模塊</b>藤树。

root@Ansible ~/ansible-test/roles/telegraf $ ls
files  handlers  tasks
  • tasks:任務(wù)
  • variables:變量
  • templates:模板
  • handlers:處理器
  • files:需要的文件

3浴滴、如何使用playbook

ansible-playbook的使用基本和ansible類似,哪怕調(diào)用--help指令查看岁钓,也是一樣的參數(shù)結(jié)果升略。一般來說由于playbook調(diào)用的模塊較多,配置的內(nèi)容較豐富屡限,后續(xù)的部署影響較大品嚣,所以在使用的時(shí)候請(qǐng)務(wù)必先調(diào)用-D -C兩個(gè)參數(shù)進(jìn)行結(jié)果測(cè)試,排查報(bào)錯(cuò)钧大,確認(rèn)一切無誤后再進(jìn)行推送和部署翰撑。例如:

~$ ansible-playbook -i hosts ro.yml -t authorized_keys -DC
~$ ansible-playbook -i hosts ro.yml -t authorized_keys

4、使用案例

這里我們就用一個(gè)案例來對(duì)ansible-playbook進(jìn)行詳細(xì)的解釋啊央。這個(gè)案例比較完整眶诈,有助于我們方便理解涨醋。
這個(gè)案例的文件架構(gòu)為:

root@Ansible ~/ansible-test $ ls
ansible.cfg  hosts  roles  main.yml

具體的main.yml文件為:

root@Ansible ~/ansible-test $ cat main.yml
---
- hosts: test
  roles:
    - sshd
    - snmp
    - hostname
    - vim
    - parted
    - authorized_keys
    - telegraf
    - audit

我們進(jìn)入roles文件夾,查看具體的role內(nèi)容逝撬。

root@Ansible ~/ansible-test/roles $ ls
audit  authorized_keys  hostname  megacli  nrpe  parted  snmp  sshd  telegraf  vim

<b>如果我們需要在受管機(jī)上安裝某個(gè)軟件浴骂,以telegraf這個(gè)role為例:</b>

root@Ansible ~/ansible-test/roles/telegraf $ tree
.
├── files
│   ├── telegraf-1.8.0-1.x86_64.rpm     #安裝包rpm文件
│   ├── telegraf.conf                   #自定義的配置文件
│   └── telegraf.conf.bak               #原始默認(rèn)配置文件(非必須)
├── handlers
│   └── main.yml                        #處理器配置
└── tasks
    └── main.yml                        #role的任務(wù)主配置

3 directories, 5 files
-------------------------------------
root@Ansible ~/ansible-test/roles/telegraf $ cat ./tasks/main.yml
---

- name: install telegraf                #配置npm的下載地址
  yum: name=https://dl.influxdata.com/telegraf/releases/telegraf-1.8.0-1.x86_64.rpm state=present
  tags: telegraf

- name: copy telegraf config            #配置文件的復(fù)制
  copy: src=telegraf.conf dest=/etc/telegraf/
  notify: reload telegraf
  tags: telegraf

- name: ensure service telegraf is started and enabled
  service: name=telegraf state=started enabled=yes
  tags: telegraf                        #確保在受管機(jī)上開機(jī)啟動(dòng)telegraf服務(wù)
-------------------------------------
root@Ansible ~/ansible-test/roles/telegraf $ cat ./handlers/main.yml
---

- name: reload telegraf                 #異常狀況重新加載
  service: name=telegraf state=reloaded

而對(duì)于部分復(fù)雜的配置需求,我們甚至可以使用shell腳本來對(duì)受管機(jī)進(jìn)行相關(guān)的處理宪潮,例如磁盤掛載或者分配等系統(tǒng)級(jí)別的任務(wù)溯警。

root@Ansible ~/ansible-test/roles/parted $ ls
files  tasks
-------------------------------------
root@Ansible ~/ansible-test/roles/parted $ tree
.
├── files
│   ├── parted.sh                   #shell腳本文件
│   └── parted.sh.bak
└── tasks
    └── main.yml                    #主task配置

2 directories, 3 files
-------------------------------------
root@Ansible ~/ansible-test/roles/parted $ cat files/parted.sh
#!/bin/bash

OPTS="noatime,nobarrier,errors=remount-ro,nofail"

x=b
#for x in 
#do
    echo "mkpart /dev/vd${x}"
    parted /dev/vd${x} -s mklabel gpt
    parted /dev/vd${x} -s mkpart primary 1 100%
    echo ">>> mkfs.ext4 /dev/vd${x}1"
    mkfs.ext4 -q /dev/vd${x}1
    if [ $? -eq 0 ]; then
        UUID=$(blkid /dev/vd${x}1 | sed -e 's/.*\(UUID=.*\) TYPE.*/\1/')
        echo -e "${UUID}\t\t/data\t\text4\t\t${OPTS}\t\t0 0" >> /etc/fstab
    fi
    seq=$(($seq+1))
#done                               #通過shell腳本進(jìn)行磁盤的分區(qū)與掛載
-------------------------------------
root@Ansible ~/ansible-test/roles/parted $ cat tasks/main.yml
---
 #parted
- name: copy parted config
  copy: src={{ item }} dest=~ owner=root group=root mode="0777"
  with_items:                       #復(fù)制腳本到受管機(jī)并配置chown權(quán)限
    - parted.sh                     #執(zhí)行shell腳本
  tags: parted

關(guān)于playbook的其他功能大家可以通過實(shí)踐和閱讀其他案例來學(xué)習(xí)喳挑,ansible非常靈活,請(qǐng)務(wù)必善于使用氧敢。

附錄、參考文獻(xiàn)

  1. 戴爾yaml介紹
  2. Ansible Documents
  3. Ansible中文權(quán)威指南
  4. Ansible模塊Module
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末孙乖,一起剝皮案震驚了整個(gè)濱河市浙炼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖蔬顾,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窄刘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡舷胜,警方通過查閱死者的電腦和手機(jī)翻伺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來埋凯,“玉大人掠廓,你說我怎么就攤上這事∷δ眨” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵切端,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我顷啼,道長(zhǎng)踏枣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任线梗,我火速辦了婚禮椰于,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仪搔。我一直安慰自己瘾婿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著偏陪,像睡著了一般抢呆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笛谦,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天抱虐,我揣著相機(jī)與錄音,去河邊找鬼饥脑。 笑死恳邀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的灶轰。 我是一名探鬼主播谣沸,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼笋颤!你這毒婦竟也來了乳附?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤伴澄,失蹤者是張志新(化名)和其女友劉穎赋除,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體非凌,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡举农,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了清焕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片并蝗。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖秸妥,靈堂內(nèi)的尸體忽然破棺而出滚停,到底是詐尸還是另有隱情,我是刑警寧澤粥惧,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布键畴,位于F島的核電站,受9級(jí)特大地震影響突雪,放射性物質(zhì)發(fā)生泄漏起惕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一咏删、第九天 我趴在偏房一處隱蔽的房頂上張望惹想。 院中可真熱鬧,春花似錦督函、人聲如沸嘀粱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锋叨。三九已至垄分,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娃磺,已是汗流浹背薄湿。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留偷卧,地道東北人豺瘤。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像涯冠,于是被迫代替她去往敵國和親炉奴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逼庞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容