ansible自動化工具(二)

ping

功能:嘗試連接到主機,驗證並返回pong成功。html

-對於Windows目標,改用win_ping模塊
-不使用ICMP協議,使用SSH協議

 

例子:
#ansible webservers -m ping

10.39.2.107 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"     >返回pong代表成功通信
}
10.39.2.106 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}java

command

功能:遠程節點執行命令node

-變量和操做符號"<", ">", "|", ";" and "&" 不能正常工做。若是須要使用,請使用shell模塊
-Ansible默認不指定模塊時,將使用此模塊。

  

- chdir
    命令運行前先切換到此目錄
- creates 條件判斷,若是文件存在,將不執行後面的命令。 #ansible webservers -m command -a 'creates=/app echo /app not found' 10.39.2.107 | CHANGED | rc=0 >> /app not found 10.39.2.106 | CHANGED | rc=0 >> /app not found
- removes 
  條件判斷,若是文件不存在,將不執行後面的命令。
  #ansible webservers -m command -a 'removes=/app echo /app not found'
  10.39.2.106 | SUCCESS | rc=0 >>
skipped, since /app does not exist

  10.39.2.107 | SUCCESS | rc=0 >>
skipped, since /app does not exist
- free_form
  The command module takes a free form command to run.  There is no parameter actually named 'free form'. 
- stdin
  將命令的stdin直接設置爲指定的值
- warn
  若是ansible.cfg設置了開啓警報,將不會對這一行進行警報、

shell

功能:在遠程節點執行命令。與command模塊使用一致,可是,變量和操做符號」<「,">" ,"|" ,";", and"&"能正常工做python

下面2個例子對比能清晰的表示出不一樣的地方
#ansible webservers -m shell -a 'echo $(java -version)'
10.39.2.107 | CHANGED | rc=0 >>
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
10.39.2.106 | CHANGED | rc=0 >>
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)'
#ansible webservers -m command -a 'echo $(java -version)' 10.39.2.107 | CHANGED | rc=0 >> $(java -version) 10.39.2.106 | CHANGED | rc=0 >> $(java -version)

這些複雜的命令就算是用shell也有可能會失敗,因此須要寫到腳本里面,使用copy模塊copy到遠程節點,
執行,在把須要的結果拉回到執行命令的機器
#ansible webservers -m shell -a df|awk '{print $5}'

script

功能:把腳本複製到遠程節點後,在遠程節點本地運行腳本mysql

給定的腳本將經過遠程節點上的shell環境進行處理。
這個模塊在遠程系統上是不須要python,就想原始腳本同樣。
cat shell.sh
#!/bin/bash
echo $PATH
echo xiaolei.xing
echo $(java -version)

#ansible webservers
-m script -a './shell.sh' 10.39.2.106 | CHANGED => { "changed": true, "rc": 0, "stderr": "Shared connection to 10.39.2.106 closed.\r\n", "stderr_lines": [ "Shared connection to 10.39.2.106 closed." ], "stdout": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin\r\nxiaolei.xing\r\nopenjdk version \"1.8.0_212\"\r\nOpenJDK Runtime Environment (build 1.8.0_212-b04)\r\nOpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)\r\n\r\n", "stdout_lines": [ "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin", "xiaolei.xing", "openjdk version \"1.8.0_212\"", "OpenJDK Runtime Environment (build 1.8.0_212-b04)", "OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)", "" ] } 10.39.2.107 | CHANGED => { "changed": true, "rc": 0, "stderr": "Shared connection to 10.39.2.107 closed.\r\n", "stderr_lines": [ "Shared connection to 10.39.2.107 closed." ], "stdout": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin\r\nxiaolei.xing\r\nopenjdk version \"1.8.0_212\"\r\nOpenJDK Runtime Environment (build 1.8.0_212-b04)\r\nOpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)\r\n\r\n", "stdout_lines": [ "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin", "xiaolei.xing", "openjdk version \"1.8.0_212\"", "OpenJDK Runtime Environment (build 1.8.0_212-b04)", "OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)", "" ] }

copy

功能:複製文件或者目錄到遠程節點。默認會覆蓋目標文件linux

backup:在覆蓋以前將原文件備份,備份文件包含時間信息。有兩個選項:yes|no
content:用於替換」src「,能夠直接設定指定文件的內容,至關於echo重定向內容到文件
dest:必選項。要將源文件複製到遠程主機的絕對路徑,若是源文件是一個目錄,那麼該路徑也必須是一個目錄
directory_mode:遞歸的設定目錄的權限,默認爲系統默認權限
force:若是目標主機包含該文件,但內容不一樣,若是設置爲yes,則強制覆蓋,若是爲no,則只有當目標主機的目標位置不存在該文件時,才複製。默認爲yes
others:全部的file模塊裏的選項均可以在這裏使用
src:要複製到遠程主機的文件在本地的地址,能夠是絕對路徑,也能夠是相對路徑。若是路徑是一個目錄,它將遞歸複製。在這種狀況下,若是路徑是以」/「來結尾,則只複製目錄裏的內容,若是沒有使用"/"來結尾,則包含目錄在內的整個內容所有複製,相似於rsync。
例子:
    #ansible webservers -m copy -a 'src=/tmp/a.txt dest=/app backup=yes'

    複製目錄時,斜線不要寫
    #ansible webservers -m copy -a 'src=/tmp/dir dest=/app backup=yes'
    
    根據內容生成文件,至關於echo abc123 > /app/123.txt
    #ansible webservers -m copy -a 'content="abc123" dest=/app/123.txt'

fetch

功能:從遠程節點獲取文件(只能是文件)到本地目錄。默認會以主機清單中的主機名爲目錄,存放獲取到的文件nginx

例子:
    #ansible all -m fetch -a 'src=/var/log/messages dest=/app'

tree -L 1 /app/
/app/
├── 10.39.2.106
├── 10.39.2.107
├── 10.39.2.113
└── 10.39.2.118git

注意: src=/var/log/mess*  這種通配符語法是不支持的github

file

功能:設置遠程節點的文件的文件屬性web

force:須要在兩種狀況下強制建立軟鏈接,一種是源文件不存在,但以後會建立的狀況下;另外一種是目標軟鏈接已經存在,須要先取消以前的軟鏈接,而後在建立新的軟鏈接,有兩個選項:yes|no
group:定義文件或者目錄的所屬組
mode:定義文件或者目錄的權限
owner:定義文件或者目錄的所屬用戶
path:必選項,定義文件或者目錄的路徑
recurese:遞歸的設置文件的屬性,只針對目錄有效
src:要被連接的源文件路徑,只 應用於state=link的狀況
dest:被鏈接到的路徑,只應用於state=link的狀況
state:操做方法
    directory:若是目錄不存在,建立目錄
    file:即便文件不存在,也不會建立
    link:建立軟鏈接
    hard:建立硬鏈接
    touch:若是文件不存在,則會建立一個新文件,若是文件或者目錄已經存在,則更新其最後修改的時間
    absent:刪除目錄、文件或者取消連接文件,至關於rm -ef
例子:
    建立空目錄,相似於mkdir -p
    #ansible dbservers -m file -a 'path=/app/dir2/dir3 state=directory mode=0644 owner=mysql'
    
    建立空文件,相似於touch
    #ansible dbservers -m file -a 'path=/app/dir1/abc.txt state=touch mode=0644 owner=mysql'
    建立軟鏈接
    #ansible dbservers -m file -a 'path=/app/dir1/abc.txt state=link src=/app/dir2/abc.txt'   
   lrwxrwxrwx 1 root  root 17 Jun 13 02:48 abc.txt -> /app/dir1/abc.txt

hostname

功能:設置遠程節點主機名

例子:
    #ansible dbservers -m hostname -a 'name=mysql'

cron

功能:管理計劃任務

backup:對遠程主機上的原任務計劃內容作備份
cron_file:若是指定該選項,則用該文件替換遠程主機上的cron.d目錄下的用戶任務計劃
day:日(1-31,*,*/2,。。。)
hour:小時(0-23,*,*/2,……)  
minute:分鐘(0-59,*,*/2,……) 
month:月(1-12,*,*/2,……) 
weekday:周(0-7,*,……)
job:要執行的任務,依賴於state=present
name:該任務的描述
special_time:指定何時執行,參數:reboot,yearly,annually,monthly,weekly,daily,hourly
state:確認該任務計劃是建立仍是刪除
user:以那個用戶身份來執行
例子:
    #ansible dbservers -m cron -a 'name="test cron job" minute=*/2 job="/usr/bin/wall hello world"'

    禁用某個計劃任務
    正確的寫法:必須完整的寫完,包括name等屬性正確的寫法:必須完整的寫完,包括name等屬性
    #ansible dbservers -m cron -a 'disabled=yes name="test cron job" minute=*/2 job="/usr/bin/wall hello world"'

         #ansible dns -m cron -a 'disabled=yes job="/usr/bin/wall hello world"'   > 這種寫法是不對的,它會建立一條如下記錄並禁用它

         刪除計劃任務
        #ansible dbservers -m cron -a 'state=absent name="test cron job"'

yum 

功能:使用yum包管理器來管理軟件包

config_file:yum的配置文件
disable_gpg_check:關閉gpg_check
disablerepo:不啓用某個源
enablerepo:啓動某個源
name:要進項操做的軟件包的名字,也能夠傳遞一個url或者一個本地的rpm包的路徑
state:Whether to install (`present' or `installed', `latest'), or remove (`absent' or `removed') a package.
        (可選值: present, installed, latest, absent, removed) [Default: present]
例子:
    #ansible all -m yum -a 'name=tree state=installed'

    查看
    #ansible all -m command -a 'rpm -qa |grep tree'
    #ansible all -m shell -a 'rpm -qa |grep tree' -o

yum_repository

功能:配置管理yum源

reposdir:repo文件存放目錄
file:repo文件名,默認爲name的值
name:惟一的repository ID
gpgkey:設置gpgkey
gpgcheck:設置gpg檢查
enabled:設置開啓關閉
bandwidth控制帶寬,0爲無限
state:狀態(present,absent)
description:描述
例子:
    #ansible all -m yum_repository -a 'state=present name=epel enabled=yes gpgcheck=yes description="Aliyuan EPEL" baseurl="http://mirrors.aliyun.com/epel/6/$basearch,http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/" gpgkey="https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-6Server"'

service 

功能:配置管理服務

arguments:給命令行提供一些選項,可使用別名args
enabled:是否開機啓動 yes|no
name:必選項,服務名稱
pattern:定義一個模式,若是經過status指令來查看服務的狀態時,沒有相應,就會經過ps指令在進程中很具該模式進項查找,若是匹配到,則認爲該服務依然在運行
runlevel:定義運行級別
sleep:若是執行了restarted,則在stop和start之間沉睡幾秒
state:對當前服務執行啓動,中止,重啓,從新加載配置等操做(started,stoped,restarted,reloaded)
例子:
    #ansible dbservers -m service -a 'name=httpd state=started' >一次只能操做一個服務

setup

功能:收集關於遠程主機的信息。

在playbooks裏常常會用到一個參數gather_facts就與該模塊相關

--tree:將全部主機的輸出信息保存到/tmp目錄下,以/etc/ansible/hosts裏面的主機名爲文件名
#ansible all -m setup -a 'filter=ansible_distribution_version' --tree /tmp/

filter:過濾關鍵字
#ansible dbservers -m setup -a 'fileter=ansible_distribution_version'

gather_subset:按子集收集信息,值有all,min,hardware,network,virtual,ohai,facter。不包含請使用!號,如!network
 關鍵字 說明  返回值例子 
ansible_nodename 節點名  "6-dns-1.hunk.tech"
ansible_fqdn  FQDN名  "6-dns-1.hunk.tech"
ansible_hostname  主機短名稱 "6-dns-1"
ansible_domain  主機域名後綴  "hunk.teh"
ansible_memtotal_mb 總屋裏內存  "ansible_memtotal_mb": 7822
ansible_swaptotal_mb  SWAP總大小   "1023"
ansible_processor  CPU信息   Intel(R) Core(TM) i5-5200U CPU @ 2.20GHz
ansible_processor_cores  CPU核心數量   4
ansible_processor_vcpus  CPU邏輯核心數量   2
ansible_all_ipv4_address  全部IPv4地址   10.39.2.113
ansible_all_ipv6_address  全部IPV6地址    
ansible_default_ipv4  默認網關的網卡配置信息 
ansible_eth2 具體網卡信息  不一樣系統名稱須要變化
ansible_dns DNS設置信   
ansible_architecrure  系統架構   
x86_64
ansible_machine  主機類型   
x86_64
ansible_kernel  內核版本   "3.10.0-862.el7.x86_64"
ansible_distribution  發行版本   "CentOS"
ansible_distribution_major_version  操做系統主版本號   "7"
ansible_distribution_release  髮型版本名稱   
"Final"
ansible_distribution_version  完整版本號   
"7.4.1708"
ansible_pkg_mgr  軟件包管理方式   "yum"
ansible_service_mgr 進行服務方式  "systemd"
ansible_os_family  系列    "RedHat"
ansible_cmdline  內核啓動參數   "systemd"
ansible_selinux  SElinux狀態  「disabled」 
ansible_env  當前環境變量參數    
ansible_date_time  時間相關 
ansible_python_version  python版本   「2.7.5」
ansible_lvm  LVM卷相關信息      
ansible_mounts  全部掛載點 
ansible_device_links  全部掛載設備的UUID和卷標名
ansible_devices  全部的/dev/下正在使用的設備信息
ansible_user_dir  執行用戶的家目錄 「/root」 
ansible_user_gecos  執行用戶的描述 「The root」 
ansible_user_gid  執行用戶的GID   0
ansible_user_id  執行用戶的用戶名   「root」
ansible_user_shell  執行用的shel類型  「/bin/bash」 
 ansible_user_uid  執行用戶的UID

 user

功能:管理用戶帳號和用戶屬性

      對於windows目標,請改用win_user模塊

選項太多,與useradd這類系統命令差很少,詳情查看

http://docs.ansible.com/ansible/latest/user_module.html

Example:
name:用戶名,可使用別名user
#ansible dbservers -m user -a 'name=mysql shell=/sbin/nologin system=yes comment="name is mysql"'

#刪除用戶
ansible dbservers -m user -a 'name=mysql state=absent'

#修改用戶指定信息
ansible dbservers -m user -a 'name=mysql state=present comment="mysql is my"'

remove:刪除用戶時一併刪除用戶家目錄,須要與state=absent一塊兒使用
ansible db -m user -a 'name=hunk3 state=absent remove=yes'

state:操做方法。(present , absent)

groups: 添加輔助組
group: 指定用戶的主組

如下這個例子注意看,group和groups所表明的含義不一樣。
    - name: add user
      user: name={{ username }} group=ftp groups={{ groupname }}

 

Examples
- name: Add the user 'johnd' with a specific uid and a primary group of 'admin'
  user:
    name: johnd
    comment: John Doe
    uid: 1040
    group: admin

- name: Add the user 'james' with a bash shell, appending the group 'admins' and 'developers' to the user's groups
  user:
    name: james
    shell: /bin/bash
    groups: admins,developers
    append: yes

- name: Remove the user 'johnd'
  user:
    name: johnd
    state: absent
    remove: yes

- name: Create a 2048-bit SSH key for user jsmith in ~jsmith/.ssh/id_rsa
  user:
    name: jsmith
    generate_ssh_key: yes
    ssh_key_bits: 2048
    ssh_key_file: .ssh/id_rsa

- name: Added a consultant whose account you want to expire
  user:
    name: james18
    shell: /bin/zsh
    groups: developers
    expires: 1422403387

- name: Starting at Ansible 2.6, modify user, remove expiry time
  user:
    name: james18
    expires: -1

 group

功能:添加用戶組或者刪除用戶組

group模塊請求的是groupadd,groupdel,groupmod三個指令。

get_url

功能:從HTTP,HTTPS或者FTP下載文件

checksum:下載完成後進行checksum;格式:e.g.checksum="sha256:D98291AC[...]B6DC7B97".值有sha1, sha224, sha384, sha256, sha512, md5
timeout:下載超時時間。默認10s
url:下載的URL
url_password、url_username:主要用於須要用戶名和密碼驗證的狀況
use_proxy:是使用代理,代理須要事先在環境中定義
force:yes目標存在時是否下載,no目標文件不存在時下載
backup:建立一個包含時間戳信息的備份文件
example:
    #ansible dns -m get_url -a 'dest=/app/ url="https://github.com/bennojoy/nginx/archive/master.zip"'

    #ansible dns -m get_url -a 'dest=/app/ELS.txt checksum=sha1:8c9e20bd25525c3ed04ebaa407097fe875f02b2c url="ftp://172.18.0.1/pub/Files/ELS.txt" force=yes'

fail

功能:自定義消息失敗

example
    - fail:
        msg:"The system may not be provisioned according to the CMDB status."
       when:cmdb_status != "to-be-staged"
    
    默認返回 'Failed as requested from task'

lineinfile

功能:此模塊確保特定行位於文件中,或使用反向引用的正則表達式替換現有行。

      當您只想更改文件中的單行時,這很是有用。

           若是要更改多個類似的行,請查看替換模塊;若是要插入/更新/刪除文件中的行塊,請查看blockinfile。對於其餘狀況,請參閱副本或模板模塊。

backup:建立一個包含時間戳信息的備份文件
backrefs:爲no時,若是沒有匹配,則添加一行line。若是匹配了,則把匹配內容替被換爲line內容。
            爲yes時,若是沒有匹配,則文件保持不變。若是匹配了,把匹配內容替被換爲line內容。
insertafter:配合state=present。該行將在指定正則表達式的最後一個匹配以後插入。一個特殊的價值是在EOF; EOF用於在文件的末尾插入行。若是指定的正則表達式沒有匹配,則將使用EOF
insertBefore:state=present。該行將在指定正則表達式的最後一個匹配以前插入。 BOF用於在文件的開頭插入行。若是指定的正則表達式不匹配,則該行將被插入到文件的末尾。不能使用backrefs
valiate:在保存sudoers文件前,驗證語法,若是有錯,執行時,會報出來,從新編輯playbook
regexp:正則表達式
- lineinfile:
    path: /etc/selinux/config
    regexp: '^SELINUX='
    line: 'SELINUX=disable'
- lineinfile:
    path: /etc/sudoers
    state: absent
    regexp:'^%wheel'
- lineinfile:
    path: /etc/hosts
    regexp: '^127\.0\.0\.1'
    line: '127.0.0.1 hocalhost'
    owner: root
    group: root
    mode:0644
- lineinfile:
    path: /etc/httpd/conf/httpd.conf
    regexp: '^Listen '
    insertafter: '^#Listen '
    line: 'Listen 8080'

- lineinfile:
    path: /etc/services
    regexp: '^# port for http'
    insertbefore: '^www.*80/tcp'
    line: '# port for http by default'

# Add a line to a file if it does not exist, without passing regexp
- lineinfile:
    path: /tmp/testfile
    line: '192.168.1.99 foo.lab.net foo'

# Fully quoted because of the ': ' on the line. See the Gotchas in the YAML docs.
- lineinfile:
    path: /etc/sudoers
    state: present
    regexp: '^%wheel\s'
    line: '%wheel ALL=(ALL) NOPASSWD: ALL'

# Yaml requires escaping backslashes in double quotes but not in single quotes
- lineinfile:
    path: /opt/jboss-as/bin/standalone.conf
    regexp: '^(.*)Xms(\\d+)m(.*)$'
    line: '\1Xms${xms}m\3'
    backrefs: yes

# Validate the sudoers file before saving
- lineinfile:
    path: /etc/sudoers
    state: present
    regexp: '^%ADMIN ALL='
    line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'
    validate: '/usr/sbin/visudo -cf %s'

replace

功能:替換一個文件中符合匹配的全部行,或者使用一個反引用的正則表達式替換全部的行

- replace:
        path: /etc/selinux/config
        regexp: '^SELINUX=.*'
        replace: 'SELINUX=disabled'

# Before 2.3, option 'dest', 'destfile' or 'name' was used instead of 'path'
- replace:
    path: /etc/hosts
    regexp: '(\s+)old\.host\.name(\s+.*)?$'
    replace: '\1new.host.name\2'
    backup: yes

# Replace after the expression till the end of the file (requires >=2.4)
- replace:
    path: /etc/hosts
    regexp: '(\s+)old\.host\.name(\s+.*)?$'
    replace: '\1new.host.name\2'
    after: 'Start after line.*'
    backup: yes

# Replace before the expression till the begin of the file (requires >=2.4)
- replace:
    path: /etc/hosts
    regexp: '(\s+)old\.host\.name(\s+.*)?$'
    replace: '\1new.host.name\2'
    before: 'Start before line.*'
    backup: yes

# Replace between the expressions (requires >=2.4)
- replace:
    path: /etc/hosts
    regexp: '(\s+)old\.host\.name(\s+.*)?$'
    replace: '\1new.host.name\2'
    after: 'Start after line.*'
    before: 'Start before line.*'
    backup: yes

- replace:
    path: /home/jdoe/.ssh/known_hosts
    regexp: '^old\.host\.name[^\n]*\n'
    owner: jdoe
    group: jdoe
    mode: 0644

- replace:
    path: /etc/apache/ports
    regexp: '^(NameVirtualHost|Listen)\s+80\s*$'
    replace: '\1 127.0.0.1:8080'
    validate: '/usr/sbin/apache2ctl -f %s -t'

- name: short form task (in ansible 2+) necessitates backslash-escaped sequences
  replace: dest=/etc/hosts regexp='\\b(localhost)(\\d*)\\b' replace='\\1\\2.localdomain\\2 \\1\\2'

- name: long form task does not
  replace:
    dest: /etc/hosts
    regexp: '\b(localhost)(\d*)\b'
    replace: '\1\2.localdomain\2 \1\2'

更多模塊說明 ,參考官網文檔http://docs.ansible.com/

相關文章
相關標籤/搜索