playbook的格式是yaml,由一个或多个‘play’组成,一个play对应一个task(任务),一个task是对ansible模块的调用,playbook命令自上而下顺序执行。
例1:
-
#主机与用户
-
---
-
- hosts: test #定义主机
-
remote_user: root #定义远程用户
-
sudo: yes #普通用户支持sudo
-
sudo_user: username #指定了普通用户使用sudo
-
gather_facts: false #指定了在任务执行前,是否执行setup模块获取主机相关信息,这里关闭了facts的信息
-
vars: #指定了变量
-
- user: "test" #指定了变量user,其值为"test"
-
#Tasks列表
-
tasks: #指定了一个任务
-
- name: template #name参数对任务进行描述
-
template: src=template dest=/etc/test #
-
meta: flush_handlers #handlers会在执行到meta部分时,优先执行。
-
tags: template #tag用于让用户选择运行或略过playbook中部分代码,如确信其没发生变化就可以通过tag跳过此段代码。可以通过命令行指定执行tags代码块: ansible-playbook test.yml --tags="template"
-
notify: #会在每一个task结束时被触发,即使有多个不同的task发生改动,notify只会被触发一次。当template模块中的文件被改动时,执行下列操作。
-
- restart apache
-
- restart mysql
-
handlers: #handlers也是task任务,不过是由notify通知来操作,如果没有notify,handlers不会执行,不管有多少个notigy,等到play中所有的task执行完成之后,handlers也只会被执行一次。Handlers 最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了。
-
- name: restart apache
-
service: name=apache state=restarted
-
- name: restart mysql
-
service: name=mysql state=restarted
-
-
- include: test.yml #可以和其它非include的tasks和handlers混合使用,也可以用来导入playbook文件。
-
yaml
文件都是从一个列表开始,列表中的每一项都是一个键值对(哈希或字典)。
1、yaml语法与范例:
1.1、开始行都应该是---,区分多个play;...可选择性用来表示play结尾;
1.2、yaml使用可打印的unicode字符,可使用utf-8或utf-16;
1.3、使用空格(不能使用Tab)分隔,同行元素左对齐;
1.4、使用井号(#)注释;
1.5、每个play成员以单行表示,并用短杠+空格(- )起始;
1.6、每个play成员用冒号+空格(: )分开键和值;
1.7、play成员可以用问号(?)起始,表示多个词汇组成键值;
1.8、字符串一般不适用引号,必要时可以用引号;
1.9、使用双引号表示字符串时,可用反斜杠(\)进行转义;
1.10、">"的作用,以缩进对齐来判断是否为一段文字,缩进与上一行不一致,则认为是新行;
1.11、"|"的作用,表示之后的文字,每一行均为一个新行。
1.12、"&"的作用,表示一个锚点标记,其它节点可以使用"*"或"<<: *"来引用它的值;
1.13、"!!"的作用,强制转换类型;
2、playbook实战(批量修改hostname)
-
/etc/ansible/hosts配置如下:
-
[web1]
-
192.168.3.60 ansible_ssh_port=8020 ansible_ssh_user=root ansible_ssh_pass=123456
-
[web2]
-
192.168.3.61 ansible_ssh_port=8020 ansible_ssh_user=root ansible_ssh_pass=123456
-
[web3]
-
192.168.3.253 ansible_ssh_port=8020 ansible_ssh_user=test ansible_ssh_pass=123456 ansible_become_pass=123456 #普通用户通过su切root密码
-
[web3:vars]
-
web_hostname=web3_test
-
#become=True
-
#become_method=su
-
[web2:vars]
-
web_hostname=web2_test
-
[web1:vars]
-
web_hostname=web1_test
-
[web:children]
-
web1
-
web2
-
web3
-
-
此例用到了roles,目录结构为:/etc/ansible/roles/games/{defaults,files,handlers,meta,tasks,templates,vars}
-
/etc/ansible/site_change_hostname.yml 内容如下:
-
---
-
- hosts: all
-
remote_user: root
-
roles:
-
- {role: games,tags: ['hostname']}
-
tasks:
-
- include: roles/games/tasks/modify_hostname.yml
-
-
/etc/ansible/roles/games/tasks/modify_hostname.yml 内容如下:
-
---
-
- name: modify the hostname config
-
lineinfile:
-
dest: /etc/sysconfig/network
-
regexp: '^HOSTNAME='
-
line: 'HOSTNAME={{ web_hostname }}'
-
- name: modify the hostname
-
hostname: name={{ web_hostname }}
-
tags: hostname
-
# ansible-playbook -i hosts site_host.yml -s
-
普通用户执行报错:
-
#ansible web3 -m ping
-
192.168.3.249 | => {
-
"changed": false,
-
"msg": "Authentication or permission failure. In some cases, you may have been able to authenticate and did not have permissions on the remote directory. Consider changing the remote temp path in ansible.cfg to a path rooted in \"/tmp\". Failed command was: ( umask 77 && mkdir -p \"` echo /tmp/.ansible/tmp/ansible-tmp-1498121479.39-227152147951637 `\" && echo ansible-tmp-1498121479.39-227152147951637=\"` echo /tmp/.ansible/tmp/ansible-tmp-1498121479.39-227152147951637 `\" ), exited with result 1",
-
"unreachable": true
-
}
-
#/etc/ansible/ansible.cfg
-
#保证普通用户对remote_tmp目录有写权限。
-
remote_tmp = /tmp/.ansible/tmp
-
或
-
remote_tmp = $HOME/.ansible/tmp
-
#远程主机日志/var/log/message
-
localhost ansible-ping: Invoked with data=None
-
localhost ansible-command: Invoked with warn=True executable=None _uses_shell=True _raw_params=w removes=None creates=None chdir=None
-
# ansible web3 -m ping
-
192.168.3.253 | => {
-
"changed": false,
-
"msg": "Failed to connect to the host via ssh: Received message too long 458960955\r\n",
-
"unreachable": true
-
}
-
这个报错是因为加载253的~/.bashrc文件输出内容过多导致的,通过过滤其输出来解决这个问题。
初始化系统环境:
-
/etc/ansible/site_os_initenv.yml
-
---
-
- hosts: all
-
remote_user: root
-
roles:
-
- {role: games,tags: ['os_init_env']}
-
tasks:
-
- include: roles/games/tasks/build_os_initenv.yml
-
-
/etc/ansible/roles/games/vars/main.yml
-
---
-
game_dir: "/Game/Scripts/"
-
scripts_dir: "/var/www/html/test/"
-
scripts_file: "scripts/test.zip"
-
tmp_dir: "/Game/Tmp"
-
lib_file: "lib/lib64.zip"
-
scripts_init: "initscript.sh nc"
-
scripts_update: "update.sh all"
-
os_init_env: "initenv.sh 1"
-
-
/etc/ansible/roles/games/tasks/build_os_initenv.yml
-
-
---
-
- name: copycopy lib
-
copy: " src={{ scripts_dir }}{{ lib_file }} dest={{ tmp_dir }} "
-
- name: init os env
-
shell: "sh {{ game_dir }}cjsh_mobile_sh/{{ os_init_env }}"
-
tags: initos_init_env
-
-
初始化应用环境:
-
/etc/ansible/site_game_initenv.yml
-
---
-
- hosts: web,game
-
remote_user: root
-
roles:
-
- {role: games,tags: ['init']}
-
- {role: games,tags: ['update']}
-
tasks:
-
- include: roles/games/tasks/build_game_initenv.yml
-
-
-
/etc/ansible/roles/games/tasks/build_game_initenv.yml
-
---
-
- name: create games dir
-
file: " path={{ game_dir }} state=directory owner=root group=root mode=755 "
-
- name: copy scripts
-
copy: " src={{ scripts_dir }}scripts/{{ scripts_file }} dest={{ game_dir }} "
-
- name: unzip scripts.zip
-
shell: " cd {{ game_dir }} && unzip {{ scripts_file }} "
-
tags: build_env
-
- name: begin build games init
-
shell: "sh {{ game_dir }}cjsh_mobile_sh/{{ scripts_init }}"
-
tags: init
-
- name: update game
-
shell: "sh {{ game_dir }}cjsh_mobile_sh/{{ scripts_update }}"
-
tags: update
-
-
-
在playbook和包含变量设置的配置文件中,使用冒号(:)来为变量赋值。
-
如:a:b
-
指定额外的变量--extra-vars
-
ansible-playbook test.yml --extra-vars "a=b"
-
playbook中vars代码块使用方法
-
---
-
-hosts:test
-
vars:
-
a:b
-
playbook中vars_file代码块使用方法
-
---
-
-hosts:test
-
vars_files:
-
-vars.yml
-
vars.yml内容如下:
-
#当变量被独立文件定义时,变量可在ymal中顶格进行定义,也不需要vars标识。
-
---
-
a:b
-
-
playbook中使用双大括号加变量名来读取变量内容
-
---
-
-hosts:test
-
vars:
-
a:b
-
tasks:
-
-command:echo {{ a }}
-
-
playerbook数组变量(列表变量)
-
foo_list:
-
-one
-
-two
-
-three
-
读取第一个变量,方法如下:
-
foo[0] #python语法格式
-
foo|first #jinja2语法格式
-
-
ansible内置变量ansible_eth0:
-
tasks:
-
-debug:var=ansible_eth0
-
ok:[webserver] => {
-
"ansible_eth0": {
-
"active":true,
-
"device":"eth0",
-
"ipv4":{
-
"address":"10.0.2.15",
-
"netmask":"255.255.255.0",
-
"network":"10.0.2.0"
-
}
-
读取ipv4的地址方法:
-
{{ ansible_eth0.ipv4.address }}
-
{{ ansible_eth0['ipv4']['address'] }}
-
阅读(3522) | 评论(0) | 转发(0) |