安装
yum -y install epel-release
yum -y install ansible
配置文件
inventory = /etc/ansible/hosts #这个参数表示资源清单inventory文件的位置
library = /usr/share/ansible #指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
forks = 5 #并发连接数,默认为5
sudo_user = root #设置默认执行命令的用户
remote_port = 22 #指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全
host_key_checking = False #设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例
timeout = 60 #设置SSH连接的超时时间,单位为秒
log_path = /var/log/ansible.log #指定一个存储ansible日志的文件(默认不记录日志)
命令
/usr/bin/ansible Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
/usr/bin/ansible-doc Ansible 模块功能查看工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块 的官网平台,基于网络的
/usr/bin/ansible-playbook Ansible 定制自动化的任务集编排工具
ansible-doc -l #获取全部模块的信息
ansible-doc -s MOD_NAME #获取指定模块的使用帮助
例如:
ansible-doc -l |grep mysql
mysql_db Add or remove MySQL databases from a remote...
mysql_replication Manage MySQL replication
mysql_user Adds or removes a user from a MySQL databas...
mysql_variables Manage MySQL global variables
[root@server ~]# ansible-doc -s mysql_user
hosts
test01 ansible_host=x.x.x.x ansible_user=ansible
主机别名 ip
#1.生成私钥
[root@server ~]# ssh-keygen
#2.向主机分发私钥
[root@server ~]# ssh-copy-id root@192.168.37.122
-bash: ssh-copy-id: command not found
少包
yum -y install openssh-clientsansible
authorized_keys:存放远程免密登录的公钥,主要通过这个文件记录多台机器的公钥
id_rsa : 生成的私钥文件
id_rsa.pub : 生成的公钥文件
know_hosts : 已知的主机公钥清单
如果希望ssh公钥生效需满足至少下面两个条件:
1) .ssh目录的权限必须是700
2) .ssh/authorized_keys文件权限必须是600
ansible_host # 远程主机
ansible_port # 指定远程主机ssh端口
ansible_user # ssh连接远程主机的用户,默认root
ansible_ssh_pass # 连接远程主机使用的密码,在文件中明文,建议使用--ask-pass或者使用SSH keys
ansible_sudo_pass # sudo密码, 建议使用--ask-sudo-pass
ansible_connection # 指定连接类型: local, ssh, paramiko
ansible_ssh_private_key_file # ssh 连接使用的私钥
ansible_shell_type # 指定连接对端的shell类型, 默认sh,支持csh,fish
ansible_python_interpreter # 指定对端使用的python编译器的路径
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
机器分组 并发运行数 选择模块 参数
-a MODULE_ARGS #模块参数
-C, --check #检查语法
-f FORKS #并发
--list-hosts #列出主机列表
-m MODULE_NAME #模块名字
-b,--become:特权方式运行命令。等同于添加 ‘sudo:’ 或 ‘su:’ ,默认为sudo
-o 使用精简的输出
ansible-playbook --syntax-check xxx.yml 检查语法错误
ansible-galaxy init role名称 生成role
例子:
ansible webservers -m command -a "ss -ntlp"
ansible webservers -m ping
# 匹配apache组中有,但是nginx组中没有的所有主机
[root@ansible ~]# ansible 'apache:!nginx' -m ping -o
# 匹配apache组和nginx组中都有的机器(交集)
[root@ansible ~]# ansible 'apache:&nginx' -m ping -o
# 匹配apache组nginx组两个组所有的机器(并集);等于ansible apache,nginx -m ping
[root@ansible ~]# ansible 'apache:nginx' -m ping -o
playbook
Ansible的与节点有关的重要术语包括控制节点,受管节点,清单和主机文件:
控制节点(Control node):指安装了Ansible的主机,也叫Ansible服务器端,管理机。 Ansible控制节点主要用于发布运行任务,执行控制命令。Ansible的程序都安装在控制节点上,控制节点需要安装Python和Ansible所需的各种依赖库。注意:目前Ansible还不能安装在Windows下。
受控节点(Managed nodes):也叫客户机,就是想用Ansible执行任务的客户服务器。
清单(Inventory):受控节点的列表,就是所有要管理的主机列表。
host文件:清单列表通常保存在一个名为host文件中。在host文件中,可以使用IP地址或者主机名来表示具体的管理主机和认证信息,并可以根据主机的用户进行分组。缺省文件:/etc/ansible/hosts,可以通过-i指定自定义的host文件。
模块(Modules):模块是Ansible执行特定任务的代码块。比如:添加用户,上传文件和对客户机执行ping操作等。Ansible现在默认自带450多个模块,Ansible Galaxy公共存储库则包含大约1600个模块。
任务(Task):是Ansible客户机上执行的操作。可以使用ad-hoc单行命令执行一个任务。
剧本(Playbook):是利用YAML标记语言编写的可重复执行的任务的列表,playbook实现任务的更便捷的读写和贡献。比如,在Github上有大量的Ansible playbooks共享。
角色(roles):角色是Ansible 1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。
playbooks的组成部分
Target section: 定义要运行playbook的远程主机组
hosts: hosts用于指定要执行指定任务的主机,其可以是一个或多个由冒号分隔主机组
user: 指定远程主机上的执行任务的用户,还可以指定sudo用户等
Variable section: 定义playbook运行时使用的变量
Task section: 定义要在远程主机上运行的任务列表
name: 每个任务都有name,建议描述任务执行步骤,未通过name会用执行结果作为name
'module:options': 调用的module和传入的参数args
Handler section: 定义task完成后需要调用的任务
notify: 在Task Section在每个play的最后触发,调用在hendler中定义的操作
handler: 也是task的列表
playbook执行不指定默认使用ansible/roles/下面的角色,可以编辑/etc/ansible/ansible.cfg配置文件,设置roles_path
如testrole,一般建以下目录
defaults files handlers meta tasks templates vars
变量,优先级按 调用playbook时使用"-e"选项传入参数>>>>> vars/main.yml >>> 指定 >>>>defaults/main.yml
ansible-playbook -e testvar=‘usethis’ test.yml
主机变量的优先级低于vars/main.yml
在默认情况下,角色中的变量是全局可访问的,可将变量变成角色私有的,设置/etc/ansible/ansible.cfg文件,将private_role_vars的值设置为yes
- hosts: test70
roles:
- role: testrole
vars:
testvar: "www.baidu.com"
默认情况下,playbook只会调用一次同一角色
要多次调用同一个角色,有两种方法,如下:
方法一:设置角色的allow_duplicates属性 ,让其支持重复的调用。
方法二:调用角色时,传入的参数值不同。
方法一需要为角色设置allow_duplicates属性,而此属性需要设置在meta/main.yml文件中,所以我们需要
在testrole中创建meta/main.yml文件,写入如下内容:
allow_duplicates: true
方法二
- hosts: test70
roles:
- role: testrole
vars:
testvar: "aaaaa"
- role: testrole
vars:
testvar: "bbbbb"
templates
testrole中需要使用一个名为test.conf.j2的模板文件,那么我们就将test.conf.j2文件放置在testrole/templates/目录中,test.conf.j2文件内容如下,可以引用变量
something in template
woshigetemplate;
{{ template_var }} ##配置文件可以引入变量增加灵活性
模板文件中使用到了 template_var变量,我们可以为 template_var变量定义一个默认变量
template_var: "template"
- name: test_handler
debug:
msg: "zhixingchenggong"
一个task
- debug:
msg: "hello {{testvar}}!"
- template:
src: test.conf.j2
dest: /opt/test.conf ###类似于复制
changed_when: true ##类似于判断机制,上面的执行成功则执行下面的notify
notify: test_handler