Playbook:YAML格式 是一个可读性高,用来表达数据序列的格式。
基本数据结构:标量 数组 关联数组
Playbook的核心元素:
Hosts:主机
Tasks:任务列表
Variables
Templates:包含了模板语法的文本文件
Handlers:由特定条件触发的任务
playbook的基础组件:
Hosts:运行指定任务的目标主机
remote_user:在远程主机上执行任务的用户
sudo_user:
tasks:任务列表
模块,模块参数
格式:
1、action:module arguments
2、module:arguments
注意:shell和command模块后面直接跟命令,而非key=value类的参数列表
1、某任务的状态在运行后为changed时,可通过"notify"通知给相应的handlers
2、任务可以通过"tags"打标签,而后可在ansible-playbook命令上使用-t指定进行调用
运行playbook的方式:
1、测试:
ansible-playbook --syntax-check
只检测可能会发生的改变,但不真正执行操作
ansible-playbook --list-hosts
列出运行任务的主机
2、运行
编写一个脚本:frist.yaml
- hosts: all
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=installed
- name: start nginx
service: name=nginx state=started enabled=true
ansible-playbook --syntax-check first.yaml # 检查这个脚本的语法
ansible-playbook --list-hosts first.yaml # 列出受控主机
ansible-playbook --list-tasks first.yaml # 列出脚本中的任务
ansible-playbook -C first.yaml # 干跑
ansible-playbook first.yaml # 执行playbook
ansible ipaddr(某台受控主机) -m fetch -a "src=/etc/nginx/nginx.conf dest=./" # 把某台受控主机上文件/etc/nginx/nginx.conf复制到运行ansible的当前主机的当前目录下
handlers:
任务:在特定条件下触发
接收到其它任务的通知时被触发。
编辑second.yaml
- hosts: all
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=installed
- name: copy config file
copy: src=/root/playbooks/nginx.conf dest=/etc/nginx/nginx.conf owner=nginx
notify: restart ngnix
tags: configfile
- name: start nginx
service: name=nginx state=started
handlers:
- name: restart nginx
service: name=nginx state=restarted
只运行指定标签的任务: ansible-playbook -t tags second.yaml
# 收集指定的被管控主机的信息
ansible ipaddress -m setup
variables:
1、facts:可直接调用,注意:可使用setup模块直接获取目标主机的facters。
2、ansible-playbook命令的命令行中的自定义变量
-e VARS, --extra-vars=VARS
3、通过roles创建变量
4、Host Inventory:
a、向不同的主机传递不同的变量
IP/HOSTNAME variable=value var2=value2
b、向组中的主机传递相同的变量
[groupname:vars]
variable=value
注意:用于定义ansible远程连接目标主机时使用的参数,而非传递给playbook的变量
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
编辑以下third.yaml:
- hosts: ipaddress
remote_user: root
tasks:
- name: copy file
copy: content={{ ansible_env }} dest=/tmp/ansible.env
执行:
ansible-playbook --syntax-check third.yaml # 进行语法检查
ansible-playbook third.yaml # 收集ansible_env块的信息,并保存到受控远程主机的/tmp/ansible.env中
编译以下fourth.yaml
- hosts: all
remote_user: root
tasks:
- name: install package {{ pkgname }}
yum: name={{ pkgname }} state=installed
在命令行中:ansible-playbook -e pkgname=redis fourth.yaml #在受控主机上安装redis
# 列出在websrvs组中的主机
ansible websrvs --list-hosts
# 在/etc/ansible/hosts定义:
[websrvs]
ipaddr ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_password=xxxx
创建一个创建指定用户名和密码的yaml文件:
[root@bjAli playbooks]# cat createuser.yaml
- hosts: all
remote_user: root
tasks:
- name: add user
user: name={{ username }} system=no state=present
- name: set password
shell: echo {{ username }} | passwd --stdin {{ username }}
执行:ansible-playbook -e username=bl02u2 createuser.yaml # 将在受控主机上创建一个用户名为bl02u2密码为bl02u2的用户
在/etc/ansible/hosts添加以下三行:
[websrvs]
ipaddress1 ansible_ssh_user=bl02u2 ansible_ssh_pass=bl02u2
ipaddress2 ansible_ssh_user=bl02u2 ansible_ssh_pass=bl02u2
ansible websrvs -m ping # 对websrvs组中受控机执行ping模块
ansible websrvs -m command -a "whoami" # 对websrvs组中受控机执行命令whoami