Playbook
一、语法特性以下:
(1)"---"首行顶格开始
(2)#号注释
(3)缩进统一,不一样的缩进表明不一样的级别,缩进要对齐,空格和tab不能混用
(4)区别大小写,键值对k/v的值也大小写敏感
(5)k/v的值同行使用":"分开,换行写需以"-"分隔
二、格式
---
- name: test
hosts: test
gather_facts: no
vars:
http: 8080
https: 1443
vars_files:
- vars/server_vars.yml
remote_user: root
sudo: yes
tasks:
- name: test1
copy: src=/opt/apps/web/* dest=/opt/apps/web/
notify:
- restart apache
- name: test2
yum: name={{ item }} state=present
with_items:
- httpd
- httpd-devel
- name: test3
shell: "echo $TEST"
environment:
- TEST: abc
handlers:
- name: restart apache
service: name=httpd state=restarted
说明:
hosts:test #表示test组的节点主机
gather_facts: no #跳过收集facts信息,默认是yes
vars: #定义变量,引用变量{{vars}}
vars_files: #使用文件定义变量,文件中也是用k/v形式定义变量
remote_user: root #远程使用root用户
sudo:yes #使用sudo
tasks: #指定一系列将要运行的任务
name: test1 #test1任务,copy模块
notify: #与下面handlers对应,上一步copy以后文件发生改变,则经过name匹配handlers中的任务,这里匹配restart appche的service任务
name: test2 #test2任务,yum模块
with_items: #定义列表变量,直接用{{item}}引用。该关键字也能够用来定义数组。
with_dict: #定义字典
三、正式运行Playbook以前,能够--check或-C来检测,输出的结果和实际执行如出一辙,但不会有实际影响。
四、ansible-playbook
-i 指定inventory文件
-v 详细输出,-vvv更详细,-vvvv更更详细
-f 并发数
-e 定义Playbook中使用的变量,格式"key=value,key=value"
--remote-user #远程用户
--ask-pass #远程用户密码
--sudo #使用sudo
--sudo-user #sudo的用户,默认root
--ask-sudo-pass #sudo密码
扩展:
(1)handlers:见test1
(2)environment:为某个play设置单独的环境变量,例子见P94-95
(3)delegate_to:任务委派
例:- name: 123
shell: "echo $PATH>/test/1"
delegate_to: 192.168.2.30
把shell命令委派给192.168.2.30节点执行,其余hosts中指定的节点不执行。
(4)register:注册变量
将操做结果,包括stdout和stderr,保存到变量中,再根据变量的内容决定下一步,这个保存操做结果的变量就是注册变量。
例:- shell: ***
register: result
使用result.stdout和result.stderr读取执行结果的标准输出和标准错误。
(5)vars_prompt: 交互式提示
例:
---
- hosts: all
vars_prompt:
- name: share_user
prompt: "username?"
- name: share_pass
prompt: "password"
private: yes
经常使用选项:
private: yes #用户输入不可见
default #设置默认值
confirm: yes #要求输入两次
五、流程控制
(1)when条件判断 P109
例1:第一步执行的返回值中有'ready'时,再执行下一步操做。
- command: my-app --status
register: myapp_result
- command: do-something
when: "'ready' in myapp_result"
例2:stat模块查看文件信息,若是文件没建立,则执行command
- stat: path=/etc/sysctl.conf
register: stat_result
- command: touch /etc/sysctl.conf
when: stat_result.stat.exists == false
(2)changed_when和failed_when P110-111
(3)wait_for模块,任务暂停 P112
六、循环
原文:http://xdays.me/ansible状态管理.html
(1)标准遍历
用with_items能够遍历一个列表,注意这里只会遍历一层。示例以下:
- name: add several users
user: name={{ item }} state=present groups=wheel
with_items:
- testuser1
- testuser2
(2)嵌套遍历
用with_nested能够遍历一个列表,注意这里会遍历多层,直到最内层。示例以下:
- name: give users access to multiple databases
mysql_user: name={{ item[0] }} priv={{ item[1] }}.*:ALL append_privs=yes password=foo
with_nested:
- [ 'alice', 'bob', 'eve' ]
- [ 'clientdb', 'employeedb', 'providerdb' ]
(3)遍历字典
用with_dict能够遍历一个字典,用key和value来表示。示例以下:
#变量文件
---
users:
alice:
name: Alice Appleworth
telephone: 123-456-7890
bob:
name: Bob Bananarama
telephone: 987-654-3210
#playbook文件
tasks:
- name: Print phone records
debug: msg="User {{ item.key }} is {{ item.value.name }} ({{ item.value.telephone }})"
with_dict: users
(4)文件通配符循环
用with_fileglob能够获取本地文件列表。示例以下:
# copy each file over that matches the given pattern
- copy: src={{ item }} dest=/etc/fooapp/ owner=root mode=600
with_fileglob:
- /playbooks/files/fooapp/*
(5)对齐的列表
用with_together能够达到相似Python里的zip函数的功能。示例以下:
#变量文件:
---
alpha: [ 'a', 'b', 'c', 'd' ]
numbers: [ 1, 2, 3, 4 ]
#playbook文件
tasks:
- debug: msg="{{ item.0 }} and {{ item.1 }}"
with_together:
- alpha
- numbers
(6)循环一个task的输出
with_lines指令后跟一个命令,ansible会遍历命令的输出。示例以下:
- name: Example of looping over a command result
shell: /usr/bin/frobnicate {{ item }}
with_lines: /usr/bin/frobnications_per_host --param {{ inventory_hostname }}
七、Tags标签 #P113-114
标签功能能够给Roles、文件、单独的任务甚至整个Playbook打上标签,而后利用这些标签来指定要运行或不运行Playbook中的个别任务。
例:
vim test.yml
---
- hosts: test
tags: deploy #给整个Playbook打一个标签
tasks:
- name: test_tags
shell: ***
tags: #为任务打标签
- test1
- test2
- include: foo.yml
tags: foo
ansible-playbook test.yml --tags "test1" #只执行test_tags任务
ansible-playbook test.yml --skip-tags "test2" #跳过test_tags任务
写法格式:
tags: ['one','two']
tags:
- one
- twohtml