ansible的脚本------playbook剧本

playbook组成部分:

  • 1.task 任务:包含要在目标主机上执行的操作,使用模块定义这些操作。每个都是一个模块的调用。
  • 2.variables 变量:存储和传递数据。变量可以自定义,可以在playbook当中定义为全局变量,也可以外部传参。
  • 3.Templates 模板:用于生成配置文件。模板是包含占位符的文件。占位符有ansible在执行时转化为变量值
  • 4.handlers 处理器:当需要有变更的时候,可以执行触发器。
  • 5.Roles 角色:是一种组织和封装playbook的。允许把相关的任务,变量,模板和处理器组织成一个可复用的单元。

实例模板

安装http并且设置页面内容

cd /opt
vim test1.yml

#this is our first playbook
- name: first play
一个name就是一个任务名,名字可以不写。
  gather_facts: false
是否收集目标主机的系统信息,false就是不收集
  hosts: 20.0.0.30
执行的目标主机是什么
  remote_user: root
在目标主机执行的用户
  tasks: 
   - name: ping test
     ping:
   - name: close selinux
     command: '/sbin/setenforce 0'
     ignore_errors: True
   - name: close firewalld
     service: name=firewalld state=stopped
   - name: install httpd
     yum: name=httpd state=latest
   - name: start httpd
     service: enabled=true name=httpd state=started
   - name: editon index.html
     shell: echo "this is httpd" > /var/www/html/index.html
     notify: restart httpd
  handlers:
   - name: restart httpd
     service: name=httpd state=restarted
     
wq

检查语法是否正确

ansible-playbook test1.yml --syntax-check
检查语法是否正确

ansible的脚本------playbook剧本_第1张图片

错误演示如上图

正确演示如上图

playbook常用脚本命令

ansible-playbook test1.yml --list-task
一般运行会有几个task

ansible-playbook test1.yml --list-hosts
检查生效的目标主机

开始运行脚本

ansible-playbook test1.yml
开始运行

可以在目标主机   tail -f /var/log/messages
查看

安装成功

ansible的脚本------playbook剧本_第2张图片

此外,我们还可以指定剧本的开始位置

ansible-playbook test1.yml --start-at-task='install httpd'

ansible的脚本------playbook剧本_第3张图片

安装时如何切换用户

#this is our first playbook
- name: first play
一个name就是一个任务名,名字可以不写。
  gather_facts: false
是否收集目标主机的系统信息,false就是不收集
  hosts: 20.0.0.30
执行的目标主机是什么
  remote_user: root
在目标主机执行的用户
  become: yes
  become_user: root
  
  tasks: 
   - name: ping test
     ping:
   - name: close selinux
     command: '/sbin/setenforce 0'
     ignore_errors: True
   - name: close firewalld
     service: name=firewalld state=stopped
   - name: install httpd
     yum: name=httpd state=latest
   - name: start httpd
     service: enabled=true name=httpd state=started
   - name: editon index.html
     shell: echo "this is httpd" > /var/www/html/index.html
     notify: restart httpd
  handlers:
   - name: restart httpd
     service: name=httpd state=restarted

ansible的脚本------playbook剧本_第4张图片

指定声明用户

ansible-playbook test1.yml -u root -k

ansible的脚本------playbook剧本_第5张图片

传参变量

#this is second playbook
声明和引用变量,以及外部传参变量
- hosts: 20.0.0.30
  remote_user: root
  vars:
    groupname: zzz
    username: hj
  tasks:
    - name: create group
      group:
        name: "{{ groupname }}"
        system: yes
        gid: 111
    - name: create user
      user:
        name: "{{ username }}"
        uid: 1011
        group: "{{ groupname }}"
        shell: /sbin/nologin
    - name: copy file
      copy:
        content: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address']}}"
        dest: /opt/ky32.txt

"{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address']}}":
获取目标主机IP地址,复制出来放到dest指定的路径中

inventory_hostname:目标的主机名
ansible_default_ipv4:获取目标主机名

ansible的脚本------playbook剧本_第6张图片

外部传参

ansible的脚本------playbook剧本_第7张图片

ansible的脚本------playbook剧本_第8张图片

条件判断

when......

when是一个比较常见的应用场景,实现了满足条件即执行,不满足即跳过的任务。

when 满足条件就执行,不满足不执行

指定IP输出   “位置判断”

#this is when test
- hosts: all
可以用主机的IP地址,也可以是用组名,也可以用all
  remote_user: root
  tasks:
   - name: test when
     debug:
       msg: '位置判断'
     when: ansible_default_ipv4.address == '20.0.0.30

ansible的脚本------playbook剧本_第9张图片

语法和shell差不多,   !=表示不等于,也就是   “除了”

ansible的脚本------playbook剧本_第10张图片

ansible的脚本------playbook剧本_第11张图片

条件满足才会执行

扩展

在20.0.0.30上安装nginx

在20.0.0.50上安装httpd

- hosts: all
  remote_user: root
  tasks:
   - name: nginx
     yum: name=nginx
     when: ansible_default_ipv4.address == '20.0.0.30'
   - name: nginx info
     debug:
       msg: "安装nginx"
     when: ansible_default_ipv4.address == '20.0.0.30'
   - name: http
     yum: name=httpd
     when: inventory_hostname == '20.0.0.50'

ansible的脚本------playbook剧本_第12张图片

playbook当中的循环

ansible有多种循环格式,with_items循环遍历

- hosts: 20.0.0.30
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{{ item }}"
     with_items: [a,b,c,d]
     
声明变量item,playbook的内置变量
 with_items,会把items的值遍历列表当中的a b c d
把item遍历成abcd

ansible的脚本------playbook剧本_第13张图片

如果修改成这样,结果会如何?

ansible的脚本------playbook剧本_第14张图片

ansible的脚本------playbook剧本_第15张图片

相当于 for i in (a,b,c,d,1,2,3,4)

但是with_items还是把两个列表当成整体进行遍历

list循环

ansible的脚本------playbook剧本_第16张图片

ansible的脚本------playbook剧本_第17张图片

touch循环

ansible的脚本------playbook剧本_第18张图片

ansible的脚本------playbook剧本_第19张图片

组循环

组循环,列表当中的值一一对应,打印出来

ansible的脚本------playbook剧本_第20张图片

少的部分会用none补上

列表里的元素定义了循环的次数

第二层列表相当于内循环。ansible的脚本------playbook剧本_第21张图片

ansible的脚本------playbook剧本_第22张图片

a1,a2,a3,a4.b1,b2,b3,b4.c1,c2,c3,c4,d1,d2,d3,d4

with_items 最常用

with_list 列表分组循环

with_togther 列表对应的列,以数据结合的方式循环

with_nested 相当于双重循环(第一层定义了循环的次数,第二层表示第一层的每个元素会循环几次)

ansible的脚本------playbook剧本_第23张图片

ansible的脚本------playbook剧本_第24张图片

扩展

创建两个用户 test1,test2

他们的组分别是 dn1 dn2

ansible的脚本------playbook剧本_第25张图片


得先创建组

yum一键安装tree,sl,nginx,httpd,vsftpd,dhcp

- name: play1
  hosts: 20.0.0.50
  gather_facts: false
  tasks:
   - name: yum info
     yum: name={{ item }} state=latest
     with_items:
       - tree
       - sl
       - nginx
       - httpd
       - vsftpd
       - dhcp

ansible的脚本------playbook剧本_第26张图片

你可能感兴趣的:(ansible)