目录
1.playbook剧本组成
2.playbook剧本实战演练
2.1 实战演练一:给被管理主机安装httpd服务
2.2 实战演练二:定义、引用变量
2.3 实战演练三:指定远程主机sudo切换用户
2.4 实战演练四:when条件判断
2.5 实战演练五:迭代循环
3.总结
1.playbook剧本组成
(1)Tasks:任务,即通过task调用ansible的模板将多个操作组织在一个playbook中运行
(2)Variables:变量
(3)Templates:模板
(4)Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作
(5)Roles:角色
2.playbook剧本实战演练
示例:
vim test1.yaml
--- #yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: first play #定义一个play的名称,可省略
gather_facts: false #设置不进行facts信息收集,这可以加快执行速度,可省略
hosts: webservers #指定要执行任务的被管理主机组,如多个主机组用冒号分隔
remote_user: root #指定被管理主机上执行任务的用户
tasks: #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行
- name: test connection #自定义任务名称
ping: #使用 module: [options] 格式来定义一个任务
- name: disable selinux
command: '/sbin/setenforce 0' #command模块和shell模块无需使用key=value格式
ignore_errors: True #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务
- name: disable firewalld
service: name=firewalld state=stopped #使用 module: options 格式来定义任务,option使用key=value格式
- name: install httpd
yum: name=httpd state=latest
- name: install configuration file for httpd
copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf #这里需要一个事先准备好的/opt/httpd.conf文件
notify: "restart httpd" #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
- name: start httpd service
service: enabled=true name=httpd state=started
handlers: #handlers中定义的就是任务,此处handlers中的任务使用的是service模块
- name: restart httpd #notify和handlers中任务的名称必须一致
service: name=httpd state=restarted
##Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。
2.1 实战演练一:给被管理主机安装httpd服务
在ansible服务器主机,给远程被管理主机制作安装httpd服务的剧本文件play1.yam
mkdir playbook
cd playbook/
vim play1.yaml
- name: first play
gather_facts: false
hosts: dbservers
remote_user: root
tasks:
- name: disable firewalld
service: name=firewalld state=stopped enabled=no
- name: disable selinux
command: 'setenforce 0'
ignore_errors: true
- name: mount cdrom
mount: src=/dev/sr0 path=/mnt fstype=iso9660 state=mounted
- name: install httpd
yum: name=httpd state=latest
- name: start httpd
service: name=httpd state=started enabled=yes
运行playbook
ansible-playbook play1.yaml
//补充参数:
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
ansible-playbook play1.yaml --syntax-check #检查yaml文件的语法是否正确
ansible-playbook play1.yaml --list-task #检查tasks任务
ansible-playbook play1.yaml --list-hosts #检查生效的主机
ansible-playbook play1.yaml --start-at-task='install httpd' #指定从某个task开始运行
被控制端验证安装情况
添加触发器
scp /etc/httpd/conf/httpd.conf 192.168.9.114:/opt/ #将httpd服务端下的httpd.conf文件复制到ansible服务器
vim /opt/httpd.conf ansible服务器
修改42行端口为8080,以便测试
vim play1.yaml
- name: first play
gather_facts: false
hosts: dbservers
remote_user: root
tasks:
- name: disable firewalld
service: name=firewalld state=stopped enabled=no
- name: disable selinux
command: 'setenforce 0'
ignore_errors: true
- name: mount cdrom
mount: src=/dev/sr0 path=/mnt fstype=iso9660 state=mounted
- name: install httpd
yum: name=httpd state=latest
- name: copy config file
copy: src=/opt/httpd.conf dest=/etc/httpd/conf/
notify: "reload httpd"
- name: start httpd
service: name=httpd state=started enabled=yes
handlers:
- name: reload httpd
service: name=httpd state=reloaded
ansible-playbook play1.yaml --syntax-check
ansible-playbook play1.yaml
被控制端查看端口是否同步
2.2 实战演练二:定义、引用变量
vim play2.yaml
- name: second play
remote_user: root
hosts: dbservers
vars:
- myname: scj
- myclass: xy101
tasks:
- name: create group
group: name={{myclass}}
- name: create user
user: name={{myname}} groups={{myclass}}
ansible-playbook play2.yaml --syntax-check
ansible-playbook play2.yaml
被控制主机验证
使用facts信息做变量
vim play2.yaml
- name: second play
remote_user: root
hosts: dbservers
gather_facts: true
vars:
- myname: scj
- myclass: xy101
tasks:
- name: create group
group: name={{myclass}}
- name: create user
user: name={{myname}} groups={{myclass}}
- name: copy file
copy: content={{ansible_default_ipv4}} dest=/opt/ipv4.txt
ansible-playbook play2.yaml
被控制节点验证
指定子字段名称查看具体内容,获取子字段内容,使用.13.51解释
vim play2.yaml
- name: second play
remote_user: root
hosts: dbservers
gather_facts: true
vars:
- myname: scj
- myclass: xy101
tasks:
- name: create group
group: name={{myclass}}
- name: create user
user: name={{myname}} groups={{myclass}}
- name: copy file
copy: content={{ansible_default_ipv4.network}} dest=/opt/ipv4.txt
ansible-playbook play2.yaml
被控制节点验证
运行时指定变量
ansible-playbook play2.yaml -e 'myname=zhuxiang' #在命令行里定义变量
2.3 实战演练三:指定远程主机sudo切换用户
vim /etc/sudoers #被控制节点为用户授权并设置密码
zhuxiang ALL=(ALL) ALL
echo 123456 | passwd --stdin zhuxiang
vim play2.yaml
- name: second play
remote_user: zhuxiang
become: yes #2.6版本以后的参数,之前是sudo,意思为切换用户运行
become_user: root #指定sudo用户为root
hosts: dbservers
gather_facts: true
vars:
- myname: wangwang
- myclass: xy102
tasks:
- name: create group
group: name={{myclass}}
- name: create user
user: name={{myname}} groups={{myclass}}
- name: copy file
copy: content={{ansible_default_ipv4.network}} dest=/opt/ipv4.txt
ansible-playbook play2.yaml -k -K
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
被控制节点验证
2.4 实战演练四:when条件判断
在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。
vim play3.yaml
- name: third play
remote_user: root
hosts: webservers
gather_facts: true
tasks:
- name: copy scj.sh to 9.111
copy: src=/opt/scj.sh dest=/opt
when: ansible_default_ipv4.address == "192.168.9.111"
- name: run sjc.sh on 9.113
script: '/opt/scj.sh scj tangjun'
when: inventory_hostname != "192.168.9.111"
192.168.9.111节点
192.168.9.113节点
2.5 实战演练五:迭代循环
vim play4.yaml
- name: four play
remote_user: root
hosts: dbservers
gather_facts: no
tasks:
- debug: msg="{{item}}"
with_items:
- a
- b
- c
ansible-playbook play4.yaml
迭代创建用户
vim play4.yaml
- name: four play
remote_user: root
hosts: dbservers
gather_facts: no
tasks:
- name: create users
user: name={{item}} groups=xy101
with_items:
- zhang
- san
- li
ansible-playbook play4.yaml
被控制节点验证
vim /etc/group
vim /etc/passwd
#可根据两条命令查看是否创建成功
创建多个用户并加入不同组
vim play4.yaml
- name: four play
remote_user: root
hosts: dbservers
gather_facts: no
vars:
- mygroups: ["xy1", "xy2", "xy3"]
tasks:
- name: create groups
group: name={{item}}
with_items: "{{mygroups}}"
- name: create users
user: name={{item.myname}} groups={{item.myclass}}
with_items:
- myname: si
myclass: xy1
- myname: wang
myclass: xy2
- myname: wu
myclass: xy3
ansible-playbook play4.yaml
被控制节点验证
vim /etc/group
vim /etc/passwd
#可根据两条命令查看是否创建成功
3.总结
playbook剧本的格式
vim XXX.yaml XXX.yml
- name: #设置play的名称(一个playbook文件里可以有多个play)
hosts: #设置执行此play的远程主机组,多个组用 : 分隔
remote_user: #设置在远程主机执行此play的用户名,默认为root
become: yes #设置是否需要在远程主机sudo切换执行任务
become_user: root #设置sudo切换的用户,一般为root
gather_facts: true|false #设置是否收集facts信息,默认为true
vars: #设置此play中使用的自定义变量
- 变量1: 值1
- 变量2: 值2
tasks: #设置此play的任务列表
- name: #定义任务的名称
模块名: 模块参数 #定义此任务要使用的模块和参数(键值对格式 key=value)
- name:
模块名: 模块参数
ignore_errors: true #忽略此任务可能的失败(如果不忽略,则任务失败会导致中断后续任务的执行)
- name:
模块名: 模块参数
when: 条件表达式 #条件表达式成立则执行此任务,不成立则不执行此任务
- name:
模块名: 模块参数={{item}} #循环遍历
with_items: #定义循环的取值列表
- name:
模块名: 模块参数
notify: '任务名' #定义此任务执行状态为changed时要触发的handler任务
handlers: #设置notify触发的任务
- name: 任务名
模块名: 模块参数
playbook运行命令
ansible-playbook XXX.yaml -u <远程用户> -k
--become-user <sudo切换的用户> -K
--syntax-check
--list-task
--list-hosts
--start-at-task="任务名"
-e "变量=值"
模块参数的格式
横向格式:
模块名: 参数1=值 参数2={{变量名}} ....
纵向格式:
模块名:
参数1: 值
参数2: "{{变量名}}"
....
vars 和 with_items 的格式
#值为纯量类型时:
tasks:
- name:
模块名: 参数1={{item}}
with_items:
- 值1 #纵向格式:
- 值2
....
tasks:
- name:
模块名: 参数1={{item}}
with_items: ["值1", "值2", ....] #横向格式
#先使用vars定义循环取值列表,再用with_items引用vars的变量
vars:
- 变量1:
- 值1 #纵向格式
- 值2
....
- 变量2: ["值1", "值2", ....] #横向格式
tasks:
- name:
模块名: 参数1={{item}}
with_items: "{{变量1}}" #使用with_items引用vars的变量
- name:
模块名: 参数1={{item}}
with_items: "{{变量2}}"
#当值为对象类型(键值对)时:
tasks:
- name:
模块名: 参数1={{item.key1}} 参数2={{item.key2}}
with_items:
- key1: 值1 #纵向格式
key2: 值2
- key1: 值3
key2: 值4
....
with_items:
- {key1: 值1, key2: 值2} #横向格式
- {key1: 值3, key2: 值4}
....
vars:
- 变量1:
- key1: 值1 #纵向格式
key2: 值2
- key1: 值3
key2: 值4
....
- 变量2:
- {key1: 值1, key2: 值2} #横向格式
- {key1: 值3, key2: 值4}
....
tasks:
- name:
模块名: 参数1={{item.key1}} 参数2={{item.key2}}
with_items: "{{变量1}}"