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

 

posted @ 2022-11-14 23:30  Sky-wings  阅读(59)  评论(0编辑  收藏  举报