? host inventory主機清單
? playbook相當于腳本,
? modules模塊
ansible工作原理
? 通過執行命令,或ansible playbook,cmdb
ansible配置文件
? /etc/ansible/ansible.cfg主配置文件,配置ansible工作特性
? /etc/ansible/hosts/主機清單
? /etc/ansible/roles/存放角色的目錄
程序
? /usr/bin/ansible 主程序,臨時命令執行工具
? /usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具
? /usr/bin/ansible-galaxy 下載/上傳優秀代碼或roles模塊的官網平臺
? /usr/bin/ansible-playbook 定制自動化任務,編排劇本工具/usr/bin/ansible-pull 遠程執行命令的工具
? /usr/bin/ansible-console 基于console界面與用戶交互的執行工具
主機清單inventory
? /etc/ansible/hosts文件格式
? [webservers]
? www1.magedu.com:2222
? www2.magedu.com
? [dbservers]
? db1.magedu.com
? db2.magedu.com
? 可以分組
? [websrvs]
? 192.168.30.101
? 192.169.30.102
? [dbsrvs]
? 192.168.30.10[1:3]
?
? **ansible系列命令**
? ansible ansible-doc ansible-playbook ansible-vault
? ansible-console ansible-galaxy ansible-pull
? ansible-doc:顯示模塊幫助
? ansible-doc options
? -l,- -list列出可用模塊
? -s, – -snippet顯示指定模塊的playbook片段
? ansible <host-pattern> -m module_name
? – -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, – -usr=REMOTE_USER 執行遠程的用戶
? -b, – -become 代替舊版的sudo切換
? usermod -aG wheel wang
? sudo nopasswd
? echo export EDITOR >> /etc/profile.
? 1、Ansible 172.20.104.99 172.20.104.66 -m ping -k
? ansible的Host-pattern
? 匹配主機的列表
? All:表示所有inventory中的所有主機
? ansible all -m ping
? *:通配符
? ansible “*” -m ping
? 或關系
? ansible “websrvs:appsrvs” -m ping
? ansible “192.168.1.10:192.168.1.20” -m ping
? 邏輯與
? ansible “websrvs:&dbsrvs”
? 在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:在遠程主機執行命令,默認模塊,可忽略-m選項
? ansible srvs -m command -a ‘service vsftpd start’
? ansible srvs -m command -a ‘echo magedu |passwd – -stdin wang’ 不成功
? 此命令不支持$VARNAME< > |;&等,用shell模塊實現
Shell:和command相似,用shell執行命令
? ansible srv -m shell -a ‘echo magedu|passwd – -stdin wang’
? 調用bash執行命令,類似cat /tmp/stanley.md |awk -F ‘|” {print ?2}’ &> /tmp/example.txt這些復雜命令,即使需要的結果拉回執行命令的機器
Script :運行腳本
? -a “/PATH/TO/SCRIPT_FILE”
? ansible websrvs -m script -a f1.sh
Copy :從服務器復制文件到客戶端
? ansible srv -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes”
? 如目標存在,默認覆蓋,此處指定備份
? ansible srv -m copy -a “content=’test content\n’ dest=/tmp/f1.txt” 利用內容,直接生成目標文件
cron 計劃任務
? 支持時間:minute, hour,day,month,weekday
? ansible srv -m cron -a “minute=*/5 job=’/usr/sbin/ntpdate 172.16.0.1 &>/dev/null’name=synctime” 創建任務
? ansible srv -m cron -a ‘state=absent name=synctime’ 刪除任務
ansible all -m cron -a 'minute=* weekday=1,3,5' job="/usr/bin/wall FBI warning" name=warningcron'設置計劃任務 ansible all -m cron -a 'disabled=false job="/usr/bin/wall FBI warning" name=warningcron'取消計劃任務
Fetch :從客戶端取文件至服務器端,copy相反,目錄可先tar
? ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/sciripts’
? ansible all -m shell -a ‘tar Jcf log.tar.xz /var/log/*.log’
File :設置文件屬性
? ansible srv -m file -a “path=/root/a.sh owner=wang mode=755”
? ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’
Hostname:管理主機名
? ansible node1 -m hostname -a “name=websrv”
yum:管理包
? ansible srv -m yum -a ‘name=httpd state=latest’ 安裝
? ansible srv -m yum -a ‘name=httpd state=absent’ 刪除
?
Service:管理服務
? ansible-doc -s service
? ansible websrvs – -list
? ansible srv -m service -a ‘name=httpd state=stopped’
? ansible srv -m service -a ‘name=httpd state=started enabled=yes|no’
? ansible srv -m service -a ‘name=httpd state=reloaded’
? ansible srv -m sercice -a ‘name=httpd state=restarted’
User:管理用戶
? ansible-doc -u user
? ansible srv -m user -a ‘name=user1 comment=”test user” uid=2048 home=/app/user1 group=root’
? ansible srv -m user -a ‘name=sysuser1 system=yes home=/app/user1 group=root’
? ansible srv -m user -a ‘name=user1 state=absent remove=yes’#刪除用戶及家目錄等數據
ansible websrvs -m user -a ‘name=nginx shell=/sbin/nologin/ system=yes home=/var/nginx groups=root,bin,uid=80 comment=”nginx service”‘ #創建賬號
? ansible websrvs -a ‘getent passwd nginx’#在另一臺電腦上查看
Group:管理組
? ansible srv -m group -a “name=nginx system=yes gid=80”
? ansible srv -m group -a “name=nginx state=absent”
?
ansible系列命令
? ansible-galaxy
? 連接https://galaxy.ansible.com下載相應的roles
? 列出所有已安裝的galaxy
? ansible-galaxy list
? 安裝galaxy
? ansible-galaxy install geerlingguy.redis
? 刪除galaxy
? ansible-galaxy remove geerlinguy.redis
? ansible-pull
? 推送命令至遠程,效率無限提升,對運維要求較高
? ansible-playbook
? ansible-playbook hello.yml
#mkdir ansible #vim hello.yaml --- -hosts: websrvs # remote_user: root #以root的身份在遠程主機運行 tasks: - name: hello ? command: hostname #ansible-playbook hello.yml
? 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=httpd state=present
? root@appsrvs(2)[f:5]$service name=httpd state=started
? ansible-console
? command hostname#在遠程主機執行hostname
playbook
playbook是由一個或多個“play”組成的列表
play的主要功能在于將事先歸并為一組的主機裝扮成事先通過ansible的task定義好的角色。從根本上來講,所謂的task無非是調用ansible的一個module。將多個play組織在一個playbook中,即可以讓他們聯同起來按事先編排的機制同唱一臺大戲。
playbook采用YAML語言編寫
yaml介紹
yaml語法簡介
縮進必須是統一的,不能空格和tab混用
一個name只能包括一個task
list:列表,其所有元素均使用“-”打頭
示例: # A list of tasty fruits - Apple - Orange - Strawberry - Mango
dictionay:字典,通常由多個key與value構成
示例: # An employee record name:Example Developer job:Developer skill:Elite 也可以將key:value放置于{}中進行表示,用,分隔多個key.value 示例: --- # An employee record {name:Example Developer,job:Developer,skill:Elite} ?
YAML語法
示例 name:john smith age:41 gender:male spouse: name:Jane Smith age:37 gender:Female childrem: - name:Jimmy Smith ? age 17 ? gender:Male - name:Jenny Smith ? age 13 ? gender:Female
playbook核心元素
hosts:執行的遠程主機列表
tasks:任務集
Variables:內置變量或自定義變量在playbook中調用
Templates 模版,可替換模版文件中的變量并實現一些簡單邏輯的文件
handlers和notity結合使用,由特定條件觸發的操作,滿足條件方才執行,否則不執行
tags標簽 指定某條任務執行,用于選擇運行playbook中的部分代碼。ansibe具有冪等性,因此會自動跳過沒有變化的部分,即便如此,有些代碼為測試其確實沒有發生變化的時間依然會非常地長。此時,如果確信其沒有變化,就可以通過tags跳過此些代碼片斷。
ansible-playbook -t tagsname useradd.yml
playbook基礎組件
? hosts:
# vim file.yml --- - hosts: websrvs remote_user: root ? tasks: ? - name: create new file ? ? file: name=/data/newfile state=touch ? - name: create new user ? ? user: name=test2 system=yes shell=/sbin/nologin ? - name: install package ? ? yum: name=httpd ? - name: copy html ? ? copy: src=/var/www/html/index.html dest=/var/www/html/ ? - name: start service ? ? service: name-httpd state=started enable=yes #curl 192.168.30.101 welcome to magedu
Remote_user
task列表和action
tasks:任務列表
palybook如果中間有一個命令或腳本是錯誤的,不會執行后續的命令,可使用下面的方法解決:
? tasks:
? -name:run this command and ignore the result
? shell:/usr/bin/somecommand || /bin/true
? 或者使用ignore_errors來忽略錯誤信息:
? tasks:
? -name:run this command and ignore the result
? shell:/usr/bin/somecommand
? ignore_errors:true
運行playbook
運行playbook的方式
? ansible-playbook <filename.yml>…[options]
常見選項:
? –check 只檢測可能會發生的改變,但不真正執行操作
? —list-hosts列出運行任務的主機
? –limit主機列表 只針對主機列表中的主機執行
? -v顯示過程 -vv -vvv更詳細
playbook中handlers使用
?
- hosts: websrvs remote_user: root tasks: -name: install httpd ? yum: name=httpd state=present -name: install configure file copy: src=files/httpd.conf dest=/etc/httpd/conf/ notify: restart httpd #對應下面handlers -name: ensure apache is running service: name=httpd state=started enabled=yes handlers: -name: restart httpd service: name=httpd status=restarted ?
?
playbook中tags使用
有標簽的效果是可以單獨執行一個標簽
示例: - hosts: websrvs remote_user: root tasks: -name: install httpd ? yum: name=httpd state=present ? ? -name: install configure file copy: src=files/httpd.conf dest=/etc/httpd/conf/ tags:conf ? -name: ensure apache is running tags:service service: name=httpd state=started enabled=yes ansible-playbook -t conf httpd.yml ?
ansible websrvs -m service -a ‘name=httpd state=stoped’#停止服務
Ansible-playbook -t rshttpd httpd.yml
playbook中變量使用
變量的來源:
? 1、ansible setup facts遠程主機的所有變量都可直接調用
? 2、/etc/ansible/hosta中定義
示例: vim app.yml --- - hosts: appsrvs remote_user: root tasks: -name: set hostname hostname: name=www{{http_port}}.magedu.com
? 定義通用的分組的變量
? [websrvs]
? 192.168.30.101 http_port=81
? 192.168.30.101 http_port=81
? [websrvs:vars]
? nodename=www
? domainname=.magedu.com
? 3、通過命令行指定變量,優先級別最高
? ansible-playbook -e varname=value
變量的優先級,命令行的大于playbook大于主機清單的
示例: vim app.yml --- - hosts: appsrvs remote_user: root tasks: -name: install package yum: name={{ pkname1 }} -name: start service #ansible-playboook -e 'pkname=vsftpd' app.yml
? 4、在playbook中定義
? vars:
? -var1:value1
? -var2:value2
示例: vim app.yml --- - hosts: appsrvs remote_user: root vars: ? - pkname1: httpd ? - pkname2: tftpd tasks: -name: install package yum: name={{ pkname1 }} -name: install package yum: name={{ pkname2 }}
vim var.yml --- - hosts: websrvs remote_user: root ? tasks: ?
模版templates
示例: mkdir /etc/ansible/templates #cp nginx.conf/j2 #vim testtesttempl.yml nginx.conf/j2 --- - hosts: websrvs remote_user: root ? tasks: - name: install package ? yum: name=nginx - name: copy template ? template: src=nginx.cong.j2 dest=/etc/nginx/nginx.conf - name: start service ? service: name=nginx state=state=srarted enable=yes #ansible-playbook -C testtempl.yml 在其它的機器上測試 #ansible websrvs -m shell -a 'ss -ntpl' #查看端口 #ansible websrvs -m shell -a 'ps aux|grep nginx'
示例:
? #vim testtesttempl.yml nginx.conf/j2 --- - hosts: websrvs remote_user: root ? tasks: - name: install package ? yum: name=nginx - name: copy template ? template: src=nginx.cong.j2 dest=/etc/nginx/nginx.conf ? notify: restart service - name: start service ? service: name=nginx state=state=srarted enable=yes ? ? handlers: ? ? - name: restart service ? ? service: name=nginx.cong.j2
when
#vim testtesttempl.yml --- - hosts: websrvs remote_user: root vars: - http_port: 88 ? tasks: - name: install package ? yum: name=nginx - name: copy template for centos7 ? template: src=nginx.congf7.j2 dest=/etc/nginx/nginx.conf ? when: ansible_distribution_major_version == "7" ? notify: restart service - name: copy template for centos6 ? template: src=nginx.congf6.j2 dest=/etc/nginx/nginx.conf ? when: ansible_distribution_major_version == "6" ? notify: restart service - name: start service ? service: name=nginx state=srarted enable=yes ? ? handlers: - name: restart service ? service: name=nginx state=restarted
迭代:with_items
vim testtitem.yml --- - host: all remote_user: root ? tasks: - name: create some files ? file: name=/data/{{ item }} state=touch ? when: ansible_distribution_major_version == "7" ? with_items: ? ? - file1 ? ? - file2 ? ? - file3 - name=: install some packages ? yum: name={{ item }} ? with_items: ? ? - htop ? ? - sl ? ? - hping3 ? ? 在另外兩臺機器上驗證 #ansible all -m shell -a 'ls /data/ -l' #ansible all -m shell -a 'rpm -q htop sl hping3'
創建組
vim testitem2.yml --- - host: all remote_user: root ? tasks: - name: create some files ? group: name={{ item }} ? when: ansible_distribution_major_version == "7" ? with_items: ? ? - g1 ? ? - g2 ? ? - g3 #ansible-playbook testitem2.yml
創建3個組,并且創建3個用戶,并分別把三個用戶分別加到三個組里面
迭代嵌套子變量
vim tesitem3.yml --- - host: websrvs remote_user: root ? tasks: - name: create some groups ? group: name={{ item }} ? when: ansible_distribution_major_version == "7" ? with_items: ? ? - g1 ? ? - g2 ? ? - g3 ? - name: create some users ? ? user: name={{itwm.name}}group={{item.group}} ? ? with_items: ? ? ? -{ name: 'user1',group: 'g1' } ? ? ? -{ name: 'user2',group: 'g2' } ? ? ? -{ name: 'user3',group: 'g3' } #ansible-playbook tesitem3.yml #ansible all -m shell 'genten passwd'
for循環
利用for循環,生成一個語句塊,生成一些配置信息,監聽端口81,82,83
vim testfor.yml --- - hosts: websrvs remote_user: root vars: ports: ? - 81 ? - 82 ? - 83 tasks: - name: copy conf ? template: src=for1.conf.j2 dest=/data/for1.conf #vim for1.conf.j2 {% for port in ports %} server{ ? listen {{port}} } {% endfor %} ?
用字典的方式來改
vim testfor2.yml --- - hosts: websrvs remote_user: root vars: ports: ? - listen_port:81 ? - listen_port:82 ? - listen_port:83 tasks: - name: copy conf ? template: src=for1.conf.j2 dest=/data/for1.conf #vim /templatefor1.conf.j2 {% for port in ports %} server{ ? listen {{ port.listen_port }} } {% endfor %} #ansible-playbook testfor2.yml
嵌套
vim testfor2.yml --- - hosts: websrvs remote_user: root vars: ports: ? - web1: ? port: 81 ? name: web1.magedu.com ? rootdir: /data/website1 ? - web2: ? port: 82 ? name: web2.magedu.com ? rootdir: /data/website2 ? - web3: ? port: 83 ? name: web3.magedu.com ? rootdir: /data/website3 tasks: - name: copy conf ? template: src=for1.conf.j2 dest=/data/for1.conf #vim /templatefor3.conf.j2 {% for p in ports %} server{ ? listen {{ p.listen_port }} ? servername{{ p.name }} ? ducumentroot{{ p.rootdir }} } {% endfor %} #ansible-playbook testfor3.yml 注意調用的路徑問題, 在其它機器上查看 cat /data/for3.conf
if的用法
vim testfor2.yml --- - hosts: websrvs remote_user: root vars: ports: ? - web1: ? port: 81 ? #name: web1.magedu.com ? rootdir: /data/website1 ? - web2: ? port: 82 ? name: web2.magedu.com ? rootdir: /data/website2 ? - web3: ? port: 83 ? #name: web3.magedu.com ? rootdir: /data/website3 tasks: - name: copy conf ? template: src=for4.conf.j2 dest=/data/for4.conf #vim /templatefor4.conf.j2 {% for p in ports %} server{ ? listen {{ p.listen_port }} {% if p.name is defined %} ? ? servername{{ p.name }} {% endif %} ? ? ducumentroot{{ p.rootdir }} } {% endfor %} #ansible-playbook testfor4.yml
roles
roles能夠根據層次型結構自動裝載變量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。簡單來講,roles就是通過分別將變量、文件、任務、模版及處理器放置于單獨的目錄中,并可以便捷地include他們的一種機制。
部署nginx服務, 1、創建nginx用戶、 2、創建nginx組、 3、yum安裝包、 4、配置template:nginx 5、啟動服務。 #cd /etc/ansible/ #mkdir roles/{httpd,mysql memcache} #mkdir roles/nginx #規劃子目錄 一個放任務,一個放模版 #cd /nginx #mkfir tasks templates #cd tasks #vim group.yml - name: create group group: name=nginx gid=80 #vim user.yml - name: create user user: name=nginx uid=80 group=nginx system=yes shell=/sbin/nologin #vim yum.yml - name: install package yum: name:nginx #vim start.yml - name: start service service: name=nginx state=start enable=yes #vim restart.yml - name: restart service service: name=nginx state=start enable=yes ? #cp /etc/nginx/conf.d worker_processes {{ ansible_processor_vcpus+2 }}; vim templ.yml - name: copy conf template: src=nginx.cong.j2 dest=/etc/nginx/nginx.conf # vim main.yml - include: group.yml - include: user.yml - include: yum.yml - include: templ.yml - include: start.yml # 切換到和roles平級的目錄 #vim nginx_role.yml - hosts: websrvs remote_user: root roles: ? ? role: nginx #ansible-playbook -C nginx_role.yml
定義httpd別的角色
cd roles/httpd/ mkdir tasks cd tasks ls #創建apache用戶 #vim user.yml - name: create user user: name=apache system=yes shell=/sbin/nologin #vim copyfile.yml - name: copy files copy: src=/etc/httpd.conf dest=/data/ owner=apache #vim main.yml - include: user.yml - include: copyfile.yml #vim httpd_role.yml - hosts: websrvs remote_user: root ? roles: - httpd #ansible-playbook httpd_role.yml ?
在一個角色中跨項目調用另一個角色或著兩個角色都使用。假如一個提供web服務,一個提供php服務。
Ansible all -m shell -a ‘userdel nginx’
#vim some_role.yml - hosts: websrvs remote_user: root ? roles: - role: httpd - role: nginx 引用另外的角色,比如在nginx中調用httpd的copy.yml #vim roles/nginx/tasks/main.yml - include: group.yml - include: user.yml - include: yum.yml - include: templ.yml - include: start.yml - include: roles/httpd/tasks/copyfile.yml #ansible-playbook nginx_role.yml
roles playbook tags使用
在角色中加標簽tags
- hosts: websrvs remote_user: root roles: ? - {{ role: httpd,tags:['web','httpd']}} ? - {{ role: nginx,tags:['web','nginx']}} ? - {{ role: app,tags:"app"}} #cp -r nginx/ app/ #ansible-playbook -t web some_role.yml #只運行web標簽
- hosts: all remote_user: root roles: ? - { role: httpd,tags:['web','httpd']} ? - { role: nginx,tags:['web','nginx'],when: ansible_distrubution_major_version == "7"}} ? - { role: app,tags:"app"} ? #ansible-playbook some_role.yml #只運行web標簽
綜合實驗:
以httpd為例,創建app用戶 mkdir root/anxible/roles/app mkdir tasks templates vars handers files cd tasks #vim group.yml - name: create group group: name=app system=yes gid=123 ? #vim user.yml - name: create user user: name=app group=app system=yes shell=/sbin/nologin uid=123 #vim yum.yml - name: install package yum: name=httpd #cp /etc/http/conf/httpd.conf ../templates/httpd.j2 vim ../templates/httpd.j2 listen {{ ansible_processor_vcpus*10 }} user {{ username }} group {{ group }} #vim 定義變量 username: app groupname: app #vim tasks/templates.yml - name: copy conf template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf notify: restart service #vim handlers/restart.yml - name: restart service service: name=httpd state=restarted #vim task - name: start service service: name=httpd state=started enable=yes #tree #touch files/vhosts.conf #vim - name: copy config copy: src=vhosts.conf dest=/etc/httpd/conf.d/ owner=app ? #vim roles/main.yml - include: group.yml - include: user.yml - include: yum.yml - include: templ.yml - include: copu.yml - include: start.yml #ansible-playbook -C app.yml ? ?
tips
rpm -ql memcached
cat /etc/sysconfigmemcached
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/100169