Ansible的脚本-----playbook剧本【上】

avatar
作者
猴君
阅读量:0

目录

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 


被控制节点验证

指定子字段名称查看具体内容,获取子字段内容,使用.

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}}"	 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!