一、安装及简易配置
1、服务端安装ansilbe IP:192.168.176.189
2、将所需管控主机添加至 /etc/ansible/hosts
3、添加 ssh秘钥进行认证
[root@master ~]# ssh-keygen -t rsa -P "" [root@master ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.176.191 [root@master ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.176.192
4、进行连通性测试:
[root@master ~]# ansible all -m ping
二、部分模块使用
1、usergroup
[root@master ~]# ansible all -m group -a "name=mygrp gid=3000 state=present" [root@master ~]# ansible all -m user -a "name=testusr uid=3000 groups=mygrp state=present"
2、copy
复制文件
[root@master ~]# ansible all -m copy -a "src=/etc/fstab dest=/tmpfstab.ansible mode=600"
复制目录
[root@master ~]# ansible all -m copy -a "src=/etc/pam.d/ dest=/tmp/copy "
输出文本
[root@master ~]# ansible all -m copy -a "content='hi test.txtn' dest=/tmp/hi.txt "
3、command
注意:command本身不使用shell 解析命令
[root@master ~]# ansible all -m command -a "ifconfig" [root@master ~]# ansible all -m command -a "chdir=/var/tmp mkdir test.dir"
[root@master ~]# ansible all -m command -a "echo test | passwd --stdin testuser"
4、 shell
[root@master ~]# ansible all -m shell -a "echo test | passwd --stdin testuser"
5、file
[root@master ~]# ansible all -m file -a "src=/var/tmp/fstab.ansible path=/var/tmp/fstab.link state=link" # 创建一个链接
6、cron
[root@master ~]# ansible all -m cron -a "minute=*/3 job='/usr/sbin/update 192.168.176.189 &> /dev/null' name=test" # 定义一个名为test的定时任务,每三分钟自动往189主机校时
7、yum
[root@master ~]# ansible all -m yum -a "name=nginx state=installed"
8、service
[root@master ~]# ansible all -m service -a "name=nginx state=started"
9、script
[root@master ~]# ansible all -m script -a "/tmp/test.sh"
三、playbook
yaml语法格式:
1、数组(清单): 短杆+空白字符作为起始
- Casaba - North或者:方括号围住,并用逗号+空白区隔
[milk, pump, pie]2、散列表(关联数组):
区块形式:缩进跟换行符
name: john age: 33内置形式:大括号中使用逗号+空白字符分隔
{name: john, age: 33}3、区块的字符:
两种方式:
1、使用(|字符):保存新行
2、使用(>字符) :折叠新行
Playbook
Playbook的核心元素:
Hosts:关联到的主机
Tasks:任务列表
Variables:变量
Templates:包含了模板语法的文本文件
Handlers:由特定条件触发的任务
Roles
playbook的基础组件:
Hosts:运行指定任务的目标主机
remoute_user:在远程主机上执行任务的用户
sudo_user:
tasks:任务列表
模块,模块参数;
格式:
(1)action:module arguments
(2)module:arguments
注意:shell和command模块后面直接跟命令,而非key=value类的参数列表
(1)某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers
(2)任务可通过“tags”打标签,而后可在ansible-playbook命令上使用-t指定进行调用
handlers:
任务,在特定条件下触发;
接受到其他任务的通知时被触发
notify :HANDLER TASK NAME
variables:
1、facts:可直接调用;
2、ansible-playbook 命令的命令行中的自定义变量
-e VARS, --extra-vars=VARS
3、通过roles传递变量
4、Host Inventory
a、向不同的主机传递不同的变量
IP/HOSTNAME varaiable=value var2=value2
b、向组中的主机传递相同的变量
[groupname:vars]
variable=value
注意:invertory参数:
用于定义ansible远程连接目标主机时使用的参数,而非传递给playbook的变量
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
运行playbook的方式
1、测试
ansible-playbook xx --check
只检测可能会发生的改变,但不好着呢正执行操作
ansible-playbook xx --list-hosts
列出运行任务的主机
2、运行
运行
1、
[root@master playbooks]# vim first.yaml[root@master playbooks]# ansible-playbook --syntax-check first.yaml # 检查playbook的.yaml文件语法错误[root@master playbooks]# ansible-playbook -C first.yaml # 干跑测试,不执行[root@master playbooks]# ansible-playbook first.yaml # 真正执行
2、
首先更改redis配置文件
[root@master playbooks]# vim /etc/redis.conf # 更改监听的ip及密码其次将文件复制到当前路径下
[root@master playbooks]# cp /etc/redis.conf .在更改yaml文件,新增如下内容,并测试文件语法,并干跑
没问题后直接执行
切换主机,虽然配置文件更改了,但是监听端口并未改变
3、
于是,新增yaml内部模块,handlers
# Handlers:由特定条件触发的任务
接收其他任务的通知时触发:
notify:HANDLER TASK NAME
[root@master playbooks]# cp first.yaml second.yaml [root@master playbooks]# vim second.yaml编辑redis.conf配置文件,新更改密码
[root@master playbooks]# ansible-playbook --syntax-check second.yaml [root@master playbooks]# ansible-playbook -C second.yaml [root@master playbooks]# ansible-playbook second.yaml4、
标签式执行任务
首先,继续更改redis配置文件,随后,标签式执行ansible
[root@master playbooks]# vim redis.conf [root@master playbooks]# ansible-playbook -t configfile second.yaml仅仅执行替换配置文件并重启
variables:
variables:
1、facts:可直接调用;
注意:可使用setup模块直接获取目标主机的facters
2、用户自定义变量:
a、ansible-playbook 命令的命令行中的自定义变量
-e VARS, --extra-vars=VARS
[root@master playbooks]# ansible-playbook -e pkagename=memcached -C fourth.yaml
b、 在playbook中定义变量的方法:
vars:
- var1:value1
- var2:value2
变量引用:{{ variable }}
[root@master playbooks]# ansible-playbook -e username=test five.yaml
3、通过roles传递变量
4、Host Inventory
a、向不同的主机传递不同的变量
IP/HOSTNAME varaiable=value var2=value2
b、向组中的主机传递相同的变量
[groupname:vars]
variable=value
注意:invertory参数:
用于定义ansible远程连接目标主机时使用的参数,而非传递给playbook的变量
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
四、模板:templates
模板:templates
文本文件,嵌套有脚本
Jinja2:
字面量:
字符串:使用单引号,或双引号
数字:整数,浮点数
列表:[item1, item2]
元组:(item1,item2)
字典:{key1:value1,key2:value2,}
算术运算:
+,-,*,/,等
比较操作:
==,!=等..
逻辑运算:
and,or,not
条件测试:
when语句,在task中使用,jinja2的语法格式:
循环:迭代,需要重复执行的任务;
对迭代的项引用,固定变量名为"item"
而后,要在task中使用with_items给定要迭代的元素列表;
列表方法:
字符串
字典
五、角色:roles
角色集合:
每个角色,以特定的层级目录结构进行组织:
mysql/
files/:存放由copy或script模块等调用的文件
templates/:template 模块查找所需要模板文件的目录
tasks/:至少应该包含一个名为main.yaml的文件,其他的文件需要在此文件中
通过include进行包含
handlers/:至少应该包含一个名为main.yml的文件,其他文件需要在此文件中通过
include进行包含
vars/:至少应该汉堡一个名为main.yml文件,其他文件需要在此文件中通过
include进行包含
meta/:至少应该包含一个名为main.yml文件,定义当前角色的特殊设定及依赖关系,其他文件需要在此文件中通过 include进行包含
default/:设定默认变量时使用此目录中的main.yml文件
在playbook调用角色方法1:



