可使用自定義主機組的方式定義hosts,這樣能夠減小重複任務的代碼(不推薦使用,由於自定義主機組的話,劇本中的all將沒法使用) ansible和saltstack都要使用yml語法,yml語法中最好使用2468空格 service和systemd啓動服務,不支持列表的形式(只能用循環了) [root@m01 ~]# hostname m01 [root@m01 ~]# hostname -I 10.0.0.61 172.16.1.61 [root@m01 ~]# hostnamectl set-hostname www.m01.com [root@www ~]# #顯示不完整主機名 "{{ ansible_fqdn }}" 不管是自定義變量仍是系統變量的調用,寫到劇本中的路徑裏的話不要加引號,單獨的調用須要加引號
1.經過命令行進行變量定義
2.在play文件中進行變量定義
3.經過Inventory主機信息文件中進行變量定義php
變量優先級:命令行 > playbook文件 > Inventory文件html
playbook中vars定義變量java
playbook變量能夠經過多種方式進行定義,最簡單的方式就是在playbook的開頭經過vars進行定義。(以列表或者ad-hoc的方式定義變量)python
#方法一: - hosts: web_group vars: packages: - httpd - mariadb-server - php - php-mysql - php-pdo tasks: - name: Install httpd mariadb php Server yum: name: "{{ packages }}" #方法二:(#name不支持列表!!!) - hosts: web_group vars: - web_server: httpd - db_server: mariadb-server - php_server: - php - php-mysql - php-pdo tasks: - name: Install httpd mariadb php Server yum: name: - "{{ web_server }}" - "{{ db_server }}" - "{{ php_server }}" # "{{ php_server }}" ,ansible中裏面空格加不加都行,saltstack裏面必須加空格,可是引號必需要加 #變量列表只能在支持列表的模塊中使用 #file模塊不能使用變量列表 [root@m01 ~]# vim ansible/cs.yml - hosts: web01 vars: dir: a tasks: - name: create dir file: path: /root/{{ dir }} state: directory
使用vars_file定義變量mysql
剛纔咱們學到在playbook中使用vars
定義變量,有一個缺陷,就是其餘的play沒法使用該變量。因此咱們能夠採起第二種定義變量的方式,在vars_file
中定義變量。nginx
#定義階段 [root@m01 ~]# vim /vars/vars1.yml web_server: httpd [root@m01 ~]# vim /vars/vars2.yml db_server: mariadb-server #或者以列表形式定義 web_server: - tree - unzip #調用階段 - hosts: web_group vars_files: /root/vars1.yml tasks: - name: Install httpd mariadb php Server yum: name: "{{ web_server }}" #調用階段(name儘可能不要使用列表項) - hosts: web_group vars_file: - /root/vars1.yml - /root/vars2.yml tasks: - name: Install httpd mariadb php Server yum: name: - "{{ web_server }}" - "{{ db_server }}" #獲取Ansible內置變量(內外變量結合) - hosts: web_group vars: - remote_ip: "{{ ansible_default_ipv4['address'] }}" - remote_hostname: "{{ ansible_fqdn }}" tasks: - name: Touch IP File file: path: /root/{{ remote_ip }} state: touch - name: Touch Hostname File file: path: /root/{{ remote_hostname }} state: touch
在Inventory中定義變量web
注意:在Inventory中定義變量,主機的變量要高於主機組的變量,因此該方法不推薦使用,容易將環境弄亂。(主機變量在動做中調用,主機組變量在hosts中調用)sql
#定義階段 [root@m01 ~]# vim /etc/ansible/hosts [web_group] web01 ansible_ssh_host=10.0.0.7 web02 ansible_ssh_host=10.0.0.8 #主機的定義變量 [web_group:vars] web_server=httpd index_file=index.html #主機組的定義變量 [rsync_server:children] web_group backup_group #調用階段 - hosts: web_group tasks: - name: Install httpd Server yum: name: "{{ web_server }}" - name: Create Index File file: path: /tmp/{{ index_file }} state: touch
官方推薦變量定義shell
以前的幾種變量定義都不是很好用,比較好用的是在Ansible項目目錄下建立兩個變量目錄:vim
host_vars
:優先級高,目錄名和目錄位置是固定的(項目目錄下)
group_vars
:優先級低
切記,目錄名字必定要一致,不能作任何修改。
執行的yml文件在哪,哪就是該yml文件的項目目錄
1.主機組定義變量,對某組來講能夠調用
#定義階段 [root@m01 ~]# mkdir group_vars #切記定義變量所在的文件必須以組名爲文件名(組名是主機組變量調用的令牌),包含主機變量 #組名必須是主機清單中的標籤名 [root@m01 ~]# vim /root/group_vars/web_group web_server: httpd (#名值對) #調用階段 - hosts: web_group tasks: - name: Install httpd Server yum: name: "{{ web_server }}"
若是我想要全部組都能使用變量,該如何作?
2.主機定義變量,對某主機來講,能夠調用
#定義階段 [root@m01 ~]# mkdir host_vars #切記定義變量的文件必須以主機名爲文件名 [root@m01 ~]# vim /root/host_vars/web01 web_server: nginx #調用階段 - hosts: web01 tasks: - name: Install httpd Server yum: name: "{{ web_server }}"
命令行定義變量(優先級最高)
經過命令行覆蓋變量,Inventory的變量會被playbook文件中覆蓋,這兩種方式的變量都會被命令行直接指定變量所覆蓋,使用--extra-vars
或者-e
設置變量
#調用 [root@m01 ~]# vim test.yml - hosts: web_group tasks: - name: Install httpd Server yum: name: "{{ web_server }}" #定義階段 [root@m01 ~]# ansible-playbook test.yml -e "web_server=vsftpd" [root@m01 ~]# vim test.yml - hosts: web_group tasks: - name: Install httpd Server yum: name: - "{{ web_server }}" - "{{ db_server }}" #定義階段 [root@m01 ~]# ansible-playbook test.yml -e "web_server=vsftpd" -e "db_server=mariadb-server"
變量優先級測試
[root@m01 ~]# vim touch_file.yml - hosts: web_group vars: filename: vars #2 vars_files: - ./vars1.yml #1 tasks: - name: Touch vars File file: path: /root/{{ filename }} #不能帶引號 state: directory #定義vars_files [root@m01 ~]# vim vars1.yml filename: vars_files #定義group_vars中的web_group #3 [root@m01 ~]# vim group_vars/web_group filename: group_vars_web_group #定義host_vars中的web01 [root@m01 ~]# vim host_vars/web01 #4 filename: host_vars #定義group_vars中的all [root@m01 ~]# vim group_vars/all filename: group_vars_all #測試命令行 [root@m01 ~]# ansible-playbook touch_file.yml -e "filename=vars_command" #測試全部(依次刪除劇本中同一變量的指定) [root@m01 ~]# ansible-playbook touch_file.yml
爲何要學變量註冊?
當absible
的模塊在運行以後,其實都會返回一些result
結果,就像是執行腳本,咱們有的時候須要腳本給咱們一些return
返回值,咱們才知道,上一步是否能夠執行成功,
可是...默認狀況下,ansible
的result
並不會顯示出來,因此,咱們能夠把這些返回值存儲到變量中,這樣咱們就能經過調用對應的變量名,從而獲取到這些result
,
這種將模塊的返回值,寫入到變量中的方法被稱爲變量註冊
那麼咋樣將返回值註冊到變量,以下一個playbook
示例:
#編輯劇本 [root@m01 ~]# vim register.yml - hosts: web_group tasks: - name: Test Register Vars shell: "ls -l /" #查看執行結果 [root@m01 ~]# ansible-playbook register.yml
如上執行結果可見,當咱們使用shell模塊執行ls -l /
時,ansible給咱們返回的只有changed咱們沒法看到執行以後的結果,因此此時咱們須要使用到變量註冊
playbook以下:
register:註冊
#編輯playbook [root@m01 ~]# vim register.yml - hosts: web_group tasks: - name: Test Register Vars shell: "ls -l /" register: list_dir #註冊變量 - name: Return Result debug: var=result verbosity=0 #調試輸出的結果 msg: "{{ list_dir }}" #輸出 # debug 調試模塊,用於在調試中輸出信息 經常使用參數: msg:調試輸出的消息 var:將某個任務執行的輸出做爲變量傳遞給debug模塊,debug會直接將其打印輸出 verbosity:debug的級別(默認是0級,所有顯示) #查看執行結果 [root@m01 ~]# ansible-playbook register.yml #只輸出本身想要的內容 [root@m01 ~]# vim register.yml - hosts: web_group tasks: - name: Test Register Vars shell: "ls -l /" register: list_dir - name: Return Result debug: msg: "{{ list_dir.stdout_lines }}" #msg: "{{ list_dir['stdout_lines'] }}" #查看結果 [root@m01 ~]# ansible-playbook register.yml #debug模塊經常使用參數 msg: #調試輸出的消息 var: #將某個任務執行的輸出做爲變量傳遞給debug模塊,debug會直接將其打印輸出 verbosity: #debug的級別(默認是0級,所有顯示) debug #偶爾調試
[root@www ~]# vim cs.yml - hosts: web01 tasks: - name: Test Register Vars shell: "ls -l /etc/nginx" #註冊變量 register: list_dir #忽略錯誤 ignore_errors: yes #輸出shell指定的信息 - name: return debug: msg: "{{ list_dir.stdout_lines }}" #解壓 - name: jieya nginx.pkg unarchive: src: /root/nginx_php.tar.gz dest: /root when: list_dir.rc != 0 #經過變量的註冊,判斷shell的執行結果(rc) #卸載 - name: shanchu shell: yum remove -y php-common #忽略錯誤 ignore_errors: yes #安裝 - name: install shell: "cd /root && yum localinstall -y *rpm" ignore_errors的做用就是忽略錯誤步驟,繼續執行下一步(錯誤輸出仍是會輸出)
像是本身作字典,使用 [' '] 或者 . 調用下一級
#編輯變量文件 [root@m01 ~]# vim vars_file.yml lamp: framework: web_package: httpd db_package: mariadb-server php_package: php lnmp: framework: web_package: nginx db_package: mysql php_package: php lnmt: framework: web_package: nginx db_package: mysql java_package: tomcat #編輯playbook文件 [root@m01 ~]# vim test.yml - hosts: web_group vars_files: ./vars_file.yml tasks: - name: Install LAMP httpd yum: name: "{{ lamp.framework.web_package }}" - name: Install LAMP mariadb-server yum: name: "{{ lamp.framework.db_package }}" - name: Install LAMP php yum: name: "{{ lamp.framework.php_package }}" #官方推薦寫法 [root@m01 ~]# vim test.yml - hosts: web_group vars_files: ./vars_file.yml tasks: - name: Install LAMP httpd yum: name: "{{ lamp['framework']['web_package'] }}" - name: Install LAMP mariadb-server yum: name: "{{ lamp['framework']['db_package'] }}" - name: Install LAMP php yum: name: "{{ lamp['framework']['php_package'] }}" #執行playbook [root@m01 ~]# ansible-playbook test.yml #層級調用變量也只能調用一次
Ansible facts是在被管理主機上經過Ansible自動採集發現的變量。facts
包含每臺特定的主機信息。好比:被控端的主機名、IP地址、系統版本、CPU數量、內存狀態、磁盤狀態等等。
facts使用場景
1.經過facts
緩存檢查CPU,來生成對應的nginx配置文件
2.經過facts
緩存檢查主機名,生成不一樣的zabbix配置文件
3.經過facts
緩存檢索物理機的內存大小來生成不通的mysql配置文件
綜上所述的Ansible facts相似於saltstack
中的grains
對於作自動化的小夥伴是很是有用滴。
facts基本用法
#編輯 [root@m01 ~]# vim facts.yml - hosts: web_group tasks: - name: Get Host Info debug: msg: > Hostname "{{ ansible_fqdn }}" and IP "{{ ansible_default_ipv4.address }}" #執行 [root@m01 ~]# ansible-playbook facts.yml #msg: > 能夠識別中文,打印出變量
關閉facts
[root@m01 ~]# vim facts.yml - hosts: web_group gather_facts: no #關閉信息採集 tasks: #通常在用不到變量的劇本中才會使用,提升生產效率
facts生成zabbix配置文件,生成nginx的配置文件,生成saltstack配置文件
- hosts: web_group tasks: - name: copy zabbix agent conf template: src: ./zabbix_agentd.conf dest: /tmp/zabbix_agentd.conf #template模塊,能夠將劇本中的主機信息被 腳本中的變量調用 ,語法和copy相似 #該模塊適用於作配置文件的修改
facts生成mysql配置文件
- hosts: db_group tasks: - name: Install mysql server yum: name: mariadb-server state: present - name: copy mysql conf template: src: ./my.cnf dest: /etc/my.cnf [root@m01 ~]# vim /etc/my.cnf [mysqld] basedir=/usr datadir=/var/lib/mysql/ socket=/var/lib/mysql/mysql.sock log_error=/var/log/mariadb/mariadb.log innodb_buffer_pool_size={{ ansible_memtotal_mb * 0.8 }} #ansible變量支持計算
需求:使用ansible在web機器建立「/backup/web01_172.16.1.31_2020-6-11」目錄
#劇本中支持顯示子信息 [root@www ~]# vim bl.yml - hosts: web01 tasks: - name: ip file: path: /backup/{{ ansible_fqdn }}_{{ ansible_default_ipv4['address'] }}_{{ ansible_date_time['date'] }} state: directory recurse: yes
[root@www ~]# ansible web01 -m setup -a 'filter=ansible_default_ipv4' web01 | SUCCESS => { "ansible_facts": { "ansible_default_ipv4": { "address": "10.0.0.7", "alias": "eth0", "broadcast": "10.0.0.255", "gateway": "10.0.0.2", "interface": "eth0", "macaddress": "00:0c:29:6e:25:1b", "mtu": 1500, "netmask": "255.255.255.0", "network": "10.0.0.0", "type": "ether" }, "discovered_interpreter_python": "/usr/bin/python" }, "changed": false } #命令行不支持顯示子信息 [root@www ~]# ansible web01 -m setup -a 'filter=ansible_default_ipv4.address' web01 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false }