功能:嘗試連接到主機,驗證並返回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
功能:遠程節點執行命令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設置了開啓警報,將不會對這一行進行警報、
功能:在遠程節點執行命令。與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}'
功能:把腳本複製到遠程節點後,在遠程節點本地運行腳本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)", "" ] }
功能:複製文件或者目錄到遠程節點。默認會覆蓋目標文件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'
功能:從遠程節點獲取文件(只能是文件)到本地目錄。默認會以主機清單中的主機名爲目錄,存放獲取到的文件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
功能:設置遠程節點的文件的文件屬性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
功能:設置遠程節點主機名
例子: #ansible dbservers -m hostname -a 'name=mysql'
功能:管理計劃任務
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包管理器來管理軟件包
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源
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"'
功能:配置管理服務
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' >一次只能操做一個服務
功能:收集關於遠程主機的信息。
在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 | 系統架構 |
|
|
ansible_machine | 主機類型 |
|
|
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 | 0 |
功能:管理用戶帳號和用戶屬性
對於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模塊請求的是groupadd,groupdel,groupmod三個指令。
功能:從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'
功能:自定義消息失敗
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'
功能:此模塊確保特定行位於文件中,或使用反向引用的正則表達式替換現有行。
當您只想更改文件中的單行時,這很是有用。
若是要更改多個類似的行,請查看替換模塊;若是要插入/更新/刪除文件中的行塊,請查看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:
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'