你需要會的ansible-playbook劇本這6種變量
#變量作用
#根據需求靈活修改,如:需要安裝不同版本號的服務,或進行版本升級回退等
1.通過vars定義變量
#1.1、定義一個變量 version: 1.1.2 #定義多個變量 vars: - v1: value - v2: value #1.2、調用變量 #在{{}}中直接填寫變量名 {{ v1 }}
#示例一:添加用戶
[root@k8s-master yaml]# cat a4.yml - hosts: k8s-node vars: - user: demo16 tasks: - name: create{{user}} user: name={{user}} #語法檢查 [root@k8s-master yaml]# ansible-playbook --syntax-check a4.yml playbook: a4.yml #執行 [root@k8s-master yaml]# ansible-playbook a4.yml #查看效果 [root@node1 ~]# id demo16 uid=1009(demo16) gid=1010(demo16) groups=1010(demo16)
#示例二:安裝http和ftp服務,使用變量的話可以方便後續的安裝不同版本號
#第一種寫法 [root@game yaml]# cat vars1.yml - hosts: k8s-node vars: - web_packge: httpd-2.4.6 - ftp_packge: vsftpd-3.0.2 tasks: - name: installed {{ web_packge }} {{ ftp_packge }} yum: name: - "{{ web_packge }}" - "{{ ftp_packge }}" state: present #第二種寫法 #提示:如果要裝多個的話建議使用第一種方法,減少語句 [root@game yaml]# cat vars2.yml - hosts: k8s-node vars: - web_packge: httpd-2.4.6 - ftp_packge: vsftpd-3.0.2 tasks: - name: installed {{ web_packge }} Packages yum: name={{ web_packge }} state=present - name: installed {{ ftp_packge }} Packages yum: name={{ ftp_packge }} state=present #進行語法檢查,然後執行 [root@game yaml]# ansible-playbook --syntax-check vars2.yml [root@game yaml]# ansible-playbook vars2.yml
2.通過定義一個變量文件,使用playbook進行調用
[root@game yaml]# cat vars_public.yml web_packge: httpd-2.4.6 ftp_packge: vsftpd-3.0.2 #進行調用:使用vars_files #提示:因為寫的文件是在同一級目錄下,可以使用相對路徑進行調用文件 [root@game yaml]# cat vars1.yml - hosts: k8s-node vars_files: ./vars_public.yml tasks: - name: installed {{ web_packge }} {{ ftp_packge }} yum: name: - "{{ web_packge }}" - "{{ ftp_packge }}" state: present
3.通過inventory主機清單進行變量定義
#第一種寫法 [root@k8s-master yaml]# tail -n 4 /etc/ansible/hosts [k8s-node] 192.168.86.132 user=demo13 192.168.86.133 user=demo14 [root@k8s-master yaml]# cat a3.yml - hosts: k8s-node tasks: - name: create{{user}} user: name={{user}} #執行劇本 [root@k8s-master yaml]# ansible-playbook a3.yml #查看效果 [root@node1 ~]# id demo13 uid=1007(demo13) gid=1008(demo13) groups=1008(demo13) [root@node1 ~]# id demo14 id: demo14: no such user #node1是創建demo13,demo14是在node2創建的,所以在node1查看的時候會顯示沒有找到這個用戶 #第二種寫法 [root@k8s-master yaml]# tail -n 8 /etc/ansible/hosts [k8s-node] 192.168.86.132 192.168.86.133 [k8s-node:vars] user=demo15 [root@k8s-master yaml]# cat a3.yml - hosts: k8s-node tasks: - name: create{{user}} user: name={{user}} #執行劇本 [root@k8s-master yaml]# ansible-playbook a3.yml #查看效果 [root@node1 ~]# id demo15 uid=1008(demo15) gid=1009(demo15) groups=1009(demo15)
4.通過執行playbook時使用-e參數指定變量
#示例
[root@k8s-master yaml]# pwd /etc/ansible/yaml [root@k8s-master yaml]# cat a2.yml - hosts: k8s-node tasks: - name: create{{user}} user: name={{user}} #檢查語法有沒有錯誤,沒有錯誤之後執行 [root@k8s-master yaml]# ansible-playbook --syntax-check a2.yml playbook: a2.yml [root@k8s-master yaml]# ansible-playbook -e 'user=demo11' a2.yml #查看效果 [root@node1 ~]# id demo11 uid=1006(demo11) gid=1007(demo11) groups=1007(demo11)
5.變量註冊register
#應用場景:把命令執行的結果存到register變量裏面,然後使用debug模塊輸出相關信息 #示例 - name: Check Http Services shell: netstat -untpl |grep httpd register: check_http_service #提示:將shell命令執行的結果存到變量check_http_service中 - name: debug: msg: "{{ check_http_service.stdout_lines }}" #提示1:通過debug模塊輸出信息,如果想輸出部分內容,使用變量.方法 #提示2:debug模塊更多使用可使用ansible-doc debug查看幫助信息 #基本步驟總結 1.使用shell執行命令 2.將執行命令的結果存到變量中 3.通過debug模塊,msg方法,輸出變量所有的內容,如果想輸出部分內容,使用變量.方法
#例子:檢查http服務是否運行,結合when進行判斷,如果返回結果不等於0,那麼就啟動http服務
[root@game yaml]# cat regis.yml - hosts: k8s-server tasks: - name: Check Httpd Services command: netstat -untpl |grep httpd ignore_errors: yes register: check_httpd - name: Start Httpd service: name: httpd state: started when: check_httpd.rc != 0
6.ansible facts變量
主要用來採集被控制端的一些狀態指標,如:主機名,IP,內存、磁盤狀態等 默認情況的facts變量名已經定義好了,只需採集被控制端的信息,然後傳遞至facts變量即可 #應用場景 1.獲取被控端主機名,生成不同的zabbix配置文件 2.獲取被控端CPU信息,生成不同的nginx配置文件 3.獲取被控端內存狀態信息,生成不同的memcached配置文件
#示例1:獲取被控端主機名IP地址,通過debug模塊輸出
[root@game yaml]# cat facts1.yml - hosts: k8s-server tasks: - name: Output Client Hostname IP debug: msg: echo Client "{{ ansible_fqdn }}" and "{{ ansible_default_ipv4.address }}" #執行效果 [root@game yaml]# ansible-playbook --syntax facts1.yml #語法檢查 playbook: facts1.yml [root@game yaml]# ansible-playbook facts1.yml #執行 TASK [Output Client Hostname IP] ********************************************************************** ok: [192.168.228.130] => { "msg": "echo Client \"web01\" and \"192.168.228.130\"" } ok: [192.168.228.131] => { "msg": "echo Client \"web02\" and \"192.168.228.131\"" }
#示例二:使用facts變量安裝zabbix-agent客戶端
#1.首先準備一個zabbix_agentd.conf配置文件,Hostname需要寫成ansible_fqdn自己識別 [root@game yaml]# pwd /etc/ansible/yaml [root@game yaml]# cat zabbix_agentd.conf |grep Hostname Hostname= {{ ansible_fqdn }} #2.編寫劇本 [root@game yaml]# cat zab-age.yml - hosts: k8s-server tasks: - name: Zabbix-Agent Configure template: src: ./zabbix_agentd.conf dest: /etc/zabbix/zabbix_agentd.conf #3.執行劇本 #首先先檢查語法,然後接着執行 [root@game yaml]# ansible-playbook --syntax zab-age.yml [root@game yaml]# ansible-playbook zab-age.yml #4.到被控制端查看效果 [root@web01 ~]# cat /etc/zabbix/zabbix_agentd.conf |grep Hostname Hostname= web01 #可以看到主機名已經修改成了web01