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

目录

1.playbook剧本组成

2.playbook剧本实战演练

[2.1 实战演练一:给被管理主机安装httpd服务](#2.1 实战演练一:给被管理主机安装httpd服务)

[2.2 实战演练二:定义、引用变量](#2.2 实战演练二:定义、引用变量)

[2.3 实战演练三:指定远程主机sudo切换用户](#2.3 实战演练三:指定远程主机sudo切换用户)

[2.4 实战演练四:when条件判断](#2.4 实战演练四:when条件判断)

[2.5 实战演练五:迭代循环](#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}}"	
相关推荐
Hy行者勇哥4 天前
用Cursor智能编写Ansible/Terraform脚本,打通CI/CD链路
ci/cd·ansible·terraform
芷栀夏6 天前
飞牛NAS怎么部署Immich?家庭照片自动备份与远程访问教程
服务器·nginx·ansible
悠然南风17 天前
Ansible常见模块总结及LDAP Role 编写与调试
ansible
祺风挽楠1 个月前
ansible编辑
网络·ansible
芳心粽伙饭1 个月前
Ansible课后作业
ansible
烁3471 个月前
Ansible初识
ansible
烁3471 个月前
Ansible安装部署调试
ansible
烁3471 个月前
Ansible命令
ansible
小义_1 个月前
【Ansible】(三)基础配置与连接设置
云原生·ansible
炸炸鱼.1 个月前
Ansible 企业级实战:Playbook 与 Roles 完全指南
网络·ansible