TASK任务控制:
1.playbook判断语句
ansible_distribution
1.根据被控端操作系统进行判断安装不同的软件包.
[root@mananger tasks]# cat t1.yaml
- hosts: webservers
tasks:
- name: Installed Httpd Server [ CentOS ]
yum:
name: httpd
state: present
when: ( ansible_distribution == "CentOS" )
- name: Installed Httpd2 Server [ Ubuntu ]
yum:
name: httpd2
state: present
when: ( ansible_distribution == "Ubuntu" )
1.主机名 (规范)
2.物理的cpu+内存
3.根据IP地址判断
4.不判断直接所有机器都安装
2.根据被控端主机的名称,进行判断
[root@mananger tasks]# cat t2.yaml
- hosts: all
tasks:
- name: Add Nginx Yum Repository
yum_repository:
name: nginx
description: Nginx Repository
baseurl: http://nginx.org/packages/centos/7/$basearch/
gpgcheck: no
when: ( ansible_hostname is match ("web*")) or ( ansible_hostname is match ("lb*"))
3.根据命令执行的结果进行判断
1)检查httpd服务是否存活,如果存活,就重启,否则就不重启.
[root@mananger tasks]# cat t3.yaml
- hosts: webservers
tasks:
- name: Check Httpd Server
shell: systemctl is-active httpd
ignore_errors: yes
register: check_httpd
- name: Restart Httpd Server
systemd:
name: httpd
state: restarted
when: ( check_httpd.rc == 0 )
4.对nginx服务进行安装 配置 检查 启动
每次修改配置,都需要检查语法,如果语法错误,则不重启Nginx
[root@mananger tasks]# cat t4.yaml
- hosts: webservers
tasks:
- name: Installed Nginx Server
yum:
name: nginx
state: present
- name: Configure Nginx Server
copy:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Restart Nginx Server
- name: Check Nginx Status
shell: /usr/sbin/nginx -t
register: Check_ngx
ignore_errors: yes
- name: Systemd Nginx Started
systemd:
name: nginx
state: started
enabled: yes
when: ( Check_ngx.rc == 0 )
handlers:
- name: Restart Nginx Server
systemd:
name: nginx
state: restarted
when: ( Check_ngx.rc == 0 )
2.playbook循环语句
列表循环 --> 安装多个软件 启动多个服务
1.批量启动服务: nginx php
[root@mananger tasks]# cat t5.yaml
- hosts: webservers
tasks:
- name: Systemctl Started Nginx Php Server
systemd:
name: "{{ item }}"
state: started
loop:
- nginx
- php-fpm
[root@mananger tasks]# cat t8.yaml .
- hosts: webservers
tasks:
- name: Installed Packages
yum:
name: "{{ item }}"
state: present
loop:
- nginx
- httpd-tools
- httpd
- tree
- wget
- zip
- vim
字典循环 --> 拷贝多个文件
[root@mananger tasks]# cat t9.yaml
- hosts: webservers
tasks:
- name: copy rsyncd.conf rsync.passwd
copy:
src: '{{ item.src }}'
dest: '{{ item.dest }}'
owner: '{{ item.owner }}'
group: '{{ item.group }}'
mode: '{{ item.mode }}'
loop:
- { src: rsyncd.conf.j2, dest: /etc/rsyncd.conf, mode: '0644', owner: root, group: root }
- { src: rsync.passwd.j2, dest: /etc/rsync.passwd, mode: '0600', owner: root, group: root }
3.palbyook handlers
监控
触发
只有发生变化才会被触发.
如果被触发多次,仅在所有正常的task任务执行完毕后, 执行一次
4.playbook tags标签
调试时,需要使用到.
1.对一个任务打一个标签
2.多对个任务打一个标签
-t 指定执行某一个标签对应的所有任务
–skip-tags 表示要跳过指定的标签任务
- name: Add Group www
group:
name: www
gid: 666
tags: test1 # 定义标签名称 ( 名称随意 )
[root@mananger web_cluster]# ansible-playbook nginx_php_server.yaml --skip-tags test1
[root@mananger web_cluster]# ansible-playbook nginx_php_server.yaml -t test1
4.playbook 错误忽略 ignore_errors
[root@mananger tasks]# cat t10.yaml
- hosts: webservers
tasks:
- name: Comamand
shell: /bin/false
ignore_errors: yes
- name: Touch FIle
file:
path: /tmp/tt
state: touch
5.playbook 异常处理
1.强制调用handlers运行 ( 少 )
[root@mananger tasks]# cat t11.yaml
- hosts: webservers
force_handlers: yes
tasks:
- name: Touch File
file:
path: /tmp/ansible_tt
state: touch
notify: Restart Nginx Server
- name: Installed Packages
yum:
name: sb
state: present
handlers:
- name: Restart Nginx Server
systemd:
name: nginx
state: restarted
2.如果tasks任务对被控端没有影响,但每次都是change状态时, 我们可以抑制状态
[root@mananger tasks]# cat t12.yaml
- hosts: webservers
tasks:
- name: Get Netstat State
shell:
cmd: netstat -lntp
register: Net_status
changed_when: false
- name: Output Net Status Vaiables
debug:
msg: "{{ Net_status.stdout_lines }}"
使用changed_when判断服务的状态
[root@mananger tasks]# cat t13.yaml
- hosts: webservers
tasks:
- name: Installed Nginx Server
yum:
name: nginx
state: present
- name: Configure Nginx Server
copy:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Restart Nginx Server
- name: Check Nginx Status
shell: /usr/sbin/nginx -t
register: Check_ngx
changed_when:
- Check_ngx.stdout.find('successful') # 如果有successful则认为成功,继续. 否则就抛出异常
- false
- name: Systemd Nginx Started
systemd:
name: nginx
state: started
enabled: yes
handlers:
- name: Restart Nginx Server
systemd:
name: nginx
state: restarted
6.jinja2
1.使用变量方式
[root@mananger tasks]# cat motd.j2
Welcome to {{ ansible_hostname }}
This system total Memory is: {{ ansible_memtotal_mb }} MB
This system free Memory is: {{ ansible_memfree_mb }} MB
[root@mananger tasks]# cat j1.yaml
- hosts: webservers
tasks:
- name: copy motd file
template:
src: motd.j2
dest: /etc/motd
2.使用循环的方式:
{% for i in EXPR %}…{% endfor%}
[root@mananger tasks]# cat nginx_proxy.conf.j2
upstream web {
{% for host in groups['webservers'] %}
server {{host}}:80;
{% endfor %}
}
server {
listen 80;
server_name xx.etiantian.org;
location / {
proxy_pass http://web;
}
}
判断语句:
keepalived:
1.通过inventory设定相同变量,不同的值. ( 1个配置文件 )
2.通过判断主机名称,根据不同的主机名称下发不同的配置文件 ( 2个配置文件 )
3.通过jinja的判断来实现. ( 一个配置文件 )
{% if EXPR %}…{% elif EXPR %}…{% endif%} 作为条件判断
[root@mananger tasks]# cat keep.conf.j2
global_defs {
router_id {{ ansible_hostname }}
}
vrrp_instance VI_1 {
{% if ansible_hostname == "web01" %}
priority 150
state MASTER
{% elif ansible_hostname == "web02" %}
priority 100
state BACKUP
{% endif %}
interface eth0
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
#7.Ansible roles
1.已知的目录结构:
mkdir nfs-server/{tasks,handlers,templates,files}
2.定义一个yaml文件,调用角色
- hosts: webservers
roles:- role: nfs-server
[root@mananger roles]# mkdir nfs-server/{tasks,handlers,templates} -p
[root@mananger roles]# tree nfs-server/
nfs-server/
├── handlers
│ └── main.yml
├── tasks
│ └── main.yml
└── templates
└── exports.j2
[root@mananger roles]# cat nfs-server/tasks/main.yml
- name: Installed NFS Server
yum:
name: nfs-utils
state: present
- name: Configure NFS Exports
template:
src: exports.j2
dest: /etc/exports
owner: root
group: root
mode: 0644
notify: Restart NFS Server
- name: Group Gdx 5678
group:
name: gdx
gid: 5678
- name: User Gdx 5678
user:
name: gdx
uid: 5678
group: '5678'
shell: /sbin/nologin
create_home: no
- name: Create NFS Share Direcotry
file:
path: /data
state: directory
owner: gdx
group: gdx
- name: Systemctl NFS Server
systemd:
name: nfs
state: started
enabled: yes
[root@mananger roles]# cat nfs-server/handlers/main.yml
- name: Restart NFS Server
systemd:
name: nfs
state: restarted
[root@mananger roles]# cat nfs-server/templates/exports.j2
/data 172.16.1.0/24(rw,all_squash,anonuid=5678,anongid=5678)
[root@mananger roles]# cat top.yml
- hosts: webservers
roles:
- role: nfs-server