復盤內容:鏈接指北
查看ansible命令文檔
ansible-doc -s systemd
一、劇本
何為劇本:
playbook 文件,用于長久保存并且實現批量管理,維護,部署的文件. 類似于腳本存放命令和變量
劇本yaml格式,yaml格式的文件:空格,冒號.
劇本未來我們批量管理,運維必會的內容.
ans劇本 | ans ad-hoc | |
---|---|---|
共同點 | 批量管理,使用模塊 | 批量管理,使用模塊 |
區別 | 重復調用 | 不是很方便,不容易重復 |
應用建議(應用場景) | 部署服務,多個步驟的任務 | 測試模塊,臨時性任務 |
案例:腳本書寫格式
- hosts: alltasks:- name: 01 打開冰箱門shell: echo 1 >>/tmp/bingxiang.log- name: 02 把大象放入冰箱shell: echo 2 >>/tmp/bingxiang.log- name: 03 關上冰箱的門shell: echo 3 >>/tmp/bingxiang.log
#書寫劇本 注意以.yml或.yamt結尾 01.show.yml
#-i 指定主機清單文件,如果不寫默認調用/etc/ansible/hosts
ansible-playbook -i hosts 01.show.yml
執行的時候有奶牛:
可以刪除軟件或修改ansible.cfg配置進行關閉 #nocows =1去掉注釋即可
書寫Ans playbook注意事項:
- 同一個層級的內容對齊的0
- 不同層級的通過2個空格對齊
- 不能使用tab鍵
二、劇本案例
1、案例01: 創建目錄并分發文件
創建目錄/server/files/etc/hosts文件并且發送過去/server/files
- hosts: alltasks:- name: 01 創建目錄/server/filesfile: path=/server/files state=directory- name: 02 分發文件copy: src=/etc/hosts dest=/server/files
2、案例02:分發軟件包,安裝軟件包,啟動服務
zabbix-agent軟件包(下載)—》 安裝軟件包—》配置(略)—》啟動開機自啟動
- hosts: alltakes: - name: 01 軟件包下載get_url: url: https://mirrors.aliyun.com/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent-6.0.13-release1.el7.x86_64.rpmdest: /tmp/validate_certs: no- name: 02 安裝軟件包yum:name:/tmp/zabbix-agent-6.0.13-release1.el7.x86_64.rpmstate=insatlled- name: 03 配置 debug:msg: "進行配置zabbix-agent"- name: 04 啟動systemd:name: zabbix-agentenabled: yesstate: started
ansible all -m shell -a 'ps -ef | grep zabbix'
不能使用
-m command
。在 Ansible 的命令模塊中,你需要以單個字符串的形式指定要執行的命令,而不能使用管道符號|
。
3、案例03:nfs服務
- nfs服務端:在backup上部署nfs服務,共享/backup-nfs目錄,all_squash,匿名用戶:nfsnobody
- nfs客戶端:web掛載 /ans-upload目錄掛載nfs服務端共亭的/backup-nfs(永久掛載)
寫劇本必備-列出流程
服務端流程:
- 部署nfs-utils,rpcbind
- 修改配置文件
- 創建共享目錄并改所有者
- 啟動服務rpcbind,nfs(注意順序)
客戶端流程:
- 安裝nfs-utils2.
- 掛載與永久掛載
- hosts: nfstasks: - name: 01 部署nfs-utils,rpcbindyum: name: nfs-utilsstate: installed- name: 02 修改配置文件lineinfile:path: /etc/exportsline: "/backup-nfs/ 10.0.0.0/24(rw)"create: true- name: 03 創建共享目錄并且修改權限file: path: /backup-nfs/state: directoryowner: nfsnobodygroup: nfsnobody- name: 04-1 依次啟動服務rpcsystemd: name: rpcbindenabled: yesstate: started- name: 04-2 依次啟動服務nfssystemd: name: nfsenabled: yesstate: started
- hosts: webtasks: - name: 01 部署nfs-utils,rpcbindyum: name: nfs-utilsstate: installed- name: 02 永久掛載mount:src: 10.0.0.31:/backup-nfs/path: /data/fstype: nfsstate: mounted
三、Ansible中的變量
變量無處不在,在ans中大部分地方都可以定義變量.
比較常用的創建變量的地方:劇本中,類似于功能,共用的變量文件.
可以定義變量的地方 | 說明 |
---|---|
在劇本文件中定義 | 比較常用。僅僅限于當前的play使用, |
register變量(注冊變量) | ip= hostname -I ,實現腳本中反引號的功能,可以獲取命令結果 |
變量文件,根據主機清單分分組進行定義變量 | 如果多個劇本,使用相同的變量,大型的劇本roles |
inventory主機清單中定義變量 | 未來可以用于批量修改主機使用,其他很少用了 |
命令號中 | 幾乎不用 |
facts變量 | 一般用于獲取主機基本信息:ip,主機名,系統(centos/ubuntu)如果不需要可以關閉,用于加速劇本的執行 |
3.1、劇本中的變量
在劇本play中定義變量應用:
- 僅僅在當前play生效.
- 一般用來存放路徑,用戶名,ip地址,類似于之前使用的腳本.
- 注意引號使用.
使用變量的時候如果變量是某個選項的開頭,則變量引用的時候需要加上雙引號.
#dir就是變量,變量的內容:右邊的內容
?
- hosts: allvars:dir: /oldboy/lidao/upload/tasks:- name: mkdirfile:path: "{{ dir }}"state: directory
面試常問:使用變量的時候如果變量是某個選項的開頭,則變量引用的時候需要加上雙引號.
3.2、共用變量-變量文件
[root@m01 /server/scripts/playbook]# cat 05.vars.yml
- hosts: allvars_files: ./vars.ymltasks:- name: filefile:path: "{{ dir }}/{{ user }}-{{ file }}"state: touch
3.3、共用變量-根據主機組使用變量
group_vars根據主機清單的分組去匹配
group_vars/lb/vars.yml #存放lb組的變量web/vars.yml #存放web組的變量data/vars.yml #存放xxx組的變量all/vars.yml #所有主機共用的變量
未來一般使用all分組即可,把所有變量存放在一起,供劇本使用
group_vars/lb/均為目錄,vars.yml為文件
[root@m01 ~]# cat vars.ymluser: www
nfs_dir: /nfs_backup
web_mount_dir: /web_nfs
nfs_server: 172.16.1.41
rsync_pass: 1
3.4、facts變量
運行劇本的時候ans會收集每個主機的本信息,這些信息形成的變量叫做facts變量,
facts變量setup模塊獲取
#獲取web主機上的setup模塊變量
ansible -i /etc/ansible/hosts web -m setup
常用fact變量
ansible_hostname #主機名
ansible_memtotal_mb #內存大小(總計) 單位mb
ansible_processor_vcpus #cpu數量
ansible_default_ipv4.address #默認的網卡ip eth0
ansible_distribution #系統發行版本名字
ansible_processor_cores #cpu核心數
3.5、register變量注冊變量
本質上就是用來實現腳本中的反引號功能
用戶通過命令獲取的內容都存放到Register變量
- hosts: alltasks:- name: get dateshell: date +%Fregister: result- name: print result 變量內容debug:msg: |"register變量的全部內容是:{{result.stderr }}""register變量的精確的內容是:“{{result.stdout}}”
register注冊變量:
變量.stdout 獲取輸出即可.json形式數據.
key: value
鍵: 值
變量: 內容
date +%F
stdout部分是我們想要的內容.
register變量result.
result.stdout #std standard output 標準輸出.符號說明
msg:中的|表示下面的內容是多行. |也可以用于其他模塊中.