#
# Topic: playbook 基本語法和常用命令
# State:
# 1. Ansible playbook 腳本編寫方法
# 2. Playbook是Ansible的最和興的功能組件
# 3. Ansible 的配置管理和應(yīng)用部署工作都是通過playbook來完成的
# Testing environment:
# OS: RHEL6.6
# Python: python2.7.5
# Ansible: ansible 2.3.1.0
# Nodes: 3
#
# 1. Playbook 基礎(chǔ)語法
-
- Playbook 基礎(chǔ)語法:
必備基礎(chǔ): YAML語法 #Playbook使用YAML語法編寫的Ansible腳本
Playbook運(yùn)行命令: ansible-playbook
# 示例: ansible-playbook first_demo.yamlPlaybook語法檢查: ansible-playbook playbook_name --syntax-check
# 示例: ansible-playbook first_demo.yaml --syntax-check列出Playbook中的任務(wù): ansible-playbook playbook_name --list-
# 示例: ansible-playbook base_playbook1.yaml --list-task列出Playbook文件中任務(wù)的目標(biāo)主機(jī): ansible-playbook --list-hosts
# 示例: ansible-playbook base_playbook1.yaml --list-運(yùn)行Playbook某個特定的task: ansible-playbook --start-at-task="task_name"
# 示例: ansible-project]# ansible-playbook -i /etc/ansible/hosts base_playbook2.yaml -f 10 --start-at-task="check if the httpd is running"-
其他命令選項(xiàng):
- -f: 指定任務(wù)運(yùn)行的并發(fā)數(shù)
- -i: 指定playbook運(yùn)行使用的inventory
完整示例:
...
######################## Example Start ##########################
# Install Nginx
- name: Install Nginx # play名稱
hosts: tomcat # 目標(biāo)主機(jī)抠刺,支持patterns
remote_user: root # 遠(yuǎn)程ssh認(rèn)證主機(jī)
sudo: yes # 是否啟用sudo
sudo_user: ansible # sudo權(quán)限用戶
gather_facts: no # 是否收集facts信息
accelerate: no # 是否啟用加速模式
accelerate_port: 5999 # 如果啟用加速模式存谎,那么需要設(shè)置端口
connection: local # 設(shè)置鏈接方式
serial: 15 # 設(shè)置playbook的并發(fā)數(shù)
vars: # 設(shè)置playbook變量
nginx_port: 83
vars_files:- "vars.yml"
- [ "one.yml", "two.yml" ]
vars_prompt: - name: "password vaes"
# prompt: "Enter password"
# default: "secret"
# private: yes
# encrypt: "md5_crypt"
# confirm: yes
# salt: 1234
# salt_size: 8
#
pre_tasks: # 設(shè)置taks運(yùn)行之前的task - name: pre_tasks
shell: hostname
roles: # 引入role - tomcat:
- { role: tomcat, version: '9.0', when: "ansible_system =='linux', tags: [tomcat, install]"}
- { role: tomcat, when: ansible_all_ipv4_addresses == "192.16.1.1" }
tasks: - include: tasks.yaml
- include: tasks.yaml ansible_distribution="CentOS" ansible_distribution_version='6.6'
- { include: tasks.yaml, version: '1.1', package: [nginx, httpd] }
- include: tasks_192.168.1.117.yaml
when: ansible_all_ipv4_addresses == '192.168.1.117'
post_tasks: # 設(shè)置運(yùn)行之后的task - naem: post_tasks
shell: hostname
handlers: # 設(shè)置handler - include: handlers.yml
######################## Example End ############################
...
# Playbook 中的變量和變量引用
-
- Playbook 中的變量和引用
- 2.1 通過Inventory來定義host和group變量
# 說明:
# 1. host 變量只對當(dāng)前host起作用
# 2. group 變量對組內(nèi)的所有host起作用
# 示例Inventory定義
#[tomat]
#ansible1
#ansible2
#ansible3
#
#[tomat:vars]
# inventory_name=michael_chacki
# 示例playbook:
# ---
# # show vars
# - name: the frist play
# hosts: tomat
# remote_user: root
# gather_facts: false
# tasks:
# - name: the first task
# debug: msg="The hostname is {{inventory_hostname}} and the key is {{ key }}, the inventory_name is {{ inventory_name }}"
- 2.2 通過/etc/ansible下的文件來定義host和group變量
- host變量定義步驟
- 新建文件夾host_vars
- 創(chuàng)建以hostname命名的文件
- 在步驟2中創(chuàng)建的文件中定義變量
- group變量定義
- 新建文件夾group_vars
- 創(chuàng)建以groupname命名的文件
- 在步驟2中創(chuàng)建的文件中定義變量
- 變量引用
{{變量名}}
#說用: 1. 創(chuàng)建的變量文件名必須是在inventory中存在的host或是group
# 2. 如果變量沒有被覆蓋,那么就可以引用到
# 3. 變量文件內(nèi)容必須以YAML的格式編寫
#
#示例:
# 文件結(jié)構(gòu):
# group_vars
# └── tomcat
# host_vars
# ├── ansible1
# ├── ansible2
# └── ansible3
# 定義變量:
# ---
# group_key: michael.lin
# ---
# key: michael1
# ---
# key: michael2
# ---
# key: michae
# ...
# 引用變量:
# ---
# show_vars.yaml
# - name: show the host ans group vars
# remote_user: root
# hosts: tomcat
# gather_facts: false
# tasks:
# - name: show host vars
# debug: msg="The current host {{ inventory_hostname }}''key value is {{ key }}"
# - name: show group vars
# debug: msg="The current group {{ current_group_name }} ''group name is {{ group_name }}"
# ...
#
- host變量定義步驟
- 2.3 使用ansible-playbook中引入變量
- 2.3.1 在命令行定義變量傳入
- 例如:ansible-playbook show_vars.yaml -e "key='Hello world' group_key=ansible"
- 2.3.2 在命令行通過文件的方式傳入登下,支持json和YAML
- 例如:ansible-playbook show_vars.yaml -e "@var.yaml"
#
- 例如:ansible-playbook show_vars.yaml -e "@var.yaml"
- 2.3.1 在命令行定義變量傳入
- 2.4 在playbook中通過vars定義變量
# 示例如下:
...
# show_vars.yaml
- name: show the host ans group vars
remote_user: root
hosts: tomcat
gather_facts: false
vars:
key: 'I am Jin ge'
group_key: 'I am a group'
tasks:- name: show host vars
debug: msg="The current host {{ inventory_hostname }}''key value is {{ key }}" - name: show group vars
debug: msg="The current group {{ group_key }} ''group name is {{ group_key }
...
# Playbook 中的循環(huán)
- name: show host vars
- 2.5 通過vars_files來引用變量
- 說明
- 變量列表是列表形式
- 步驟
- 定義變量文件,yaml或是json格式
- 在playbook 中使用vars_files 引用變量文件
- 示例
...
- 說明
# show_vars.yaml
- name: show the host ans group vars
remote_user: root
hosts: tomcat
gather_facts: false
vars:
key: 'I am Jin ge'
group_key: 'I am a group'
vars_files:- var.yaml
tasks: - name: show host vars
debug: msg="The current host {{ inventory_hostname }}''key value is {{ key }}" - name: show group vars
debug: msg="The current group {{ group_key }} ''group name is {{ group_key }}"
...
- var.yaml
- 2.6 使用register 在task之間傳遞變量
- 功能:在不同的task之間傳遞變量
- 使用場景:一個task需要根據(jù)上一個task的變量來決定是否運(yùn)行
- 定義步驟
- 在上一個任務(wù)運(yùn)行完成后恃鞋,使用register定義變量
- 當(dāng)任務(wù)運(yùn)行完成后會將運(yùn)行結(jié)果保持到注冊的變量中
- 返回的是一個字典格式的變量宪赶,可以通過python字典引用元素的方式引用
- 示例
# show register vars
-
name: show register vars
hosts: tomcat
remote_user: root
gather_facts: false
tasks:- name: register var
shell: hostname
register: info - name: show var from task above
debug: msg={{info['stdout']}}
...
- name: register var
2.7 通過vars_prompt 交互的方式傳入變量
# 該方式不做介紹了-
同名變量的優(yōu)先級
- extra vars(命令中-e)最優(yōu)先
- inventory 主機(jī)清單中連接變量(ansible_ssh_user 等)
- play 中 vars告抄、vars_files 等
- 剩余的在 inventory 中定義的變量
- 系統(tǒng)的 facts 變量
- 角色定義的默認(rèn)變量(roles/rolesname/defaults/main.yml)
-
- Playbook 中的循環(huán)
- 見其他文檔
# 4. Playbook 中條件分支
-
- Playbook 中條件分支
- 見其他文檔
# 5. Jinja2 過濾器
-
- Jinja2 過濾器
- 見其他文檔
# 6. Playbook中的內(nèi)置變量
-
- Playbook中的內(nèi)置變量
- 見其他文檔
# 總結(jié)
-
總結(jié)
- 見其他文檔