ansible-playbook
使用ansible-playbook命令执行playbook时,ansible会先将playbook 的task解析成python文件的命令,然后通过ssh连接到host(Managed node),通过sftp/scp将解析的python文件传输到host机器上去,然后使用–become-user指定的账号或者是默认账号admin调用host机器上安装的python执行相应的命令
playbook是ansible用于配置,部署,和管理被节点的剧本
通过playbook的详细描述,执行其中的一些列tasks,可以让远端的主机达到预期的状态。playbook就像ansible控制器给被控节点列出的一系列to-do-list,而且被控节点必须要完成
playbook顾名思义,即剧本,现实生活中演员按照剧本表演,在ansible中,这次由被控计算机表演,进行安装,部署应用,提供对外的服务等,以及组织计算机处理各种各样的事情。
1 ansible-playbook参数介绍
ansible可用的选项如下:
-v:输出详细的执行过程信息,可以得到执行过程所有的信息。
-i PATH:指定inventory信息,默认为/etc/ansible/hosts。
-f:并发线程数,默认为5个线程。
-private-key=PRIVATE_KEY_FILE:指定密钥文件。
-m:指定执行使用的模块。
-M:指定模块的存放路径,默认为/usr/share/ansible,也可以通过ANSIBLE_LIBRARY来设定默认路径。
-a:指定模块参数。
-u:指定远程主机以哪个用户运行命令。
-l:限制运行主机,等同于“–limit”。
–list-hosts:列出符合条件的主机列表,不执行任何命令。
2 ansible-playbook变量
变量优先级:
命令行定义变量 > play中的vars_files > play中的vars变量 > host_vars中定义的变量> group_vars/组 > group_vars/all > inventory定义的变量
2.1 通过vars/set_fact定义变量:
playbook中定义变量vars,变量用 "{{变量}}" 表示
hosts:在ansible 章节介绍的 /etc/ansible/hosts 里面定义主机名
remote_user: 登陆的用户
vars: 配置变量
tasks: 需要执行命令
set_fact: 定义变量并赋值
debug: 打印需要内容
- hosts: tx_151
remote_user: root
vars:
testvar1: test1
tasks:
- set_fact:
testvar2: "test2"
- debug:
msg: "{{testvar1}} {{testvar2}} "
2.2 ansible内置系统变量
ansible_version:ansible版本号
inventory_hostname:获取到被操作的当前主机的主机名称
groups_names:内置变量groups
inventory_dir:ansible主机中清单文件的存放路径,默认inventory_dir对应的值为/etc/ansible,默认的文件路径/etc/ansible/hosts
- hosts: vm3
remote_user: root
tasks:
- debug:
msg: "系统变量:{{ ansible_version }} {{ inventory_hostname }} {{ group_names }} {{inventory_dir}}"
yaml语法:
# vim apache.yaml
- hosts: vm3
tasks:
- name: install httpd package
yum: name=httpd state=present
- name: copy httpd.conf
copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/httpd.conf
#复制http.conf过去,/tmp/httpd.conf在本机上要存在
notify: restart httpd #当http.conf发生改变时,通知给相应的handlers
tags:restart_httpd #打标签
- name: ensure httpd running
service: name=httpd state=started enabled=yes
tags: start_httpd #打标签
handlers:
- name: restart httpd
service: name=httpd state=restarted
-----------------------------------------------------------------------------------
- host: # 针对主机对象
tasks: # 主任务列表
- name: # 任务名
yum: # 任务
notify: # 引用处理程序
handlers: # 定义处理程序
- name: # 任务名
service: # 任务
语法检查:
ansible-playbook apache.yaml --syntax-check
ansible-playbook apache.yaml --list-tasks
ansible-playbook apache.yaml --list-hosts
执行:
ansible-playbook apache.yaml
任务可以通过“tags”打标签,而后可以在ansible-playbook命令上使用-t指定进行调用:
ansible-playbook apache.yaml -t restart_httpd
2.3 playbook的变量可以定义在一个专门存放变量的文件中
vi vars01.yml
web_package: httpd
db_package: mariadb-server
ftp_package: vsftpd
引用了变量文件vars01.yml 的写法
#play
- hosts: webservers
vars_files: ./vars01.yml
tasks:
- name: Installed Httpd Service
yum:
name:
- "{{ web_package }}"
- "{{ db_package }}"
- "{{ ftp_package }}"
state: present
2.4 更好的方式是在ansible的项目目录中创建额外的两个变量目录,分别是host_vars 和 group_vars
group_vars 目录下必须存放的是和inventory清单文件中定义的组名一致
cat /etc/ansible/hosts
[webservers]
web01 ansible_ssh_host=172.16.1.7
web02 ansible_ssh_host=172.16.1.8
[mysql]
mysql01 ansible_ssh_host=192.168.1.85
cat /etc/ansible/group_vars/webservers #只针对/etc/ansible/hosts定义的webservers主机生效
web_package: nginx
ftp_package: vsftpd
cat /etc/ansible/group_vars/all #对/etc/ansible/hosts定义的所有主机都生效
httpd_package: httpd
cat /etc/ansible/host_vars/mysql
mysql_package: mysql
注意:系统提供了特殊的组,"all",也就是说在group_vars目录下创建一个all文件,定义变量对所有的主机都生效
host_vars目录下存放的是某个host所需要定义的变量,这个变量优先级会高于group_vars 中定义的变量
2.5 通过命令行覆盖变量
通过命令行覆盖变量,inventory的变量会被playbook文件中覆盖,这两种方式的变量都会被命令行直接指定的变量覆盖,使用参数--extra-vars或-e设定变量
ansible-playbook test.yml -e "web_package=nginx" -e "ftp_package=vsftpd"
2.6 ansible变量层级定义
vi vars02.yaml
rainbow:
web:
web_package: httpd
db_package: mariadb-server
ftp_package: vsftpd
code:
web:
filename: code_web_filename
在配置playbook中引用:
- hosts: webservers
vars_file: vars02.yml
tasks:
- name: install package
yum: name= "{{ rainbow.we.web_package }}"
- name:
file: path="{{ code.web.filename}}" state=touch