4 ansible-playbook
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