|
Playbook
一个或过个play组成的列表
Playbook核心元素:
Hosts:--主机
Tasks -- 任务
Variables -- 变量;
Templates -- 模板 包含了模板语法的文本文件;
Handlers: -- 由特定条件触发的任务,才叫做Handlers;
Roles -- 角色
Tags -- 标签
notify -- 触发事件参数
Hosts -- 运行指定任务的目标主机
remoute-user -- 在远程主机上执行任务的用户
sudo_user
tasks -- 任务列表
调用模块,模块参数
格式:
1, action:module arguments
2, module:arguments
运行playbook的方式:
(1)测试
实例1:
vim first.yaml --yaml格式简单编写
- hosts: all
remote_user: root
tasks:
- name: create a user3
user: name=user3 system=true uid=307
- name: create a user2
user: name=user2 system=true uid=308
ansible-playbook --check first.yaml 只检测可能发生的改变,但不真正执行操作
ansible-playbook --list-hosts first.yaml 列出运行任务的主机
(2)运行
ansible-playbook first.yaml
注意: shell和command模块后面直接跟命令,而非ket=vaule类的参数列表
1,某任务的状态在运行后卫changed时,可通过notifly通知给相应的Handlers;
处理器:
Handlers -- 任务:在特定条件下触发,接受到其他任务的通知时被触发
notify
实例2:
vim web-2.yaml
- hosts: webser
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=present
- name: install configure file
copy: src=files/httpd.conf dest=/etc/httpd/conf/
notify: restart httpd
- name: start httpd service
service: name=httpd state=started
handlers:
- name: restart httpd
service: name=httpd state=restarted
实例3:
vim web-3.yaml
- hosts: webser
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=present
tags: insthttpd
- name: install configure file
copy: src=files/httpd.conf dest=/etc/httpd/conf/
tags: insthttpd
notify: restart httpd
- name: start httpd service
service: name=httpd state=started
tags: starthttpd
handlers:
- name: restart httpd
service: name=httpd state=restarted
2,任务可以通过tags打标签,而后可在ansible-playbook命令上使用,使用-t进行调用
ansible-playbook -t insthttpd --check web-3.yaml -- 只执行标签tags定义的内容
varlables:
1. facts -- 可直接调用
2. ansible-playbook命令的命令行中的自定义变量 -e VARS, --extra-vars=VARS
3. 通过roles传递变量;
4. Hosts Inventory -- 向不同的主机传递不同的变量
IP/HOSTNAME varalable=value var2=value2
向组中的主机传递相同的变量
实例4:
vim varlables.yaml
- hosts: webser
remote_user: root
tasks:
- name: install {{ pkname }}
yum: name={{ pkname }} state=present
ansible-playbook -e pkname=vsftpd state=present
实例5:
vim web-4.yaml
- hosts: webser
remote_user: root
tasks:
- name: set hostname
hostname: name={{ hname }}
vim /etc/ansible/hosts
[webser]
118.145.14.93 hname=www1
118.145.14.163 hname=www2
ansible-playbook hostname.yaml -- 通过hosts变量传递playbook变量
5. (注意)Inventory参数:
用于定义ansible远程连接目标主机时使用的参数,二期传递给playbook的变量
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
Templates
Templates模块 基于模板方式生成一个文件复制到远程主机
*src=
*dest=
owner=
group=
mode=
实例6:
- hosts: webser
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=present
- name: install conf file
template: src=files/nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
tags: instconf
- name: start nginx service
service: name=nginx state=started
handlers:
- name: restart nginx
service: name=nginx state=restarted
模板配置文件: nginx.conf.j2 格式后缀
worker_processes {{ ansible_processor_vcpu }};
liseten {{ http_port }}
vim /etc/ansible/hosts
[webser]
118.145.14.93 http_port=80 在hosts设置变量进行传递
118.145.14.163 http_port=8080
条件测试:
when语句: 在task中使用,jinja2的语法格式
实例7:
- hosts: webser
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=present
- name: install conf file to 6
template: src=files/nginx.conf.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version == "6" -- 判断操作系统 如果匹配则触发template定义
notify: restart nginx
tags: instconf
- name: install conf file to 5
template: src=files/nginx.conf.c5.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version == "5" -- 判断操作系统 如果匹配则触发template定义
notify: restart nginx
tags: instconf
- name: start nginx started
service: name=nginx state=started
handlers:
- name: restart nginx
service: name=nginx state=restarted
循环: 迭代,需要重复执行的任务
对迭代项的引用: 固定变量名为"item" 而后要在task中使用with_items给定要迭代的元素列表
列表方法
字符串
字典
- name: install some packages
yum: name={{ item }} state=present
whith_items:
- nginx
- memcached
- php-fpm
实例8:
- hosts: webser
remote_user: root
tasks:
- name: install some packaged
yum: name={{ item }} state=present
with_items:
- httpd
- mysql
实例9:
- hosts: webser
remote_user: root
tasks:
- name: add some groups
group: name={{ item }} state=present
with_items:
- group11
- group12
- name: add some users
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
- {name: 'user11',group: 'group11'}
- {name: 'user12',group: 'group12'}
############################################################################################
角色roles
角色集合:
roles/
mysql/
httpd/
nginx/
memcached/
每个角色,以特定的层级目录结构进行组织:
mysql/
files/ --存放由copy或script模块等调用的文件
template/ --查找所需要模板文件的目录
tasks/--至少应该包含一个名为main.yml的文件,其它文件需要在此文件用需要通过include进行包含
handlers/ --至少包含一个明文main.yml的文件,其它文件需要在此文件用需要通过include进行包含
vars/ --至少包含一个明文main.yml的文件,其它文件需要在此文件用需要通过include进行包含
meta/ --至少包含一个明文main.yml的文件,定义当前角色的特殊设定及其依赖关系,其它文件需要在此文件用需要通过include进行包含
default/ --设定默认变量时使用的此目录中的main.yml文件;
在playbook调用角色方法一:
- hosts:webser
remote_user: root
roles:
- mysql
- memcached
- nginx
在playbook调用角色方法二: 传递变量
- hosts: webser
remote_user: root
roles:
-{ role:nginx,username:nginx} --通过字典方法直接使用变量更改Nginx用户名
实例1: 实现roles目录层级结构执行ansible-playbook批量执行代码
/etc/ansible/roles/nginx/
├── default
├── files
├── handlers
│ └── main.yml
├── meta
├── tasks
│ └── main.yml
├── templates
│ └── nginx.conf.j2
└── vars
mkdir -p /etc/ansible/roles/nginx/{files,template,tasks,default,vars,handlers,meta}
vim /etc/roles/nginx/tasks/main.yml <--默认执行文件,如果需要创建其它文件include引用即可
- name: install nginx package
yum: name=nginx state=present
- name: install conf file
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: nginx restart
tags: instconf
- name: start nginx
service: name=nginx state=started
cp /root/files/nginx.conf.j2 /etc/ansible/roles/nginx/template/
vim /etc/ansible/roles/nginx/handlers/main.yml
- name: nginx restart
service: name=nginx state=restarted
方法一
vim /root/ansible/nginx.yml
- hosts: webser
remote_user: root
roles:
- nginx --直接调用roles目录下的nginx目录
方法二
vim /root/ansible/nginx.yml
- hosts: webser
remote_user: root
roles:
- { role:nginx,username:nginx} --键role用于指定角色名称; 后续的k/v用于传递变量给角色;;
还可以基于条件测试实现角色调用
方法三:
- hosts: all
remote_user: root
roles:
- { role: nginx , when: ansible_distribution_major_version == "6" } --根据判断进行roles安装
- { role: vsftp , when: ansible_hostname == "www1" }
vim /etc/ansible/roles/nginx/vars/main.yml
username: demon -- 通过vars 修改nginx配置文件用户名
vim /etc/ansible/roles/nginx/template/nginx.conf.j2
user {{ username }}; -- 将nginx.conf user: 改成vars设定好的变量名及调用
变量vars:
vars:
-var1:value1
-var2:value2
实例2:
- hosts: all
remote_user: root
vars: -- 定义变量列表形式
- username: testuser1
- groupname: testgroup1
tasks:
- name: create group
group: name={{ groupname }} state=present -- 模块直接调用变量
- name: create group
user: name={{ username }} state=present -- 模块直接调用变量 |
|
|