Ansible-playbook 快速入門到放棄
隔岸紅塵忙似火,當軒青嶂冷如冰。
playbook 相當於可以把模組命令都寫入到組態檔裡面,這樣就可以直接執行組態檔了,類似指令碼。
編寫test.yml 檔案,在serviceA 主機機器上的/opt/tjt 路徑下建立test.txt 檔案。
1 --- 2 - hosts: serviceA 3 remote_user: root 4 tasks: 5 - name: "使用touch 命令建立test.txt檔案" 6 shell: touch /opt/tjt/test.txt
編輯完成之後,使用ansible-playbook 命令執行test.yml 檔案。
[root@localhost tjt]# ansible-playbook /opt/tjt/ansible/test.yml
然後到使用者端上看看是否有建立test.txt 檔案。
[root@localhost ~]# ls -l /opt/tjt/test.txt
通過建立使用者體驗playbook 的變數使用方式。
--- - name: "建立test使用者" hosts: 192.168.8.136 user: root gather_facts: false vars: - user: "test" tasks: - name: "---playbook變數----建立test使用者---" user: name="{{ user }}"
執行該檔案:
[root@localhost tjt]# ansible-playbook /opt/tjt/ansible/create_user.yml
到使用者端上看看使用者是否已建立:
[root@localhost ~]# id test
--- - hosts: 192.168.8.136 user: root tasks: - name: "playbook---迴圈" file: path=/opt/tjt/{{ item }} state=touch mode=600 with_items: - 1.txt - 2.txt - 3.txt
執行該檔案:
[root@localhost tjt]# ansible-playbook /opt/tjt/ansible/while.yml
到使用者端上看看檔案是否已建立:
[root@localhost ~]# ll /opt/tjt/*.txt
[root@localhost tjt]# ansible serviceA -m setup
通過一個簡單的建立檔案的例子體驗playbook 條件判斷語句的使用方式,編寫 when.yml 檔案內容如下:
--- - hosts: serviceA user: root gather_facts: True tasks: - name: "playbook---條件判斷" shell: touch /opt/tjt/when.txt when: ansible_virbr0.ipv4.address == "192.168.122.1"
執行該檔案:
[root@localhost tjt]# ansible-playbook /opt/tjt/ansible/when.yml
到使用者端上看看檔案是否已建立:
[root@localhost ~]# ll /opt/tjt/when.txt -rw-r--r--. 1 root root 0 2月 21 21:51 /opt/tjt/when.txt [root@localhost ~]#
--- - name: "playbook中的handlers" hosts: serviceA user: root tasks: - name: copy file copy: src=/opt/tjt/handlers dest=/opt/tjt/handlers.txt notify: test handlers handlers: - name: test handlers shell: echo "This is a test string" >> /opt/tjt/ansible/handlers.txt
執行該檔案:
[root@localhost tjt]# ansible-playbook /opt/tjt/ansible/handlers.yml
到使用者端上檢視檔案末尾一行是否為ansible 執行的echo 寫進的那一行內容。
[root@localhost ~]# tail -n1 /opt/tjt/ansible/handlers.txt
role是task檔案、變數檔案、handlers檔案的集合體,這個集合體的顯著特點是:可移植性和可重複執行性。
在實際專案中,通常我們以部署某個服務為單元作為一個role ,然後將這些服務單元(role)放在一個roles 目錄下,主playbook 檔案通過呼叫roles目錄下的role,來實現各種靈活多變的部署需求。
建立一個role 的方法有兩種:
命令mkdir 和touch 行手動建立,即需要哪個目錄和檔案就用「mkdir」和「touch」命令建立出來。
使用ansible-galaxy 自動初始化一個role,建立完後再刪除不需要的目錄。
使用「ansible-galaxy init」命令建立一個名字為role_D 的role。
[root@localhost roles]# ansible-galaxy init role_D - Role role_D was created successfully
role 中各個目錄下的main.yml 檔案很重要,這是ansible 預設載入的YAML 檔案。
編寫主playbook 檔案test_role.yml:
--- - name: "主playbook檔案通過呼叫roles目錄下的role" hosts: serviceA user: root gather_facts: false roles: - roleB - roleA
roleA 和roleB 目錄結構如下:
/opt/tjt/ansible/roles/roleA/tasks/main.yml
--- - name: "呼叫-roles目錄下的roleA" debug: msg: "msg: roleA被執行"
/opt/tjt/ansible/roles/roleB/tasks/main.yml
--- - name: "呼叫-roles目錄下的roleB" debug: msg: "age:: roleB被執行"
執行主playbook 檔案test_role.yml:
[root@localhost roles]# ansible-playbook /opt/tjt/ansible/test_role.ym
如上,可以看到roleB 和roleA 分別有序執行。
ansible 如何查詢要執行的role,在不使用絕對路徑的情況下(可以這麼配role - role: /opt/tjt/ansible/roles/roleB),ansible 檢索role 的預設路徑有:
chdir:進入指定目錄,如下chdir,執行ls 命令前,先進入指定目錄/opt/tjt。
[root@localhost roles]# ansible serviceA -m command -a 'chdir=/opt/tjt ls'
ansible 中的迴圈模組有很多,with_items 最為簡單常用。
--- - name: "with_items迴圈遍歷" shell: "echo {{ item }}" register: "with_items_output" with_items: [a,b,c,d]
如上,with_items 可以用於迭代一個列表或字典,通過 {{ item }} 獲取每次迭代的值。