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

发布时间:2023年12月21日

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

playbook组成部分:

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

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

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

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

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

playbook的条件判断:

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

when是满足条件即执行,不满足不执行

循环:

ansible有多种循环模式,

with_items:循环遍历

with_list:列表分组循环

with_together:列表对应的列,数据结合的方式循环

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

实例模板:

要先vim /etc/ansible/hosts让他们主机之间ping的通

再写一个yml的配置文件

#this is our first playbook

- name: first play

??gather_facts: false

??hosts: 192.168.233.20

??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

检查yml的语法是否正确

运行脚本

指定任务从哪一步开始

切换用户实验:

要先vim /etc/ansible/hosts让他们主机之间ping的通

再写一个yml的配置文件

#this is our first playbook

- name: first play

#一个name就是一个任务名,名字可以不写

??gather_facts: false

#是否收集目标主机的系统信息,false就是不收集

??hosts: 192.168.233.20

#执行的目标主机是20

??remote_user: dn

??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

???- 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

打开配置文件,71行取消注释

指定用户,输入密码

也可以不在脚本里声明用户,在命令行输入用户

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

#this is second playbook!

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

- hosts: 192.168.233.20

??remote_user: root

??vars:

????groupname: guoqi

????username: wangdefu

??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地址,然后打印,复制到目标文件

???????dest: /opt/ky32.txt

"{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address']}}"

包含所有主机变量的字典

inventory_hostname:目标的主机名

ansible_default_ipv4:获取目标主机名

['ansible_default_ipv4']['address']:索引

用-e往ansible-playbook里面传参数

条件判断实验:

#this is when test

- hosts: all

#可以用主机的IP地址,也可以使用组名,也可以用all

??remote_user: root

??tasks:

???- name: test when

?????debug:

???????msg: '位置判断'

?????when: ansible_default_ipv4.address == '192.168.233.20'

(做这些之前要先在/etc/ansible/hosts里面把其他的IP地址删掉)

取反

#this is when test

- hosts: all

#可以用主机的IP地址,也可以使用组名,也可以用all

??remote_user: root

??tasks:

???- name: test when

?????debug:

???????msg: '位置判断'

#echo $a echo ok echo 123 debug=echo msg:输出的内容,用于脚本的调试,在正式脚本中要去除

?????when: ansible_default_ipv4.address != '192.168.233.20'

实验安装nginx和httpd:

20安装nginx

30安装httpd

- hosts: all

??remote_user: root

??tasks:

???- name: nginx

?????yum: name=nginx

???- name: nginx info

?????debug:

???????msg: "安装nginx"

(两个选一个用)

循环

- hosts: 192.168.233.30

??remote_user: root

??gather_facts: false

??tasks:

???- debug:

???????msg: "{{ item }}"

?????with_items: [a,b,c,d]

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

定义两个列表,但是会一块遍历打印出来

- hosts: 192.168.233.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,会把item的值,遍历>列表当中的a,b,c,d

#虽然我声明的列表是两个,但是with_items还是把两个列表当成整体进行

遍历

分组打印:

- hosts: 192.168.233.40

??remote_user: root

??gather_facts: false

??tasks:

???- debug:

???????msg: "{{ item }}"

?????with_list:

??????- [a,b,c,d]

??????- [1,2,3,4]

遍历循环在主机上创建文件实验:

双重循环实验:

- hosts: 192.168.233.40

??remote_user: root

??gather_facts: false

??tasks:

???- debug:

???????msg: "{{ item }}"

?????with_nested:

??????- [a,b,c,d]

??????- [1,2,3,4]

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

一键yum安装tree sl nginx httpd vsftpd dhcp软件:

- name: play1

??hosts: 192.168.233.40

??gather_facts: false

??tasks:

????- name: yum

??????yum: name= {{item}}

??????with_list:

????????- tree

????????- sl

????????- nginx

????????- httpd

????????- vsftpd

????????- dhcp

创建test1 2 3,然后把源主机的test1 2 3发给目标主机 再给一个判断的实验:

两个都可以用

Templates模块:

Jinja模板架构,通过模板可以实现向模板文件传参(python转义)把占位符参数传到配置文件中去

生成一个目标文本文件,传递变量到需要的配置文件当中(web开发)

声明占位符之后,往httpd里面塞东西实验:

- hosts: all

??remote_user: root

??vars:

????- package: httpd

????- service: httpd

??tasks:

????- name: install httpd

??????yum: name={{package}}

????- name: install configure file

??????template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf

??????notify:

????????- restart httpd

????- name: cfreate root_dir

??????file:

????????path: /etc/httpd/htdocs

????????state: directory

????- name: start httpd

??????service: name={{service}} enabled=true state=started

??handlers:

????- name: restart httpd

?????service: name={{service}} state=restarted

最下面的service要和上面的service对齐

httpd.conf.j2在文件当中配置的是占位符(声明的变量)

/etc/ansible/hosts 配置了主机的占位符名称和j2文件中的占位符一致(定义参数:占位符的参数的参数声明好)

playbook当中,用template模块来把参数传给目标的主机的配置文件

nginx实验:

端口号改成8080

root目录改成/opt/nginx/html

(其他步骤与http一样)

tags模块:

标签模块:标签模块,可以在playbook当中为任务设定标签(tags),我们在运行playbook时可以通过指定任务标签,来实现只运行设定的标签任务

例如:

- name

?tags:

???debug

--start-at-task=‘wdf’

任务标签的种类:

always:不管你是否指定了运行标签,任务都会执行

never:即使运行了指定标签,该任务也不会执行

debug:调试任务

setup:收集主机信息

自定义标签:

per_tasks:指定标签之前的任务

post_tasks:运行指定标签之后的任务

Roles模块:

roles又称为角色

ansible层次化,结构化的组织playbook,使用了rolse(角色)

可以根据层次结构,自动装载变量文件,task,以及handlers等等

roles:分别把变量 文件 任务 模块以及处理器,放在单独的目录当中,使用rolse模块来一键调用这些文件

roles:

-------web-------总目录,角色

files ?存放copy和sript模块调用的文件

templates ?存放j2的模板文件

tasks 包含任务的目录

--------main.yml ?角色运行的任务

handlers包含处理器的目录

---------main.yml

vars 存放变量的目录

---------main.yml

defaults 包含默认变量的目录

----------main.yml

meta包含元信息的目录

-----------main.yml

site.yml用来调用所有的配置文件

安装三个服务:

http

mysql

php

?

然后在20主机查看httpd、nginx、mysql

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