Ansible自动化工具之Playbook剧本编写

发布时间:2023年12月20日

目录

Playbook的组成部分

实例模版

切换用户

指定声明用户

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

playbook的条件判断

?编辑

习题

?编辑

ansible-playbook的循环

item的循环

?编辑

list循环

?编辑

together的循环(列表对应的列,数据结合的方式循环)

?编辑

nested循环


Playbook的组成部分

1、task 任务:包含要在目标主机上执行的操作,使用模块定义这些操作,每个任务都是一个模块的调用

2、variables 变量:存储和传递数据,变量可以自定义,可以在Playbook当中定义为全局变量,也可以外部传参

3、Templates 模版:用于生成配置文件,模版是包含占位符的文件,占位符由Ansible在执行时转化为变量值

4、handler 处理器:当需要有变更的时候,可以执行触发器

5、Roles 角色:是一种组织和封装Playbook的,允许把相关的任务,变量,模版和处理器组成一个可复用的单元

实例模版
vim test.yml
#this is our first playbook
- name: first play
#一个name就是一个任务名,名字可以不写
  gather_facts: false
#是否收集目标主机的系统信息,false就是不收集
  hosts: 20.0.0.11
#执行的目标主机
  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
   - 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


#检查yaml文件的语法是否错误
ansible-playbook 文件名 --syntax-check 
#查看yml文件里面有几个任务
ansible-playbook  文件名 --list-task
#检查生效的目标主机
ansible-playbook  文件名 --list-hosts
#运行命令 
ansible-playbook 文件名

ansible-playbook 文件名 --start-at-task='install httpd'
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
切换用户
关闭免密
vim /etc/ansible/ansible.cfg
71行
注释掉

编写脚本
hosts: 20.0.0.11
#执行的目标主机
remote_user: xiaobu
become: yes
become_user: root
指定声明用户
在脚本里不声明用户,运行时,声明用户
ansible-playbook 脚本 -u root -k
声明和引用变量,以及外部传参变量
vim test1.yml
#this is second playbook!
#声明和引用变量,以及外部传参变量
- hosts: 20.0.0.11
  remote_user: root
  vars:
    groupname: xiaobu1
    username: xiaokai
#字典方式: key-value
#vars:
#-
#-
#列表list
  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'] }}"
#获取目标主机的IP地址,然后复制到目标文件
# 包含所有主机变量的字典
#inventory_hostname	目标主机名
#ansible_default_ipv4	获取目标主机名
#['ansible_default_ipv4']['address']	索引
       dest: /opt/test.txt

外部传参变量

vim test1.yml
#this is second playbook!
#声明和引用变量,以及外部传参变量
- hosts: 20.0.0.12
  remote_user: root
  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/test.txt

外部传参
ansible-playbook test1.yml -e 'username=xiaobu2 groupname=xiaokai1'
playbook的条件判断

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

vim test2.yml
#this is when test
- hosts: all
#可以用主机的IP地址,也可以是用组名,也可以用all
  remote_user: root
  tasks:
   - name: test when
     debug:
       msg: '位置判断'
#打印相当于echo msg: 输出的内容,debug: 用于脚本的调试,在正式脚本中可以去除
     when: ansible_default_ipv4.address == '20.0.0.11'
#when: ansible_default_ipv4.address == '20.0.0.11'或者 when: inventory_hostname != '20.0.0.11'
#ansible_default_ipv4.address != '20.0.0.11' 取反
习题

现在hosts all

条件1 IP 11:安装nginx

条件2 IP 12:安装httpd

#this is when test
- hosts: all
  remote_user: root
  tasks:
   - name: nginx
     yum: name=nginx
     when:  ansible_default_ipv4.address == '20.0.0.11'
   - name: nginx info
     debug:
       msg: '安装nginx'
     when:  ansible_default_ipv4.address == '20.0.0.11'
   - name: httpd
     yum: name=httpd
     when: ansible_default_ipv4.address == '20.0.0.12'
   - name: httpd info
     debug:
       msg: '安装httpd'
     when: ansible_default_ipv4.address == '20.0.0.12'
ansible-playbook的循环

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

item的循环

声明变量item,playbook的内置变量,with_items,会把item的值,遍历列表当中的a,b,c,d

vim test4.yml
- hosts: 20.0.0.12
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{{ item }}"
     with_items: 
           - [a,b,c,d]
           - [1,2,3,4]
#声明变量item,playbook的内置变量,with_items,会把item的值,遍历列表当中的a,b,c,d
#虽然我声明的列表是两个,但是with_items还是把两个列表当成整体进行遍历
list循环

列别分组循环

#分组打印
 with_list: 
           - [a,b,c,d]
           - [1,2,3,4]
           
- hosts: 20.0.0.12
  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
together的循环(列表对应的列,数据结合的方式循环)

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

- hosts: 20.0.0.12
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{{ item }}"
     with_together:
           - [a,b,c,d]
           - [1,2,3,4]
           - [A,B,C]
nested循环

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

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

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

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