1.ansible中的迭代循環
創建目錄和文件
vim createfile.yaml?
????????- name: create file playbook
????????? hosts: all
????????? tasks:
????????? ? - name: create file
????????? ? ? file:?
????????? ? ? ? path: "/mnt/{{item['name']}}"
????????? ? ? ? state: "{{item['type']}}"????????? ? ? loop:?
????????? ? ? ? - name: westosfile1
????????? ? ? ? ? type: touch
????????? ? ? ? - name: westosdir1
????????? ? ? ? ? type: directory
????????? ? ? ? - name: westosfile3
????????? ? ? ? ? type: touch
????????? ? ? ? - name: westosdir2
????????? ? ? ? ? type: directory
????????? ? ? ? - name: westosfile5
????????? ? ? ? ? type: touch
ansible-playbook createfile.yaml
2.迭代循環項目
安裝vsftpd、apache、dns并且開啟服務,關閉對應的火墻服務
vim setup.yaml
- name: setup vsftpd apache dns
? hosts: all
? vars:
? ? services:
? ? ? - name: vsftpd
? ? ? ? service: vsftpd
? ? ? ? firewall_name: ftp
? ? ? - name: httpd
? ? ? ? service: httpd
? ? ? ? firewall_name: http
? ? ? - name: bind
? ? ? ? service: named
? ? ? ? firewall_name: dns
? tasks:
? ? - name: install services
? ? ? dnf:?
? ? ? ? name: "{{item['name']}}"
? ? ? ? state: present
? ? ? loop:?
? ? ? ? "{{services}}"
? ? - name: start services
? ? ? service:
? ? ? ? name: "{{item['service']}}"
? ? ? ? enabled: yes
? ? ? ? state: started
? ? ? loop:
? ? ? ? "{{services}}"
? ? - name: setup firewalld
? ? ? firewalld:
? ? ? ? service: "{{item['firewall_name']}}"
? ? ? ? state: enabled
? ? ? ? permanent: yes
? ? ? ? immediate: yes
? ? ? loop:
? ? ? ? "{{services}}"
ansible-playbook setup.yaml?
3.ansible中的條件語句
= | value == " 字符串 ",value == 數字 |
< | value < 數字 |
> | value > 數字 |
<= | value <= 數字 |
>= | value >= 數字 |
!= | value != 數字 |
is defined value | value is defined 變量存在 |
is not defined | value is not defined 變量不存在 |
in | value is in value 變量為 |
not in | value is not in value 變量不為 |
bool變量 為true | value? ? ? ? ? ? ? ? ? ? ? ? ? ? ?value的值為true |
bool變量 false | not value? ? ? ? ? ? ? ? ? ?value的值為false |
value in value2 | value的值在value2列表中 |
檢測文件是否存在的練習
vim check_file.yaml
- name: check file playbook
? hosts: all
? tasks:
? ? - name: check file
? ? ? shell: test -e /mnt/westosfile
? ? ? ignore_errors: yes? ? ? ? ? ? ? ?-------------------》將會忽略任務失敗使得下面的任務繼續運行
? ? ? register: check_state? ? - name: file is not exist
? ? ? debug:
? ? ? ? msg: file is not exist
? ? ? when: check_state.rc != "0"? ? - name: file exist
? ? ? debug:
? ? ? ? msg: file exist
? ? ? when: check_state.rc == "0"
ansible-playbook check_file.yaml?
vim setup_firewalld.yaml
- name: setup vsftpd apache dns
? hosts: all
? vars:
? ? services:
? ? ? - name: vsftpd
? ? ? ? service: vsftpd
? ? ? ? firewall_name: ftp
? ? ? - name: httpd
? ? ? ? service: httpd? ? ? ? ? ? ? ? ? ? ?-----------------》此firewall_naem
? ? ? - name: bind
? ? ? ? service: named
? ? ? ? firewall_name: dns
? tasks:
? ? - name: install services
? ? ? dnf:?
? ? ? ? name: "{{item['name']}}"
? ? ? ? state: present
? ? ? loop:?
? ? ? ? "{{services}}"
? ? - name: start services
? ? ? service:
? ? ? ? name: "{{item['service']}}"
? ? ? ? enabled: yes
? ? ? ? state: started
? ? ? loop:
? ? ? ? "{{services}}"
? ? - name: setup firewalld
? ? ? firewalld:
? ? ? ? service: "{{item['firewall_name']}}"
? ? ? ? state: enabled
? ? ? ? permanent: yes
? ? ? ? immediate: yes
? ? ? loop:
? ? ? ? "{{services}}"
? ? ? when: item['firewall_name'] is defined? ? ? ? ---------》當firewall_name存在時才執行此任務
ansible-playbook setup_firewalld.yaml
? tasks:
? ? - name: install services
? ? ? dnf:?
? ? ? ? name: "{{item['name']}}"
? ? ? ? state: present
? ? ? loop:?
? ? ? ? "{{services}}"? ? ? when:? ?inventory_hostname in groups['westos1']? ?-----------》只在westos1列表中的主機中執行此任務
? tasks:
? ? - name: install services
? ? ? dnf:?
? ? ? ? name: "{{item['name']}}"
? ? ? ? state: present
? ? ? loop:?
? ? ? ? "{{services}}"? ? ? when:? ?
? ? ? ? - inventory_hostname in groups['westos1']? ?-----------》只在westos1列表中的主機中執行此任務
? ? ? ? - item['firewall_name'] is defined? ? ? ? ? ? ? ? ?-----------》多條件時的格式
4.ansible中的觸發器
?[root@ansible ~]# chmod 755?/etc/vsftpd/vsftpd.conf?
?cp /etc/vsftpd/vsftpd.conf vsftpd.conf.j2
vim?vsftpd.conf.j2
????????anonymous_enable={{state}}
vim?vsftpd.yaml
- name: install ftp server
? hosts: all
? vars:
? ? state: YES
? tasks:
? ? - name: install vsftpd
? ? ? dnf:
? ? ? ? name: vsftpd
? ? ? ? state: present
? ? - name: start vsftpd
? ? ? service:
? ? ? ? name: vsftpd
? ? ? ? state: started
? ? ? ? enabled: yes
? ? - name: set vsftpd.conf
? ? ? template:
? ? ? ? src: ./vsftpd.conf.j2
? ? ? ? dest: /etc/vsftpd.conf
? ? ? notify: restart vsftpd? ? ? ? ? ? ? ? ? ? ? ? ---------》觸發器,當更改時才會觸發handlers的內容? handlers:
? ? - name: restart vsftpd
? ? ? service:
? ? ? ? name: vsftpd
? ? ? ? state: restarted
ansible-playbook vsftpd.yaml
5.忽略錯誤play
ignore_errors : yes
例如下載一個根本不存在的東西,但是后續的任務依舊可以繼續
vim ignore_errors.yaml?
?
- name: setup?
? hosts: all
? tasks:
? ? - name: vsftpd
? ? ? dnf:?
? ? ? ? name: aaaaaaa
? ? ? ? state: present
? ? ? ignore_errors: yes? ? - name: show message
? ? ? debug:
? ? ? ? msg: hello
ansible-playbook ignore_errors.yaml
6.強制觸發器運行
vim vsftpd.yaml?
- name: test
? hosts: all
? vars:
? ? state: NO
? force_handlers: yes? ? ? ? ? ? ? ? ? ? ? ------------》強制觸發觸發器
? tasks:
? ? - name: config ftp
? ? ? template:
? ? ? ? src: ./vsftpd.conf.j2
? ? ? ? dest: /etc/vsftpd.conf
? ? ? notify: restart vsftpd? ? - name: install aaaaaa
? ? ? dnf:
? ? ? ? name: aaaaaa
? ? ? ? state: present? handlers:
? ? - name: restart vsftpd
? ? ? service:
? ? ? ? name: vsftpd
? ? ? ? state: restarted
ansible-playbook vsftpd.yaml?
7.控制play運行狀態
強制視為執行成功狀態
vim vsftpd.yaml?
- name: test
? hosts: all
? vars:
? ? state: NO
? force_handlers: yes
? tasks:
? ? - name: config ftp
? ? ? template:
? ? ? ? src: ./vsftpd.conf.j2
? ? ? ? dest: /etc/vsftpd.conf
? ? ? changed_when: true? ? ? ? ? ? ? ? ----------》強制視為執行成功狀態
? ? ? notify: restart vsftpd? ? - name: install httpd
? ? ? dnf:
? ? ? ? name: httpd
? ? ? ? state: present? handlers:
? ? - name: restart vsftpd
? ? ? service:
? ? ? ? name: vsftpd
? ? ? ? state: restarted
ansible-playbook vsftpd.yaml?
failed_when: true? ? ? ? ? ? ? ? ----------》強制視為執行失敗狀態
8.根據play運行情況選擇運行動作
block: | 定義要運行的任務 |
rescue: | 定義當block句子中出現失敗任務后運行的任務 |
always: | 定義最終獨立運行的任務 |
vim test.yaml
- name: test
? hosts: all
? tasks:
? ? - name: test play
? ? ? block:
? ? ? ? - name: install software
? ? ? ? ? dnf:
? ? ? ? ? ? name: aaaaaa
? ? ? ? ? ? state: present
? ? ? rescue:
? ? ? ? - name: show message
? ? ? ? ? debug:
? ? ? ? ? ? msg: linux is not found
? ? ? always:
? ? ? ? - name: show always
? ? ? ? ? debug:
? ? ? ? ? ? msg: hello westos
ansible-playbook test.yaml
?當block中運行正常時,rescue中的內容就不會運行
- name: test
? hosts: all
? tasks:
? ? - name: test play
? ? ? block:
? ? ? ? - name: install software
? ? ? ? ? dnf:
? ? ? ? ? ? name: httpd
? ? ? ? ? ? state: present
? ? ? ? - name: show linux
? ? ? ? ? debug:
? ? ? ? ? ? msg: ansible linux
? ? ? rescue:
? ? ? ? - name: show message
? ? ? ? ? debug:
? ? ? ? ? ? msg: linux is not found
? ? ? always:
? ? ? ? - name: show always
? ? ? ? ? debug:
? ? ? ? ? ? msg: hello westos
?
9.運行情況判定示例
將/dev/cdrom掛載到/mnt/isodir中,如果目錄不存在就創建目錄。
vim mount.yaml
- name: mount /dev/cdrom play
? hosts: all
? tasks:
? ? - block:
? ? ? ? - name: check mount point
? ? ? ? ? shell: test -e /mnt/isodir
? ? ? rescue:
? ? ? ? - name: show message
? ? ? ? ? debug:
? ? ? ? ? ? msg: /mnt/iso is not exist
? ? ? ? - name: create mount point
? ? ? ? ? file:
? ? ? ? ? ? path: /mnt/isodir
? ? ? ? ? ? state: directory
? ? ? always:
? ? ? ? - name: mount cdrom
? ? ? ? ? mount:
? ? ? ? ? ? path: /dev/isodir
? ? ? ? ? ? src: /dev/cdrom
? ? ? ? ? ? fstype: iso9660
? ? ? ? ? ? state: mounted
ansible-playbook mount.yaml