ansible的使用

運維自動化發展歷程及技術應用

  1. IAAS基礎設置即服務,提供硬件服務
  2. PAAS平臺即服務,提供操作系統服務
  3. SAAS軟件即服務,提供整套服務

 

ansible的安裝

yum -y install ansible

ansible –version 查看版本信息

 

/etc/ansible/ansible.cfg? 配置文件

/etc/ansible/hosts?????? 控制的主機列表

/etc/ansible/roles?????? 角色

 

添加主機清單,在/etc/ansible/hosts文件中添加主機

234

可以以分組添加形式添加,如:

23324

連接被控制的主機,ansible是基于ssh協議,

[root@centos7 ~]#ansible appsrv -m ping -k

appsrv代表配置文件中定義的主機列表,-m表示模塊,-k提供用戶名口令

 

ansible all -m ping??????? all代表所有主機

 

ansible 配置文件

Ansible配置文件/etc/ansible/ansible.cfg(一般保持默認)

[defaults]

#inventory = /etc/ansible/hosts # 主機列表配置文件

#library = /usr/share/my_modules/ # 庫文件存放目錄

#remote_tmp= $HOME/.ansible/tmp#臨時py命令文件存放在遠程主機目錄

#local_tmp= $HOME/.ansible/tmp# 本機的臨時命令執行目錄

#forks = 5 # 默認并發數

#sudo_user= root # 默認sudo用戶

#ask_sudo_pass= True #每次執行ansible命令是否詢問ssh密碼

#ask_pass= True

#remote_port= 22

#host_key_checking= False # 檢查對應服務器的host_key,建議取消注釋??? 建議開啟

#log_path=/var/log/ansible.log#日志文件??????????????????????????????? 建議開啟

 

ansible-doc:顯示模塊幫助

Ansible-doc -a 顯示所有模塊的文檔

Ansible-doc -l? 列出可用模塊

Ansible-doc -s? 顯示指定模塊的playbook片段

例:ansible-doc ping 顯示ping模塊的用

 

ansible<host-pattern> [-m module_name] [-a args]

–version 顯示版本

-m module指定模塊,默認為command

-v 詳細過程–vv-vvv更詳細

–list-hosts 顯示主機列表,可簡寫—list

-k, –ask-pass 提示連接密碼,默認Key驗證

-K, –ask-become-pass 提示輸入sudo

-C, –check 檢查,并不執行

-T, –timeout=TIMEOUT 執行命令的超時時間,默認10s

-u, –user=REMOTE_USER 執行遠程執行的用戶

-b, –become 代替舊版的sudo切換

 

例:–list-hosts顯示主機列表

[root@centos7 .ssh]#ansible all –list-hosts

hosts (3):

192.168.67.131

192.168.67.132

192.168.67.53

[root@centos7 .ssh]#ansible appsrv –list-hosts

hosts (2):

192.168.67.131

192.168.67.132

 

基于key驗證,用戶不用輸入密碼

ssh-keygen

Ssh-copy-id hostIP? 分別輸入不同主機ip

[root@centos7 .ssh]#ansible all -m ping

192.168.67.131 | SUCCESS => {

“changed”: false,

“ping”: “pong”

}

192.168.67.53 | SUCCESS => {

“changed”: false,

“ping”: “pong”

}

192.168.67.132 | SUCCESS => {

“changed”: false,

“ping”: “pong”

}

 

ansible的Host-pattern

匹配主機的列表

All :表示所有Inventory中的所有主機

ansibleall –m ping

* :通配符

ansible“*” -m ping

ansible192.168.1.* -m ping

ansible“*srvs” -m ping

或關系

ansible“websrvs:appsrvs” -m ping

ansible“192.168.1.10:192.168.1.20” -m ping

邏輯與

ansible“websrvs:&dbsrvs” –m ping

在websrvs組并且在dbsrvs組中的主機

邏.非

 

ansible‘websrvs:!dbsrvs’ –m ping

在websrvs組,但不在dbsrvs組中的主機

綜合邏輯

ansible‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping

正則表達式

ansible“websrvs:&dbsrvs” –m ping

ansible“~(web|db).*\.magedu\.com” –m ping

 

 

ansible 模塊介紹

?command模塊為默認模塊,可以省略不寫

[root@centos7 .ssh]#ansible all -a ‘creates=/etc/passwd cat /etc/fstab’

192.168.67.53 | SUCCESS | rc=0 >>

skipped, since /etc/passwd exists

 

192.168.67.131 | SUCCESS | rc=0 >>

skipped, since /etc/passwd exists

 

192.168.67.132 | SUCCESS | rc=0 >>

skipped, since /etc/passwd exists

creates=/etc/passwd 表示如果文件存在,后面的命令不執行

removes=/etc/passwd 表示如果文件不存在,后面的命令不執行

 

[root@centos7 .ssh]#ansible all -a ‘chdir=/boot ls’?? 查看boot目錄

 

command不支持重定向、變量、管道,shell模塊支持

如:

[root@centos7 .ssh]#ansible all -a ‘echo $HOSTNAME’

192.168.67.53 | SUCCESS | rc=0 >>

$hostname

 

192.168.67.131 | SUCCESS | rc=0 >>

$hostname

 

192.168.67.132 | SUCCESS | rc=0 >>

$hostname

 

 

shell模塊,

[root@centos7 .ssh]#ansible all -m shell -a ‘echo $HOSTNAME’

192.168.67.53 | SUCCESS | rc=0 >>

centos6.91

 

192.168.67.131 | SUCCESS | rc=0 >>

centos6.9

 

192.168.67.132 | SUCCESS | rc=0 >>

centos7.5

 

script模塊,本機的腳本在所有主機上執行

[root@centos7 data]#vim host.sh

[root@centos7 data]#chmod +x host.sh

[root@centos7 data]#ansible all -m script -a ‘/data/host.sh’

192.168.67.131 | SUCCESS => {

“changed”: true,

“rc”: 0,

“stderr”: “Shared connection to 192.168.67.131 closed.\r\n”,

“stdout”: “centos6.9\r\n”,

“stdout_lines”: [

“centos6.9”

]

}

 

copy模塊,將本機的文件復制到遠程

ansible-doc copy

例:關閉所有主機selinux

[root@centos7 data]#ansible all -m shell -a ‘getenforce’

192.168.67.53 | SUCCESS | rc=0 >>

Disabled

 

192.168.67.131 | SUCCESS | rc=0 >>

Disabled

 

192.168.67.132 | SUCCESS | rc=0 >>

Enforcing

[root@centos7 data]#ansible all -m shell -a ‘ls -l /etc/sysconfig/selinux’

192.168.67.53 | SUCCESS | rc=0 >>

lrwxrwxrwx. 1 root root 17 Apr 29 20:18 /etc/sysconfig/selinux -> ../selinux/config

 

192.168.67.131 | SUCCESS | rc=0 >>

lrwxrwxrwx. 1 root root 17 Apr? 8 12:34 /etc/sysconfig/selinux -> ../selinux/config

 

192.168.67.132 | SUCCESS | rc=0 >>

lrwxrwxrwx. 1 root root 17 May 29 04:03 /etc/sysconfig/selinux -> ../selinux/config

 

復制配置好的文件到所有遠程主機(要注意版本不同)

ansible all -m copy -a ‘src=/data/config dest=/etc/selinux/ backup=yes’

ansible all -m shell -a ‘reboot’

[root@centos7 data]#ansible all -a ‘getenforce’

192.168.67.131 | SUCCESS | rc=0 >>

Disabled

 

192.168.67.132 | SUCCESS | rc=0 >>

Disabled

 

192.168.67.53 | SUCCESS | rc=0 >>

Disabled

例:生成一個文件并且指定內容

[root@centos7 data]#ansible all -m copy -a ‘content=”hello\nhi” dest=/data/file’

[root@centos7 data]#ansible all -a ‘cat /data/file’

192.168.67.53 | SUCCESS | rc=0 >>

hello

hi

192.168.67.131 | SUCCESS | rc=0 >>

hello

hi

 

192.168.67.132 | SUCCESS | rc=0 >>

hello

hi

 

fecth模塊,從遠程主機抓取單個文件,暫時不能是目錄

[root@centos7 data]#ansible all -m fetch -a ‘src=/var/log/messages dest=/data/’

dest=/data/表示本機目錄

[root@centos7 data]#tree /data

/data

├── 192.168.67.131

│?? └── var

│?????? └── log

│?????????? └── messages

├── 192.168.67.132

│?? └── var

│?????? └── log

│?????????? └── messages

└── 192.168.67.53

└── var

└── log

└── messages

 

9 directories, 3 files

 

如果需要抓取多個文件??梢詫⑽募却虬缓笞ト?/p>

 

 

file模塊,設置文件屬性

[root@centos7 data]#ansible all -m file -a ‘dest=/data/f1 state=touch’??????? 創建文件

state=touch、absent、directory、link?? absent表示刪除、directory表示創建文件夾

dest 、name、 path三個單詞效果是等價

 

創建鏈接

[root@centos7 data]#ansible all -m file -a ‘src=/etc/fstab dest=/data/fstab.link state=link’

刪除鏈接

[root@centos7 data]#ansible all -m file -a ‘dest=/data/fstab.link state=absent’

 

 

hostname模塊,更改主機名

ansible 192.168.67.53 -m hostname -a ‘name=centos6’

 

cron模塊,創建計劃任務

ansible all -m cron -a ‘minute=* weekday=1,3,5 job=”/usr/bin/wall hello how are you !” name=notice’

 

禁用計劃任務

ansible all -m cron -a ‘disabled=true job=”/usr/bin/wall hello how are you !” name=notice’

job和name都需要指定,

 

刪除計劃任務

ansible all -m cron -a ‘job=”/usr/bin/wall how are you !” name=notice state=absent’

 

 

yum模塊

ansible all -m yum -a ‘name=vsftpd’? 安裝vsftp

ansible all -m yum -a ‘name=vsftpd state=removed’? 卸載

 

批量安裝包ansible all -m yum -a ‘name=vsftpd,dhcp,http’

批量卸載,同上

 

單獨安裝某個包,假設此包在ansible客戶端上沒有

  1. 把安裝包復制到客戶端上

ansible all -m copy -a ‘src=/data/tree-1.6.0-10.el7.x86_64.rpm dest=/root’

  1. 安裝

ansible all -m yum -a ‘name=/root/tree-1.6.0-10.el7.x86_64.rpm disable_gpg_check=yes’

 

清除yum緩存

ansible all -m yum -a ‘name=dstat update_cache=yes’

 

 

service模塊,管理服務

ansible all -m service -a ‘name=vsftpd state=started enabled=yes’? 啟動服務,并且開機啟動

restarted ,stop

 

user模塊

創建nginx系統用戶

[root@centos7 data]#ansible all -m user -a ‘name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=110’

 

刪除用戶并刪除家目錄

ansible all -m user -a ‘name=nginx state=absent remove=yes’

 

group管理組

創建組

ansible all -m group -a ‘name=wang system=yes gid=110’

 

刪除組

ansible all -m group -a ‘name=wang system=yes state=absent’

 

 

 

ansible-galaxy

連接https://galaxy.ansible.com 下載相應的roles

列出所有已安裝的galaxy

ansible-galaxy list

安裝galaxy

ansible-galaxy install geerlingguy.redis

刪除galaxy

ansible-galaxy remove geerlingguy.redis

?

ansible-vault

功能:管理加密解密yml文件

ansible-vault [create|decrypt|edit|encrypt|rekey|view]

ansible-vault encrypt hello.yml 加密

ansible-vault decrypt hello.yml 解密

ansible-vault view hello.yml 查看

ansible-vault edit hello.yml 編輯加密文件

ansible-vault rekey hello.yml 修改口令

ansible-vault create new.yml 創建新文件

 

ansible-console:2.0+新增,可交互執行命令,支持tab

root@test(2)[f:10] $

執行用戶@當前操作的主機組(當前組的主機數量)[f:并發數]$

設置并發數:forks n 例如:forks 10

切換.:cd 主機組例如:cd web

 

列出當前組主機列表:list

列出所有的內置:?或help

示例:

root@all (2)[f:5]$ list

root@all (2)[f:5]$ cd appsrvs

root@appsrvs (2)[f:5]$ list

root@appsrvs(2)[f:5]$ yum name=httpdstate=present

root@appsrvs(2)[f:5]$ service name=httpdstate=started

 

playbook的編寫

– hosts: appsrv

remote_user: root

 

tasks:

– name: install httpd

yum: name=httpd

 

– name: install configure file

copy: src=/root/httpd.conf dest=/etc/httpd/conf

 

– name: start service

service: name=httpd state=started enabled=yes

?

?運行playbook方式

ansible-playbook fileyml –check 只檢測

ansible-playbook fileyml

ansible-playbook fileyml –limit websrv? 只針對主機列表中的某些主機執行

-v?? -vv?? -vvv顯示過程

ansible-playbook file.yml –list-tasks? 查看playbook中task

ansible-playbook file.yml –list-hosts? 查看playbook中主機

?

handlers和notify結合使用觸發條件

安裝http服務,假如以下playbook已經執行,所有操作已經完成,但之后配置文件發生修改,需重新執行,但服務已經重啟過,此條任務將不執行,而無法重新加載配置文件,

 

解決方法

32

還可觸發多個

-hosts: websrvs

remote_user: root

tasks:

-name: add group nginx

tags: user

user: name=nginxstate=present

-name: add user nginx

user: name=nginxstate=present group=nginx

-name: Install Nginx

yum: name=nginxstate=present

-name: config

copy: src=/root/config.txtdest=/etc/nginx/nginx.conf

notify:

-Restart Nginx

-Check NginxProcess

 

handlers:

-name: Restart Nginx

service: name=nginxstate=restarted enabled=yes

-name: Check Nginxprocess

shell: killall-0 nginx> /tmp/nginx.log

 

playbook中tags使用

33

ansible-playbook -t install,start httpd.yml? 可以選擇標簽執行

也可以將兩個標簽的設為同一名字,執行時將同時執行兩個任務

 

playbook中變量的使用

34

1.執行的時候給變量賦值

35

2.在playbook中定義變量

36

  1. 在/etc/ansible/hosts中定義

普通變量:主機組中主機單獨定義,優先級高于公共變量

公共(組)變量:針對主機組中所有主機定義同一變量

 

 

ansible-playbook app.yml

 

變量優先級

命令行 playbook 主機清單 模板文件

setup模塊定義了系統自帶的變量

如:查看ansible_fqdn變量

ansible all -m setup -a ‘filter=”ansible_fqdn”‘

 

變量可以專門寫入一個文件中,然后調用就可以

如:在/etc/ansible/下創建一個vars.yml

var1: httpd

var2: vsftpd

 

編寫劇本調用

ansible-playbook testvars.yml

 

模板templates

Jinja2語言,使用字面量,有下面形式

字符串:使用單引號或雙引號

數字:整數,浮點數

列表:[item1, item2, …]

元組:(item1, item2, …)

字典:{key1:value1, key2:value2, …}

布爾型:true/false

算術運算:+, -, *, /, //, %, **

比較操作:==, !=, >, >=, <, <=

邏輯運算:and, or, not

流表達式:For If When

 

模板文件放置沒有嚴格要求,可以在ansible目錄下創建文件夾templates,和playbook平級

template也是個模塊,只能用于playbook,不能用于ansible命令行中

 

templates功能:根據模塊文件動態生成對應的配置文件

templates文件必須存放于templates目錄下,且命名為.j2 結尾

yaml/yml文件需和templates目錄平級,目錄結構如下:

./

├── temnginx.yml

└── templates

└── nginx.conf.j2

利用template,引用變量

例:nginx的安裝,

在/etc/ansible/下創建templates目錄

1.復制模板文件并且改名以.j2為后綴

cp /etc/nginx/nginx.conf? /etc/ansible/templates/nginx.conf.j2

2.編輯模板文件,引用一個變量,cpu個數變量ansible_processor_vcpus,此時的cup個數為1

ansible all -m setup | grep processor

vim /etc/ansible/templates/nginx.conf.j2

3.編寫playbook

4.執行playbook

ansible-playbook temnginx –limit 192.168.67.132

 

5.根據變量引用,worker process變為原來4倍

 

 

 

 

 

 

 

 

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/100290

(0)
王琪鋒王琪鋒
上一篇 2018-06-03
下一篇 2018-06-04

相關推薦

欧美性久久久久