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'
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]
#列表里面的元素定义了循环的次数,第二层列表相当于内循环
- name: play1
??hosts: 192.168.233.40
??gather_facts: false
??tasks:
????- name: yum
??????yum: name= {{item}}
??????with_list:
????????- tree
????????- sl
????????- nginx
????????- httpd
????????- vsftpd
????????- dhcp
两个都可以用
Jinja模板架构,通过模板可以实现向模板文件传参(python转义)把占位符参数传到配置文件中去
生成一个目标文本文件,传递变量到需要的配置文件当中(web开发)
- 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模块来把参数传给目标的主机的配置文件
端口号改成8080
root目录改成/opt/nginx/html
(其他步骤与http一样)
标签模块:标签模块,可以在playbook当中为任务设定标签(tags),我们在运行playbook时可以通过指定任务标签,来实现只运行设定的标签任务
例如:
- name
?tags:
???debug
--start-at-task=‘wdf’
任务标签的种类:
always:不管你是否指定了运行标签,任务都会执行
never:即使运行了指定标签,该任务也不会执行
debug:调试任务
setup:收集主机信息
自定义标签:
per_tasks:指定标签之前的任务
post_tasks:运行指定标签之后的任务
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