注意点
1.缩进问题
- 空格不对
- 段横杆后面没空格
- :后面没空格
2.单词拼错了
3.乱用参数
- mode: ‘0600’
- group: www
4.配置文件写错了
- rsync /backup
- nfs
- lsyncd /backup /data
5.模拟测试的坑
- -C 不成功不代表实际运行不成功
6.报错的坑
- 实际报错的行数不一定是真的,找一找附近,上面和下面
7.网络的坑
- YUM卡住,检查客户端机器是否能上网
不方便的地方
1.调试的时候所有步骤都得重新执行一遍
2.服务状态不改变
3.配文文件和剧本存放混乱
4.剧本都是分开的,需要分开执行
-注册变量
[root@m01 ~/yaml]# cat vars_ip.yml
- hosts: zabbix
tasks:-
name: 01-get ip address
shell: “echo {{ ansible_facts.eth1.ipv4.address }} > /root/ip_eth1.txt” -
name: 02-get hostname
shell: “cat /root/ip_eth1.txt”
register: cat_ip -
name: 02-out cat status
debug:
msg: “{{ cat_ip.stdout }}”
-
ansible服务管理
目前的情况:
- 要不然不重启,要不然每次都重启
理想中的情况:
- 配置文件发生了变化就重启,没变化就不重启,第一次安装直接启动
命令实现:
…
copy: src=/server/scripts/exports dest=/etc/
notify:
- restart nfs
…
handlers:
- name: restart nfs
service:
name: nfs
state: restarted
…
注意点:
1.重启多个服务,不用写2个handles,直接在handles下面写上name就可以了
2.缩进有问题
3.每次都重启,因为使用了-C,配置文件并没与真正的发过去
4.每次推送服务都会启动,配置文件一样也会启动,因为服务配置错误,根本就没正常启动
不完美的地方:
1.不能同时监控多个文件,分别重启多个服务
2.需要分开写多个copy和多个restart
循环
1.应用场景
- 安装多个软件
- 创建多个目录
- 复制多个文件
- 复制多个文件到不同的目录
- 不同的文件权限不一样
2.具体实现
单行模式:
- name: 04-copy rsyncd conf
copy: src=/server/scripts/rsyncd.conf dest=/etc/ - name: 05-copy passwd
copy: src=/server/scripts/rsync.passwd dest=/etc/
缩进模式:
-
name: 04-copy rsyncd conf
copy:
src: /server/scripts/rsyncd.conf
dest: /etc/ -
name: 05-copy passwd
copy:
src: /server/scripts/rsync.passwd
dest: /etc/
mode: 600
循环模式1:
- name: 04-copy rsyncd conf
copy:
src: “/server/scripts/{{ item }}”
dest: /etc/
loop:- rsyncd.conf
- rsync.passwd
循环模式2:可以两种风格混合
-
name: 05-create dir
file: dest=/data state=directory owner=www group=www -
name: 06-start rpcbind
service:
name: “{{ item }}”
state: started
enabled: yes
loop:- rpcbind
- nfs
多参数循环模式:
- name: 04-copy rsyncd conf
copy:
src: “/server/scripts/{{ item.src }}”
dest: /etc/
mode: “{{ item.mode }}”
loop:- { src: ‘rsyncd.conf’, mode: ‘644’ }
- { src: ‘rsync.passwd’, mode: ‘600’ }
例子:
[root@m01 /server/scripts/test]# cat loops.yaml
- hosts: 172.16.1.41
tasks:
- name: 01-create dir data and backuo
file:
path: "{{ item }}"
state: directory
owner: www
group: www
loop:
- /data
- /backup
变量
使用情景:
1.自定义某个名称,在任务中会多次引用
2.从主机收集的系统信息中提取某个变量并引用,例如网卡信息
自定义一个变量并引用
[root@m01 /server/scripts/test]# cat vars.yaml
-
hosts: 172.16.1.41
vars:
file_name: executivetasks:
- name: 01-use vars create dir
file:
path: “/root/{{ file_name }}”
state: directory
owner: www
group: www
- name: 01-use vars create dir
使用变量获取主机的eth1地址和主机名
[root@m01 ~/yaml]# cat vars_ip.yml
- hosts: zabbix
tasks:-
name: 01-get ip address
shell: “echo {{ ansible_facts.eth1.ipv4.address }} > /root/ip_eth1.txt” -
name: 02-get hostname
shell: “echo {{ ansible_facts.hostname }} > /root/hostname.txt”
-
在hosts文件里定义变量
[root@m01 ~]# tail -5 /etc/ansible/hosts
[backup]
172.16.1.41
[backup:vars]
file_name=“oldzhang”
注册变量
使用情景:将配置文件的状态注册成一个变量,方便其他任务引用
将配置文件的状态注册成一个服务变量并打印出来
例子:
- hosts: nfs
tasks:
- name: 01-echo hostname
shell: echo $(hostname)
register: nfs_hostname
- name: debug nfs_hostname
debug:
msg: "{{ item }}"
loop:
- "{{ nfs_hostname.stdout }}"
- "{{ nfs_hostname.cmd }}"
编写变量文件
[root@m01 ~]# cat /etc/ansible/roles/rsync/vars/main.yml
user_rsyncd: rsync_backup
passwd_rsyncd: executive
facts缓存
Ansible facts是在被管理追击上通过Ansible自动采集发现的变量。facts包含每台特定的主机信息:比如:被控端的主机名、IP地址、系统版本、cpu数量、内存状态、磁盘状态等等
实例:
#编辑
[root@m01 ~]# vim facts.yml
- hosts: web_group
tasks:
- name: Get Host Info
debug:
msg: >
Hostname "{{ ansible_fqdn }}" and IP "{{ ansible_default_ipv4.address }}"
#执行
[root@m01 ~]# ansible-playbook facts.yml
[root@m01 ~]# ansible-playbook facts.yml
#关闭facts
[root@m01 ~]# vim facts.yml
- hosts: web_group
gather_facts: no #关闭信息采集
tasks:
#facts 生成zabbix配置文件
- hosts: web_group
vars:
- zabbix_server: 172.16.1.71
tasks:
- name: copy zabbix agent conf
template:
src: ./zabbix_agentd.conf
dest: /tmp/zabbix_agentd.conf
#facts生成mysqld配置文件
- hosts: db_group
tasks:
- name: Install mysql server
yum:
name: mariadb-server
state: present
- name: copy mysql conf
template:
src: ./my.cnf
dest: /etc/my.cnf
[root@m01 ~]# vim /etc/my.cnf
[mysqld]
basedir=/usr
datadir=/var/lib/mysql/
socket=/var/lib/mysql/mysql.sock
log_error=/var/log/mariadb/mariadb.log
innodb_buffer_pool_size={{ ansible_memtotal_mb * 0.8 }}
条件语句
循环语句
标签
1.配置语法
- hosts: nfs
tasks:- name: 01-create group
group: name=www gid=666
tags: 01-create-group
- name: 01-create group
2.打印所有的tags
ansible-playbook --list-tags nfs_tag.yml
ansible-playbook --list-task nfs_tag.yml
3.只执行某一步和执行多步
ansible-playbook -t 06-start nfs_tag.yml
ansible-playbook -t 03-yum,06-start nfs_tag.yml
4.测试执行某一步
ansible-playbook -C -t 06-start nfs_tag.yml
5.跳过某一步
ansible-playbook --skip-tags=03-yum >nfs_tag.yml
6.跳过多步
ansible-playbook --skip-tags=03-yum,04-copy nfs_tag.yml
使用 man ansible-playbook 可查看相关参数
1.查看task列表
ansible-playbook --list-task nfs_tag.yml
2.选择从哪一个task开始执行
ansible-playbook --start-at-task=04-copy-nfs-conf nfs_tag.yml
注意!
如果你的task名称带空格,那么执行的时候要添加引号括起来
ansible-playbook --start-at-task=‘04-copy nfs conf’ nfs_tag.yml
ansible rolers 角色
给每个文件每个服务都安一个家
按服务拆分
按功能模块拆分
1.目录规划
目录必须建在/etc/ansible/roles下
[root@m01 /etc/ansible/roles]# tree
.
├── nfs #角色名称
│ ├── files #存放需要copy的文件
│ ├── handlers #触发任务剧本
│ ├── tasks #具体任务剧本
│ ├── templates #模版文件
│ └── vars #存放变量文件
2.创建目录
[root@m01 /etc/ansible/roles/nfs]# mkdir {vars,tasks,templates,handlers,files} -p
[root@m01 /etc/ansible/roles/nfs]# tree
.
├── files
├── handlers
├── tasks
├── templates
└── vars
3.编写task文件
[root@m01 /etc/ansible/roles]# cat nfs/tasks/main.yaml
-
name: 01-create group
group: name=www gid=666 -
name: 02-create user
user: name=www create_home=no shell=/sbin/nologin group=www uid=666 -
name: 03-yum install nfs
yum: name=nfs-utils state=installed -
name: 04-copy nfs conf
copy: src=exports dest=/etc/
notify:- restart nfs
-
name: 05-create dir
file: dest=/data state=directory owner=www group=www -
name: 06-start rpcbind
service:
name: “{{ item }}”
state: started
enabled: yes
loop:- rpcbind
- nfs
4.编写需要copy的配置文件
[root@m01 /etc/ansible/roles]# cat nfs/files/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/backup 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
5.编写handlers
[root@m01 /etc/ansible/roles]# cat nfs/handlers/main.yml
- name: restart nfs
service:
name: nfs
state: restarted
6.编写执行文件
[root@m01 /etc/ansible/roles]# cat site.yml
- hosts: nfs
roles:- nfs
7.测试角色剧本
ansible-playbook -C site.yml
ansible rolers 拆分初始化剧本
1.创建init角色和目录
[root@m01 /etc/ansible/roles]# mkdir init/{vars,tasks,templates,handlers,files} -p
[root@m01 /etc/ansible/roles]# ll
total 4
drwxr-xr-x. 7 root root 77 Sep 19 10:55 init
drwxr-xr-x. 7 root root 77 Sep 19 10:55 nfs
drwxr-xr-x. 7 root root 77 Sep 19 10:55 rsync
-rw-r–r--. 1 root root 51 Sep 19 11:44 site.yml
2.编写init的task文件
[root@m01 /etc/ansible/roles]# cat init/tasks/main.yaml
-
name: 01-create group
group: name=www gid=666 -
name: 02-create user
user: name=www create_home=no shell=/sbin/nologin group=www uid=666 -
name: 03-yum install nfs
yum:
name: “{{ item }}”
state: installed
loop:- nfs-utils
- rsync
-
name: 04-create dir
file:
dest: “{{ item }}”
state: directory
owner: www
group: www
loop:- /data/
- /backup/
3.其他的服务精简掉不需要操作
[root@m01 /etc/ansible/roles]# cat nfs/tasks/main.yaml
-
name: 01-copy nfs conf
copy: src=exports dest=/etc/
notify:- restart nfs
-
name: 02-start rpcbind
service:
name: “{{ item }}”
state: started
enabled: yes
loop:- rpcbind
- nfs
[root@m01 /etc/ansible/roles]# cat rsync/tasks/main.yaml
-
name: 01-copy rsyncd conf
copy:
src: “{{ item.src }}”
dest: /etc/
mode: “{{ item.mode }}”
loop:- { src: ‘rsyncd.conf’, mode: ‘644’ }
- { src: ‘rsync.passwd’, mode: ‘600’ }
notify: - restart rsyncd
-
name: 02-start rsyncd
service:
name: rsyncd
state: started
enabled: yes
4.编写执行文件
[root@m01 /etc/ansible/roles]# cat site.yml
- hosts: backup
roles:- init
- rsync
也可这样
- hosts: all
roles:
- { role: 'base' }
- { role: 'zabbix-agent' }
- hosts: db
roles:
- { role: 'mysql' }
- hosts: nfs
roles:
- { role: 'nfs' }
- hosts: backup
roles:
- { role: 'rsync' }
# Wordpress
- hosts: web
roles:
- { role: 'nginx' }
- { role: 'php-fpm' }
- { role: 'code/wordpress' }
- hosts: lb
roles:
- { role: 'nginx' }
- { role: 'proxy' }
- { role: 'keepalived' }
- hosts: zabbix
roles:
- { role: 'mysql' }
- { role: 'zabbix-server' }