Ansible系列(二):選項和經常使用模塊

Ansible系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.htmlhtml


1.1 ansible命令解釋

經過ansible命令執行的任務稱爲ad-hoc命令(任務),其實它是相對playbook而言的。一般,命令行用來實現ansible的批量管理功能,playbook用來實現批量自動化功能。node

【如下爲普通選項:】
-a MODULE_ARGS
--args=MODULE_ARGS
傳遞參數給模塊mysql

--ask-vault-pass
詢問vault的密碼nginx

-B SECONDS
--background=SECONDS
異步後臺方式執行任務,並在指定的秒數後超時,超時會殺掉任務的進程。默認是同步,即保持長鏈接,它會等待全部執行完畢(即阻塞模式)。但有時候是不必這樣的,好比某些命令的執行時間比ssh的超時時間還長。若是不指定超時秒數,將以同步方式運行任務git

-P POLL_INTERVAL
--poll=POLL_INTERVAL
異步模式下輪訓任務的時間間隔,默認10秒github

-C
--check
不對遠程主機作出一些改變,而是預測某些可能發生的改變算法

-D
--diff
當文件或模板發生了改變,顯示出不一樣之處,和-C選項配合使用更佳sql

-e EXTRA_VARS
--extra-vars=EXTRA_VARS
配置額外的配置變量(key=value或者YAML/JSON格式)shell

-f FORKS
--forks=FORKS
指定並行處理的進程數量,默認爲5個windows

-h
--help
顯示幫助信息

-i INVENTORY
--inventory-file=INVENTORY
指定inventory文件,多個文件使用逗號分隔。默認爲/etc/ansible/hosts

-l SUBSET
--limit=SUBSET
使用額外的匹配模式來篩選目標主機列表。此處的匹配模式是在已有匹配模式下進行的,因此是更嚴格的篩選。例如指定了主機組的狀況下,使用-l選項從中只選一臺主機進行控制

--list-hosts
不會執行任何操做,而是列出匹配到的主機列表

-m MODULE_NAME
--module-name=MODULE_NAME
指定要執行的模塊名,默認的模塊爲"command"

-M MODULE_PATH
--module-path=MODULE_PATH
指定模塊目錄,默認未設置

--new-vault-password-file=NEW_VAULT_PASSWORD_FILE
new vault password file for rekey

-o
--one-line
簡化輸出(一行輸出模式)

--output=OUTPUT_FILE
output file name for encrypt or decrypt; use - for stdout

--syntax-check
檢查playbook的語法,不會執行

-t TREE
--tree=TREE
記錄輸出到此目錄中(測試時以每一個host名如IP地址爲文件名記錄,結果記錄到對應的文件中)。
此選項在ansible巨慢的時候(如瞬間應該返回的命令還須要10多秒才完成)有奇用,或者將ansible的結果重定向到某個文件中也能解決,爲何如此,我也不明白(表面看來和輸出方式有關係),屢次親測有效。

--vault-password-file=VAULT_PASSWORD_FILE
指定vault密碼文件

-v
--verbose
輸出詳細信息,-vvv和-vvvv會輸出更多新

--version
顯示ansible的版本

【如下是鏈接選項,用於控制誰以及如何鏈接主機:】
-k
--ask-pass
詢問鏈接時的密碼

--private-key=KEY_FILE
--key-file=KEY_FILE
使用文件來認證SSH鏈接過程。

-u REMOTE_USER
--user=REMOTE_USER
使用指定的用戶名進行鏈接

-c CONNECTION
--connection=CONNECTION
鏈接類型,默認爲ssh。paramiko (SSH), ssh, winrm and local. local is mostly useful for crontab or kickstarts.

-T TIMEOUT, --timeout=TIMEOUT
鏈接的超時時間,單位爲秒,默認爲10

--ssh-common-args=SSH_COMMON_ARGS
指定傳遞給sftp/scp/ssh等工具的通用額外參數

--sftp-extra-args=SFTP_EXTRA_ARGS
指定只傳遞給sftp的額外參數,如-f

--scp-extra-args=SCP_EXTRA_ARGS
指定只傳遞給scp的額外參數,如-l

--ssh-extra-args=SSH_EXTRA_ARGS
指定只傳遞給ssh的額外參數,如-R

【如下是權限控制選項:控制在目標主機上以什麼身份和權限運行任務:】
-s
--sudo
爲運行ansible命令的用戶提高權限爲sudo_user的權限,此命令已廢棄,使用become代替

-U SUDO_USER
--sudo-user=SUDO_USER
指望的sudo_user,默認爲root,已廢棄,使用become替代

-S
--su
使用su的方式執行操做,已廢棄,使用become替代

-R SU_USER
--su-user=SU_USER
使用此user的su執行操做,默認爲root,已廢棄,使用become替代

-b
--become
使用become的方式升級權限

--become-method=BECOME_METHOD
指定提高權限的方式,可選如下幾種:sudo/su/pbrun/pfexec/doas/dzdo/ksu/runas值

--become-user=BECOME_USER
要提高爲哪一個user的權限,默認爲root

--ask-sudo-pass
詢問sudo密碼,已廢棄,使用become替代

--ask-su-pass
詢問su的密碼,已廢棄,使用become替代

-K
--ask-become-pass
詢問become提高權限時的密碼

1.2 經常使用模塊

能夠從ansible-doc -l | grep來找出想要的模塊。再使用ansible-doc -s module_name來查看此模塊的用法。官方模塊列表和說明:https://docs.ansible.com/ansible/latest/modules_by_category.html

關於模塊的使用方法,須要注意的是"state"。不少模塊都會有該選項,且其值幾乎都包含有"present"和"absent",表示確定和否認的意思。

ansible絕大多數模塊都自然具備冪等特性,只有極少數模塊如shell和command模塊不具有冪等性。所謂的冪等性是指屢次執行同一個操做不會影響最終結果。例如,ansible的yum模塊安裝rpm包時,若是待安裝的包已經安裝過了,則再次或屢次執行安裝操做都不會真正的執行下去。再例如,copy模塊拷貝文件時,若是目標主機上已經有了徹底相同的文件,則屢次執行copy模塊不會真正的拷貝。ansible具備冪等性的模塊在執行時,都會自動判斷是否要執行。

1.2.1 shell和command

默認ansible使用的模塊是command,便可以執行一些shell命令。shell和command的用法基本同樣,實際上shell模塊執行命令的方式是在遠程使用/bin/sh來執行的,如/bin/sh ping。

command不能解析變量(如$HOME)和某些操做符("<", ">", "|", ";"以及"&"),因此明確要使用這些不可解析的操做符時,使用shell模塊來代替command。

ansible-doc -s shell
- name: Execute commands in nodes.
  action: shell
      chdir       # 在執行命令前,先cd到指定的目錄下
      creates     # 用於判斷命令是否要執行。若是指定的文件(可使用通配符)存在,則不執行。
      removes     # 用於判斷命令是否要執行。若是指定的文件(可使用通配符)不存在,則不執行。

在ansible中使用shell或command模塊必定要注意,它們默認不知足冪等性,不少操做會重複執行,但有些操做是不容許重複執行的。例如mysql的初始化命令mysql_install_db,它只能在第一次配置的過程當中初始化一次,其餘任什麼時候候如非須要則不容許執行。這時候要實現冪等性,能夠經過模塊的creates和removes選項進行判斷,但不管如何,在執行這兩個模塊的時候都須要考慮要執行的命令是否應該實現冪等性。

1.2.2 複製模塊copy

ansible-doc -l | grep copy
copy                   Copies files to remote locations.
ec2_ami_copy           copies AMI between AWS regions, return new image id 
netapp_e_volume_copy   Create volume copy pairs nxos_file_copy Copy a file to a remote NXOS device over SCP. unarchive Unpacks an archive after(optionally) copying it from the local machine. vsphere_copy Copy a file to a vCenter datastore win_copy Copies files to remote locations on windows hosts. win_robocopy Synchronizes the contents of two directories using Robocopy.

使用方法:

ansible-doc -s copy
- name: Copies files to remote locations.
action: copy
    backup=[yes|no]   # 拷貝的同時也建立一個包含時間戳信息的備份文件,默認爲no
    dest=             # 目標路徑,只能是絕對路徑,若是拷貝的文件是目錄,則目標路徑必須也是目錄
    content           # 直接以content給定的字符串或變量值做爲文件內容保存到遠程主機上,它會替代src選項
    directory_mode    # 當對目錄作遞歸拷貝時,設置了directory_mode將會使得只拷貝新建文件,
                      # 舊文件不會被拷貝。默認未設置
    follow=[yes|no]   # 是否追蹤到連接的源文件。
    force=[yes|no]    # 設置爲yes(默認)時,將覆蓋遠程同名文件。設置爲no時,忽略同名文件的拷貝。
    group             # 設置遠程文件的所屬組
    owner             # 設置遠程文件的全部者
    mode=             # 設置遠程文件的權限。使用數值表示時不能省略第一位,如0644。
                      # 也可使用'u+rwx'或'u=rw,g=r,o=r'等方式設置。
    src=              # 拷貝本地源文件到遠程,可以使用絕對路徑或相對路徑。若是路徑是目錄,且目錄後加了
                      # 斜槓"/",則只會拷貝目錄中的內容到遠程,若是目錄後不加斜槓,則拷貝目錄自己和
                      # 目錄內的內容到遠程。

默認狀況下,ansible copy會檢查文件md5查看是否須要拷貝,相同則不會拷貝,不然會拷貝。若是設置force=yes,則當文件md5不一樣時(即文件內容不一樣)才覆蓋拷貝,設置force=no時,則只拷貝對方沒有的文件。

ansible centos -m copy -a "src=/tmp/copy.txt dest=/tmp mode=0770 owner=sshd group=sshd backup=yes" -o -f 6

ll /tmp
-rwxrwx--- 1 sshd sshd   24 May 28 16:45 copy.txt
-rwxrwx--- 1 root root   22 May 28 16:39 copy.txt.10915.2017-05-28@16:45:14~  #這是備份文件

若是拷貝的是目錄,則目標路徑必須是目錄路徑。若是使用"/"結尾,則拷貝的是目錄中的文件,若是不以斜槓結尾,則拷貝的是目錄加目錄中的文件。

mkdir /tmp/a
touch /tmp/a/{1..10}.txt
ansible centos -m copy -a "src=/tmp/a dest=/tmp" -o -f 6

1.2.3 template模塊

template模塊用法和copy模塊用法基本一致,它主要用於複製配置文件。

ansible-doc -s template
- name: Templates a file out to a remote server.
  action: template
      backup    # 拷貝的同時也建立一個包含時間戳信息的備份文件,默認爲no
      dest=     # 目標路徑
      force     # 設置爲yes (默認)時,將覆蓋遠程同名文件。設置爲no時,忽略同名文件的拷貝
      group     # 設置遠程文件的所屬組
      owner     # 設置遠程文件的全部者
      mode      # 設置遠程文件的權限。使用數值表示時不能省略第一位,如0644。
                # 也可使用'u+rwx' or 'u=rw,g=r,o=r'等方式設置
      src=      # ansible控制器上Jinja2格式的模板所在位置,能夠是相對或絕對路徑
      validate  # 在複製到目標主機後但放到目標位置以前,執行此選項指定的命令。
                # 通常用於檢查配置文件語法,語法正確則保存到目標位置。
                # 若是要引用目標文件名,則使用%s,下面的示例中的%s即表示目標機器上的/etc/nginx/nginx.conf。
ansible centos -m template -a "src=/tmp/nginx.conf.j2 dest=/etc/nginx/nginx.conf mode=0770 owner=root group=root backup=yes validate='nginx -t -c %s'" -o -f 6

雖然template模塊能夠按需求修改配置文件內容來複制模板到被控主機上,可是有一種狀況它是不能解決的:不一樣被控節點所需的配置文件差別很大,並不是修改幾個變量就能夠知足。例如在centos 6和centos 7上經過yum安裝的nginx,它們的配置文件內容相差很是大,且centos 6上的nginx的默認就有一個/etc/nginx/conf.d/default.conf。若是直接複製同一個模板的nginx配置文件到centos 6和centos 7上,極可能致使某一版本的nginx不能啓動。

這時就有必要在複製模板時挑選對應發行版的模板文件進行配對複製,例如要複製到centos 6上的源模板是nginx6.conf.j2,複製到centos 7上的源模板是nginx7.conf.j2。這種行爲能夠稱之爲"基於變量選擇文件或模板"

---
 - tasks: 
     - name: template file based var
       template: src=/templates/nginx{{ ansible_distribution_major_version }}.conf.j2 dest=/etc/nginx/nginx.conf validate="/usr/sbin/nginx -t -c %s"

還能夠在文件內容中指定jinja2的替代變量,在ansible執行時首先會根據變量內容進行渲染,渲染後再執行相關模塊。例如,此處的template模塊,複製一個基於發行版本號的yum源配置文件。如下是某個repo文件模板base.repo.j2的內容。

[epel] name=epel baseurl=http://mirrors.aliyun.com/epel/{{ ansible_distribution_major_version }}Server/x86_64/
enable=1 gpgcheck=0

再複製便可。

---
 - tasks: 
     - template: src=my.repo.j2 dest=/etc/yum.repos.d/my.repo

1.2.4 文件模塊file

管理文件、目錄的屬性,也能夠建立文件或目錄。

ansible-doc -s file
- name: Sets attributes of files
  action: file
      group       # file/directory的所屬組
      owner       # file/directory的全部者
      mode        # 修改權限,格式能夠是064四、'u+rwx'或'u=rw,g=r,o=r'等
      path=       # 指定待操做的文件,可以使用別名'dest'或'name'來替代path
      recurse     # (默認no)遞歸修改文件的屬性信息,要求state=directory
      src         # 建立連接時使用,指定連接的源文件
      state       # directory:若是目錄不存在則遞歸建立
                  # file:文件不存在時,不會被建立(默認值)
                  # touch:touch由path指定的文件,即建立一個新文件,或修改其mtime和atime
                  # link:修改或建立軟連接
                  # hard:修改或建立硬連接
                  # absent:目錄和其中的文件會被遞歸刪除,文件或連接將取消連接狀態

須要注意的是,file模塊能夠遞歸建立目錄,可是不能在不存在的目錄中建立文件,只能先建立目錄,再在此目錄中建立文件。

建立目錄,並遞歸修改目錄的屬性。

ansible 192.168.100.63 -m file -a 'path=/tmp/xyz state=directory owner=root group=root mode=0755 recurse=yes'

修改目錄中屬性。

ansible 192.168.100.63 -m file -a 'path=/tmp/xyz state=touch mode=0644'

建立或修改文件屬性。

ansible 192.168.100.63 -m file -a 'path=/tmp/xyz/a.txt state=touch mode=0644'

1.2.5 fetch拉取文件模塊

和copy工做方式相似,只不過是從遠程主機將文件拉取到本地端,存儲時使用主機名做爲目錄樹,且只能拉取文件不能拉取目錄。

ansible-doc -s fetch
- name: Fetches a file from remote nodes
  action: fetch
      dest=               # 本地存儲拉取文件的目錄。例如dest=/data,src=/etc/fstab,
                          # 遠程主機名host.exp.com,則保存的路徑爲/data/host.exp.com/etc/fstab。
      fail_on_missing     # 當設置爲yes時,若是拉取的源文件不存在,則此任務失敗。默認爲no。
      flat                # 改變拉取後的路徑存儲方式。若是設置爲yes,且當dest以"/"結尾時,將直接把源文件
                          # 的basename存儲在dest下。顯然,應該考慮多個主機拉取時的文件覆蓋狀況。
      src=                # 遠程主機上的源文件。只能是文件,不支持目錄。在將來的版本中可能會支持目錄遞歸拉取。
      validate_checksum   # fetch到文件後,檢查其md5和源文件是否相同。

 

# 存儲爲/tmp/localhost/etc/fstab
ansible localhost -m fetch -a "src=/etc/fstab dest=/tmp"

# 存儲爲/tmp/fstab
ansible localhost -m fetch -a "src=/etc/fstab dest=/tmp/ flat=yes"

# 存儲爲/tmp/fstab-localhost
ansible localhost -m fetch -a "src=/etc/fstab dest=/tmp/fstab-{{inventory_hostname}} flat=yes"

1.2.6 rsync模塊synchronize

synchronize模塊用於實現rsync的簡單版經常使用功能,它沒法實現完整版的rsync,畢竟rsync功能太多太細緻。若是要使用rsync,仍是應該使用command或shell模塊來調用rsync命令。

完整的rsync功能見rsync命令中文手冊

ansible-doc -s synchronize
- name: A wrapper around rsync to make common tasks in your playbooks quick and easy.
  action: synchronize
      src=           # 指定待傳輸的源文件。能夠是相對路徑,也能夠是絕對路徑。
      dest=          # 目標路徑。能夠是絕對路徑,也能夠是相對路徑。
      mode           # 指定推(push)仍是拉(pull)的傳輸模式。
                     # push時,本地爲sender端,pull時,遠程爲sender端。默認爲push。
      archive        # 等價於rsync的"-a"選項,即便用歸檔模式。它等價於rsync的"-rtopgDl"選項。值爲yes/no。
      times          # 保留mtime屬性。
      group          # 保留所屬組屬性。
      owner          # 保留全部者屬性。
      links          # 拷貝連接文件自身。
      perms          # 保留權限屬性。
      recursive      # 遞歸到目錄中的文件。
      compress       # 傳輸過程當中壓縮傳輸。應該老是開啓,除非遇到問題。即rsync的"-z"選項。
      copy_links     # 拷貝軟連接的文件名和其指向的文件的內容。即a指向b文件時,將在目標端生成a普通
                     # 文件,但此文件中的內容是b中的內容。
      dirs           # 非遞歸方式傳輸目錄。
      delete         # 目標端若是比源端文件多,則刪除這些多出來的文件,要求recursive=yes。
      checksum       # 等價於"-c"選項,將基於文件的checksum來判斷是否同步,而不是默認的quick check
                     # 算法,該算法基於文件大小和最近的mtime來判斷是否要同步。該選項會大幅下降效率,
                     # 應謹慎使用。注意,它沒法影響archive,即archive仍會啓用。
      existing_only  # receiver端沒有的文件不一樣步。但仍會傳輸,只是臨時文件重組後不重命名而已。
      partial        # 等價於"--partial"選項。默認rsync在傳輸中斷時會刪除傳輸了一半的文件,指定該選
                     # 項將保留這部分不完整的文件,使得下次傳輸時能夠直接從未完成的數據塊開始傳輸。
      dest_port      # ssh的鏈接端口。
      rsync_opts     # 指定額外的rsync選項。使用數組的方式傳遞這些選項。
      rsync_path     # 等價於"--rsync-path"選項,目的是啓動遠程rsync。
                     # 例如能夠指定[--rsync-path=rsync],甚至[--rsync-path=cd /tmp/c && rsync]。
                     # 當不指定rsync路徑時,默認爲/usr/bin/rysnc。
      rsync_timeout  # 指定rsync在多久時間內尚未數據傳輸就超時退出。
      verify_host    # 對目標主機進行ssh的host key驗證。

1.2.7 包管理模塊yum

ansible-doc -s yum
- name: Manages packages with the `yum' package manager
  action: yum
    disable_gpg_check   # 安裝包時禁止gpgcheck,僅在state=present或latest時生效。
    disablerepo         # 禁用指定的repoid,多個repoid使用逗號分隔。
    enablerepo          # 明確使用該repoid
    exclude             # 排除哪些包不安裝,僅在state=present或latest時生效。
    list                # 相似於yum list
    name=               # 指定安裝的包名,可帶上版本號.
    state               # 狀態。('present'、'installed','latest')用於安裝包,
                        # ('absent'、'removed')用於移除已安裝包。
    update_cache        # 強制更新yum的cache。

name須要配合state來使用,若是state指定爲present/installed/latest將安裝包,其中latest是安裝最新包,默認爲present。若是指定爲absent/removed則用於卸載包。

在ansible中,不少地方都會出現present和absent的狀態,它們通常都表示目標是否應該存在仍是不存在,也就是要進行的動做是建立和刪除。

列出和ansible相關的包。

ansible centos -m yum -a "list=ansible" -f 6

安裝包。

ansible centos -m yum -a "name=dos2unix state=installed" -o -f 6

安裝本地的包,且排除某些包不安裝。

ansible centos -m yum -a "name=/tmp/*.rpm exclude=*unix* state=present"

卸載包。

ansible centos -m yum -a "name=dos2unix state=removed" -o -f 6

1.2.8 配置yum源模塊yum_repository

用於配置yum源。能夠實現很是完整的yum倉庫配置。可是通常只需簡單的添加yum源便可。因此,如下是簡單版的用法和示例。

ansible-doc -s yum_repository
- name: Add or remove YUM repositories
  action: yum_repository
      baseurl      # 地址
      mirrorlist   # 設置mirrorlist地址
      description  # 描述信息
      enabled      # 是否啓用該倉庫,默認爲yes
      file         # 保存此倉庫的文件,不設置該項的話則默認以name選項中的名稱命名,將自動以".repo"後綴結尾。
      gpgcheck     # 是否要進行gpgcheck
      name=        # 倉庫的名稱,要保證名稱的惟一性
      reposdir     # 保存.repo文件的目錄,默認/etc/yum.repos.d/
      state        # repo文件的狀態,present/absent,默認present。

例如:

- name: Add repository
  yum_repository:
    name: aliyun_epel
    description: EPEL YUM repo
    baseurl: http://mirrors.aliyun.com/epel/7/$basearch/

- name: Add multiple repositories into a file
  yum_repository:
    name: epel
    description: EPEL YUM repo
    file: sohu_epel
    baseurl: http://mirrors.sohu.com/fedora-epel/7/$basearch/
    gpgcheck: no
ansible 192.168.100.63 -m yum_repository -a 'name=aliyun_epel description="epel repo" baseurl=http://mirrors.aliyun.com/epel/7/$basearch/ gpgcheck=no enabled=yes'

查看生成的repo文件。

[root@server2 ~]# ansible 192.168.100.63 -m shell -a "cat /etc/yum.repos.d/aliyun_epel.repo" 
192.168.100.63 | SUCCESS | rc=0 >>
[aliyun_epel]
baseurl = http://mirrors.aliyun.com/epel/7/$basearch/
enabled = 1
gpgcheck = 0
name = epel repo

1.2.9 服務管理模塊service

ansible-doc -s service
- name: Manage services.
  action: service
      enabled   # 設置服務爲開機自啓動,默認爲no
      name=     # 服務名
      state     # 'started'和'stoped'分別啓動和中止服務,它們是冪等操做,屢次啓動或中止服務的結果是同樣的,
                # 也就是說對於運行中的服務不會再執行啓動操做,同理中止也是同樣。'restarted'老是重啓服務,
                # 'reloaded'老是重讀配置文件,若是服務是未運行狀態,則'reloaded會啓動服務。
                # (state和enabled二者至少要給一個)

設置httpd開機自啓動。

ansible centos -m service -a 'name=httpd enabled=yes' -f 6 -o

啓動httpd服務。

ansible centos -m service -a 'name=httpd state=started' -f 6 -o

1.2.10 服務管理模塊systemd

管理systemd風格的服務。

ansible-doc -s systemd
- name: Manage services.
  action: systemd
      daemon_reload   # 在執行全部動做以前,先肯定是否要reload一次。值爲yes/no。
      enabled         # 是否設置開機自啓動。
      masked          # 是否將此unit作mask(隱藏、掩蓋)處理。mask後的unit將沒法啓動。
      name=           # 待操做服務名。能夠是name,也能夠是name.service。
      state           # 'started'/'stopped'具備冪等性。但restarted和reloaded老是會執行。

1.2.11 用戶管理模塊user

同理還有組管理模塊group,就很少作說明了。

ansible-doc -s user
- name: Manage user accounts
  action: user
      name=            # 要建立、修改、移除的用戶名。
      password         # 設置用戶密碼。此處只能使用加密密碼做爲值。
      system           # 設置爲yes表示建立一個系統用戶,只能用於建立,不能用於修改已有用戶爲系統用戶。
      state            # 建立用戶(present)仍是刪除用戶(absent)。默認爲present。
      createhome       # 建立家目錄,或者已有的用戶但家目錄不存在也會建立。設置爲no則不建立家目錄。
      home             # 指定要建立的家目錄路徑
      move_home        # 若是設置爲yes,則"home="則表示將家目錄移動到此選項指定的路徑下。
      uid              # 設置用戶的uid
      group            # 設置用戶的primary group
      groups           # 將用戶加入到輔助組列表中。若是設置"groups=",則會將此用戶從全部輔助組中移除。
      shell            # 設置用戶的shell。
      force            # 配合'state=absent'時,等價於'userdel --force',即強制刪除用戶、家目錄和郵件列表。
      remove           # 配合'state=absent'時,等價於'userdel --remove',即刪除家目錄和郵件列表。
      update_password  # user是冪等模塊,"always"將老是修改密碼。"on_create"將只在建立用戶時設置密碼。

建立系統用戶,並指定shell。

ansible centos -m user -a "name=longshuai system=yes shell=/sbin/nologin"

刪除用戶。

ansible centos -m user -a "name=longshuai state=absent"

指定update_password=always將老是修改用戶的密碼,無論該用戶是否已存在。而update_password=on_create則只有新建立用戶時才設置密碼,若是用戶已存在,則不會修改該用戶的密碼。默認值就是always。

openssl passwd -1 123456
$1$9jwmFoVU$MVz7ywscpoPS5WXC.srcP/

ansible centos -m user -a 'name=longshuai3 password="$1$9jwmFoVU$MVz7ywscpoPS5WXC.srcP/" update_password=always'

建立用戶並指定密碼,但若是用戶已存在則不修改密碼。

openssl passwd -1 234567
$1$J9Nt0scL$R9Db5Pi1AJ7FQv4Xzia0w/

ansible centos -m user -a 'name=longshuai3 password="$1$J9Nt0scL$R9Db5Pi1AJ7FQv4Xzia0w/" update_password=on_create'

1.2.12 authorized_key模塊

ansible-doc -s authorized_key
- name: Adds or removes an SSH authorized key
  action: authorized_key
    key=        # 公鑰路徑,能夠是本地文件,能夠是url地址。
                # 本地文件時使用{{ lookup('file', '~/.ssh/id_rsa.pub') }},
                # url使用https://github.com/username.keys。
    manage_dir  # 是否建立或修改目標authorized_keys所在目錄的全部者和權限。默認爲yes。
                # 使用自定義的目標路徑時,必須設置爲no或false
    path        # authorized_keys所在的目錄,默認爲家目錄下的.ssh目錄中
    state       # present/absent,是否將密鑰添加到目標authorized_keys文件中。
    user=       # 添加到遠程哪一個用戶下的authorized_keys文件

例如將公鑰添加到centos組中的機器中。使用-k選項用於詢問ssh鏈接的密碼。

ansible centos -m authorized_key -a "key={{lookup('file','~/.ssh/id_rsa.pub')}} state=present user=root" -k

要想使用該模塊實現非交互,須要在inventory文件中指定主機或主機組中加上"ansible_ssh_pass='PASSWORD'"參數。例如:

192.168.100.65 ansible_ssh_pass='123456'
[centos6]
host1
host2
host3
[centos6:vars]
ansible_ssh_pass='123456'

但這樣不會將主機密鑰添加到主控制端的known_hosts文件中,所以下次執行ansible時會失敗。能夠在配置文件中作以下設置:

host_key_checking = False

或者乾脆使用expect非交互更方便。

1.2.13 debug模塊

用於輸出自定義的信息,相似於echo、print等輸出命令。ansible中的debug主要用於輸出變量值、表達式值,以及用於when條件判斷時。使用方式很是簡單。

ansible-doc -s debug
- name: Print statements during execution
  action: debug
      msg        # 輸出自定義信息。若是省略,則輸出普通字符。
      var        # 指定待調試的變量。只能指定變量,不能指定自定義信息,且變量不能加{{}}包圍,而是直接的變量名。
      verbosity  # 控制debug運行的調試級別,有效值爲一個數值N。

例如:

ansible centos -m debug -a 'msg="i want to print this messages"'
ansible centos -m debug -a 'var=ansible_eth0.ipv4.address'

能夠輸出變量值,不過通常使用到變量的時候都會在playbook中使用debug模塊,如下是一個示例:

tasks:
  - name: print any messages
      debug: msg="you name is {{ name }}"

1.2.14 定時任務模塊cron

cron模塊用於設置定時任務,也用於管理定時任務中的環境變量。

ansible-doc -s cron
- name: Manage cron.d and crontab entries.
  action: cron
      backup         # (yes/no)若是設置了,則會在修改遠程cron_file前備份這些文件
      cron_file      # 自定義cron_file的文件名,使用相對路徑則表示在/etc/cron.d中。必須同時指定user選項
      user           # 指定哪一個用戶的crontab將要被修改,默認修改的用戶爲主控端所在的用戶名id的映射
      disabled       # 禁用crontab中的某個job,要求state=present
      env            # (yes/no)設置一個環境變量,將添加在crontab的頂端。使用name和value定義變量名和值
      job            # 須要執行的命令。若是設置了env,則表示環境變量的值,此時job="XXXX"等價於value="XXXX"。
                     # 要求state=present
      minute         # 分(0-59, *, */N),不寫時,默認爲*
      hour           # 時(0-23, *, */N),不寫時,默認爲*
      day            # 日(1-31, *, */N),不寫時,默認爲*
      month          # 月(1-12, *, */N),不寫時,默認爲*
      weekday        # 周(0-6 for Sunday-Saturday, *),不寫時,默認爲*
      name           # 描述crontab任務的字符串。但若是設置的是env,則name爲環境變量的名稱。要求state=absent
                     # 注意,若未設置name,且state=present,則總會建立一個新job條目,即便cron_file中已經存在
                     # 一樣的條目
      special_time   # 定時任務的別稱,用於定義什麼時候運行job條目。
                     # 有效值有reboot/hourly/daily/weekly/monthly/yearly/annually。
      state          # job或者env的狀態是present(默認)仍是absent。present用於建立,absent用於移除

除了cron模塊自己能夠管理cron的環境變量,另外一個模塊cronvar也能夠定義定時任務的環境變量。

ansible-doc -s cronvar
- name: Manage variables in crontabs
  action: cronvar
      backup        # (yes/no)若是設置了,則會在修改遠程cron_file前備份這些文件
      cron_file     # 自定義cron_file的文件名,使用相對路徑則表示在/etc/cron.d中
      state         # present用於建立變量,absent用於移除變量
      user          # 指定哪一個用戶的crontab將要被修改,默認爲root
      value         # 環境變量的值,要求state=present

例如:建立一個job,每2分鐘進行一次時間同步,而且自定義cron_file。

ansible centos7 -m cron -a 'name="ntpdate" job="/usr/sbin/ntpdate ntp1.aliyun.com" cron_file=ntpdate_cron user=root minute=*/2' -o

驗證是否添加正確。

ansible centos7 -m shell -a 'cat /etc/cron.d/ntpdate_cron'
192.168.100.65 | SUCCESS | rc=0 >>
#Ansible: ntpdate
*/2 * * * * root /usr/sbin/ntpdate ntp1.aliyun.com

192.168.100.63 | SUCCESS | rc=0 >>
#Ansible: ntpdate
*/2 * * * * root /usr/sbin/ntpdate ntp1.aliyun.com

192.168.100.64 | SUCCESS | rc=0 >>
#Ansible: ntpdate
*/2 * * * * root /usr/sbin/ntpdate ntp1.aliyun.com

移除一個job,要求name必須匹配。若有必要,須要同時指定cron_file和user。

ansible centos7 -m cron -a 'name="ntpdate" state=absent cron_file=ntpdate_cron user=root' -o

設置crontab環境變量,並定義一個job。

ansible centos7 -m cron -a 'env=yes name=app_home value=/tmp' -o   
ansible centos7 -m cron -a 'name="ntpdate" job="/usr/sbin/ntpdate ntp1.aliyun.com" minute=*/2' -o

驗證設置結果。

ansible centos7 -m shell -a 'crontab -l'
192.168.100.65 | SUCCESS | rc=0 >>
app_home="/tmp"
#Ansible: ntpdate
*/2 * * * * /usr/sbin/ntpdate ntp1.aliyun.com

192.168.100.63 | SUCCESS | rc=0 >>
app_home="/tmp"
#Ansible: ntpdate
*/2 * * * * /usr/sbin/ntpdate ntp1.aliyun.com

192.168.100.64 | SUCCESS | rc=0 >>
app_home="/tmp"
#Ansible: ntpdate
*/2 * * * * /usr/sbin/ntpdate ntp1.aliyun.com

1.2.15 歸檔模塊archive

用於在遠端壓縮文件。固然,前提是在遠端主機上要有對應的壓縮工具。支持zip/gz/tar/bz2。

ansible-doc -s archive 
- name: Creates a compressed archive of one or more files or trees.
  action: archive
      dest         # 目標歸檔文件名。除非path指定要壓縮的是單文件,不然須要dest選項
      format       # 指定壓縮格式,默認爲gz格式
      group        # 文件/目錄的所屬組
      owner        # 文件/目錄的全部者
      mode         # 設置文件/目錄的的權限,支持'0644'或'u+rwx'或'u=rw,g=r,o=r'等格式
      path=        # 要壓縮的文件,能夠是絕對路徑,也能夠是glob統配的路徑,還能夠是文件列表
      remove       # 壓縮後刪除源文件

例如:

# 將目錄/path/to/foo/壓縮爲/path/to/foo.tgz
- archive:
 path: /path/to/foo
 dest: /path/to/foo.tgz

# 壓縮普通文件/path/to/foo爲/path/to/foo.gz並刪除源文件,因爲壓縮的是單文件,因此能夠省略dest選項
- archive:
 path: /path/to/foo
 remove: True

# 將單文件/path/to/foo壓縮爲zip格式
- archive:
 path: /path/to/foo
 format: zip

# 將給定的文件列表壓縮爲bz2格式,壓縮包路徑爲/path/file.tar.bz2
- archive:
 path:
 - /path/to/foo
 - /path/wong/foo
 dest: /path/file.tar.bz2
 format: bz2

1.2.16 解包模塊unarchive

默認複製ansible端的歸檔文件到被控主機,而後在被控主機上進行解包。若是設置選項remote_src=yes,則表示解包被控主機上的歸檔文件。

要求在被控主機上有對應的解包命令。unzip命令用於解壓".zip"文件,gtar(tar包提供)命令用於解壓".tar"、".tar.gz"、".tar.bz2"和".tar.xz"。

ansible-doc -s unarchive
- name: Unpacks an archive after (optionally) copying it from the local machine.
  action: unarchive
      creates      # 若是指定的文件存在則不執行該任務。可用於實現冪等性
      dest=        # 遠程機器上須要被解包的歸檔文件,要求是絕對路徑
      exclude      # 列出解包過程當中想要忽略的目錄和文件
      group        # 文件/目錄的所屬組
      owner        # 文件/目錄的全部者
      mode         # 設置文件/目錄的的權限,支持'0644'或'u+rwx'或'u=rw,g=r,o=r'等格式
      keep_newer   # 在解包過程當中,若是目標路徑中和包中有同名文件,且比包中的文件更新,則保留新的文件
      list_files   # 設置爲true時,將返回歸檔文件中的文件列表
      remote_src   # 設置爲yes表示遠程主機上已有目標歸檔文件,即再也不從本地複製歸檔文件到遠端,直接在遠端解包。
                   # 默認爲no
      src=         # 若是remote_src=no,將複製本地歸檔文件到遠端,可相對路徑也可絕對路徑. 
                     若是remote_src=yes, 將解包遠程已存在的歸檔文件
                     若是remote_src=yes且src中包含了"://",將指揮遠程主機從url中下載文件並解包

例如:

# 複製ansible端的foo.tgz文件到遠端並解包
- unarchive:
    src: foo.tgz
    dest: /var/lib/foo

# 直接解包遠端已經存在的文件- unarchive:
    src: /tmp/foo.zip
    dest: /usr/local/bin
    remote_src: True

# 從url上下載壓縮包,而後進行解壓
- unarchive:
    src: https://example.com/example.zip
    dest: /usr/local/bin
    remote_src: True

1.2.17 下載模塊get_url

ansible-doc -s get_url
- name: Downloads files from HTTP, HTTPS, or FTP to node
  action: get_url
      backup    # 下載文件時同時建立一個名稱中包含時間戳的備份文件
      dest=     # 文件保存路徑,必須爲絕對路徑。
                # 若是dest是一個目錄,則使用url的base name做爲文件名
                # 若是dest是一個目錄,則'force'選項不生效
                # 若是dest是一個目錄,則老是會下載目標文件,但只在已存在的文件變化了纔會替換舊文件
      force     # 若是設置爲yes,且dest不是一個目錄時,則老是會下載文件,但只在已存在的文件變化了纔會替換舊文件
                # 若是設置爲no(默認),則只會在目錄路徑下不存在該文件時纔會進行下載。
      tmp_dest  # 下載時臨時存放目錄,在任務執行完成前會刪除下載的臨時文件
      group     # 文件/目錄的所屬組
      owner     # 文件/目錄的全部者
      mode      # 設置文件/目錄的的權限,支持'0644'或'u+rwx'或'u=rw,g=r,o=r'等格式
      timeout   # 請求url時的超時時間,默認10秒鐘
      url=      # 要下載的url路徑,(http|https|ftp)://[user[:pass]]@host.domain[:port]/path
                # 還支持file格式的路徑,實現複製功能。file:///path/to/file

注意,dest爲目錄或者force=yes時,老是會下載文件到臨時存放目錄中,只不過不必定會替換舊文件。只有force=no(默認)且dest是一個文件時,在文件已存在時纔不會下載文件。

例如:

# 下載foo.conf,若/etc/foo.conf已存在,則不下載該文件
  get_url:
    url: http://example.com/path/file.conf
    dest: /etc/foo.conf
    mode: 0440

# 下載foo.conf到/tmp目錄下,若/tmp/foo.conf已存在則檢查文件是否相同,不相同則進行替換
  get_url:
    url: http://example.com/path/file.conf
    dest: /tmp/

# 複製一個本地文件
  get_url:
    url: file:///tmp/afile.txt
    dest: /tmp/afilecopy.txt

1.2.18 wait_for模塊

有些時候任務之間對狀態、文件、端口等資源是有依賴關係的,只有知足了前提,任務纔會繼續。wait_for模塊就是用於判斷任務在知足什麼條件的狀況下會繼續。主要用來判斷端口是否開啓、文件是否存在、文件中是否存在某些字符串。

ansible-doc -s wait_for
- name: Waits for a condition before continuing.
  action: wait_for
      delay          # 在檢查操做進行以前等待的秒數
      host           # 等待這個主機處於啓動狀態,默認爲127.0.0.1
      port           # 等待這個端口已經開放
      path           # 這個文件是否已經存在
      search_regex   # 在文件中進行正則匹配
      state          # present/started/stopped/absent/drained.默認started
                       當檢查的是一個端口時:
                         started:保證端口是開放的 
                         stopped:保證端口是關閉的
                        當檢查的是一個文件時:
                         present/started:在檢查到文件存在纔會繼續
                         absent:檢查到文件被移除後纔會繼續
      sleep          # 兩次檢查之間sleep的秒數,默認1秒
      timeout        # 檢查的等待超時時間(秒數,默認300)

例如:

# 鏈接上主機後10秒後才檢查8000端口是否處於開放狀態,300秒(默認值)內未開放則超時。
- wait_for:
    port: 8000
    delay: 10

# 直到/tmp/foo文件存在纔會繼續
- wait_for:
    path: /tmp/foo

# 直到/tmp/foo文件中能匹配"completed"字符串才繼續
- wait_for:
    path: /tmp/foo
    search_regex: completed

# 直到/var/lock/file.lock這個鎖文件被移除了才繼續
- wait_for:
    path: /var/lock/file.lock
    state: absent

# 直到/proc/3466/status文件被移除才繼續,可用來判斷進程是啓動仍是中止,pid文件是存在仍是被移除等
- wait_for:
    path: /proc/3466/status
    state: absent

1.2.19 script模塊

script模塊用於控制遠程主機執行腳本。在執行腳本前,ansible會將本地腳本傳輸到遠程主機,而後再執行。在執行腳本的時候,其採用的是遠程主機上的shell環境。

ansible-doc -s script
- name: Runs a local script on a remote node after transferring it
  action: script
      chdir         # 在遠程執行腳本前先切換到此目錄下。
      creates       # 當此文件存在時,不執行腳本。可用於實現冪等性。
      removes       # 當此文件不存在時,不執行腳本。可用於實現冪等性。
      free_form=    # 本地待執行的腳本路徑、選項、參數。之因此稱爲free_form,是由於它是腳本名+選項+參數。

例如,將ansible端/tmp/a.sh發送到各被控節點上執行,但若是被控節點的/tmp下有hello.txt,則不執行。

---
    - hosts: centos
      remote_user: root
      tasks:
        - name: execute /tmp/a.sh,but only /tmp/hello.txt is not yet created script: /tmp/a.sh hello args: creates: /tmp/hello.txt
相關文章
相關標籤/搜索