Ansible的脚本---Playbook剧本编写

2023-12-20 16:51:08

playbook的组成部分

1、 tasks:任务

在目标主机上需要执行的操作。使用模块定义这些操作。每个任务都是一个模块的调用。

2、 variables:变量

用于存储和传递数据。类似于shell脚本中的变量。变量可以自定义。可以在playbook当中定义为全局变量,也可以外部传参。类似于shell脚本中的位置变量

3、 Templates:模板

用于生成配置文件。模板是包含占位符的文件。占位符由ansible在执行时转化为变量值。

4、 handlers:处理器

当需要有变更的时候,可以执行触发器。

5、 Roles:角色

类似于dockercompose。是一种组织和封装playbook的。允许把相关的任务、变量、模板和处理器组织成一个可复用的单元。

实例模板1:

vim test1.yml
#this is our first playbook
- name: first play
#相当于任务描述。一个name就是一个任务名。可以为空可以不写。
  gather_facts: false
#是否收集主机的相关信息。如果不写默认收集
#false:表示不检查。可以加快playbook的执行速度
  hosts: 20.0.0.20
#声明目标主机是谁。可以使用IP或者组名
  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
#修改httpd服务的默认的访问页面
     shell: echo "this is httpd" > /var/www/html/index.html
     notify: restart httpd
#notify:表示需要变更。交给handlers处理重启httpd服务
  handlers:
   - name: restart httpd
     service: name=httpd state=restarted

?检查yml文件的语法是否正确

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

检查有多少任务

ansible-playbook test.yaml --list-task

检查有多少主机生效

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

指定剧本

ansible-playbook test1.yml --start-at-task='install httpd'
#指定剧本从哪个任务开始执行

切换用户:

#this is our first playbook
- name: first play
#相当于任务描述。一个name就是一个任务名。可以为空可以不写。
  gather_facts: false
#是否收集主机的相关信息。如果不写默认收集
#false:表示不检查。可以加快playbook的执行速度
  hosts: 20.0.0.20
#声明目标主机是谁。可以使用IP或者组名
  remote_user: zyg
#在目标主机执行的用户
  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
#修改httpd服务的默认的访问页面
     shell: echo "this is httpd" > /var/www/html/index.html
     notify: restart httpd
#notify:表示需要变更。交给handlers处理重启httpd服务
  handlers:
   - name: restart httpd
     service: name=httpd state=restarted


become:yes
become_user:root
vim /etc/ansible/ansible.cfg
取消17行的注释
ansible-play test1.yml -K
#表示输入密码
#-K:内部声明更改用户,使用-K

指定用户操作

ansible-playbook test1.yml -u root -k
#如果没有声明更改用户,可以在外部指定用户
#-u:指定用户
#-k:手动输入密码

实例模板2:

声明和引用变量,以及外部传参变量

#this is second playbook!
#声明和引用变量,以及外部传参变量
- hosts: 20.0.0.20
  remote_user: root
  vars:
    groupname: zyg
    username: hmbb
  tasks:
   - name: create group
     group:
       name: "{{ groupname }}"
#引用前面设定好的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']['adress']}}"
       dest: /opt/bqb.txt

字典方式:

  vars:
    groupname: zyg
    username: hmbb

使用的是key-value的方式

使用符号-开头表示这是一个列表

表示包含所有主机变量的字典

 "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['adress'] }}"
 #表示包含所有主机变量的字典
 #inventory_hostname:目标主机的主机名
 #['ansible_default_ipv4']['adress']:获取目标主机名
 #表示获取目标主机的IP地址复制到目标文件里

外部传参

ansible-playbook test2.yml -e 'username=yst groupname=ymr'
#外部传参

playbook的条件判断

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

#this is when test
- hosts: all
#可以用主机的IP地址也可以使用组名
  remote_user: root
  tasks:
   - name: test when
     debug:
       msg: '位置判断'
#相当于shell脚本中的echo。满足条件就会打印。不满足则不打印
#msg:表示输出的内容
     when: ansible_default_ipv4.address == '20.0.0.30'

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]
      - [1,2,3,4]
#声明变量是item。playbook的内置变量,with_items,会把itme的值。遍历列表当中的a,b,c,d.
#虽然声明的列表是两个,但是with_items还是把两个列表当成整体进行遍历。

分组打印列表

- hosts: 20.0.0.30
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{{ item }}"
     with_list:
      - [a,b,c,d]
      - [1,2,3,4]
#with_list:分组打印

遍历循环在主机上创建目录

- hosts: 20.0.0.30
  remote_user: root
  gather_facts: false
  tasks:
   - name: create file
     file:
      path: "{{ item }}"
      state: touch
     with_items:
      - [/opt/a,/opt/b,/opt/c,/opt/d]
      - [/opt/1,/opt/2,/opt/3,/opt/4]

方法2:
- hosts: 20.0.0.30
  remote_user: root
  gather_facts: false
  tasks:
    - name: create file
      file:
        path: "{{ item }}"
        state: touch
      with_list:
        - /opt/a
        - /opt/b
        - /opt/c
        - /opt/d
        - /opt/1
        - /opt/2
        - /opt/3
        - /opt/4

同一列的数据组合输出

- hosts: 20.0.0.30
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{{ item }}"
     with_together:
      - [a,b,c,d]
      - [1,2,3,4]
#with_together:组循环,列表当中的值一一对应,打印出来。
#适用于组合搭配

根据列表数据循环匹配

- hosts: 20.0.0.30
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{{ item }}"
     with_nested:
      - [a,b,c,d]
      - [1,2,3,4]

#第一层:列表里面的元素定义了循环的次数
#第二层:相当于内循环

四种循环方式:

with_items
#最常用
with_list
#列表分组循环
with_together
#列表对应的列,数据结合的方式循环
with_nested
#相当于双重循环,第一层定义了循环次数,第二层表示第一层的每个元素会循环几次

#这些都是单循环

文章来源:https://blog.csdn.net/m0_75209491/article/details/135106155
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。