三千年读史无外乎功名利禄,九万里悟道终归是诗酒田园。

Ansible用法进阶- 变量传递与playbook编写

playbook的核心元素: – tasks: 任务 (最关键,最核心)

  • variables: 变量
  • templates: 处理器
  • roles: 角色

变量: – facts

  • –extra-vars name=value name=value
  • role定义
  • Inventory中的变量:

主机变量 > hostname name=value name=value

组变量 > [group:vars] name=value name=value

将变量传递给playbook

1.通过facts(setup模块),里面返回的变量可以直接调用

facts是有正在通信的远程目标主机发回的信息,这些信息被保存在ansible变量汇总,要获取指定远程主机所支持的所有facts,可使用如下命令进行:

ansible hostname -m setup

2.通过命令行传递变量

在运行playbook的时候也可以传递一些变量供palybook使用,示例如下:

ansible-playbook test.yml --extra-vars hosts=www user=nginx
##这样一来hosts、user变量可以在test.yml里面直接调用

3.通过roles传递变量

当给一个主机应用角色的时候可以传递变量,然后在角色内使用这些变量,示例:


- hosts: webservers
  roles:
    - common
    - { role: foo_app_instance, dir:'/web/htdocs/a.com',port:8080 }

4.主机变量

可以在inventory中定义时为其添加主机变量以便于在playbook中使用,例如:

[webserveers]
www1.baidu.com http_port=80 maxRequestsPerChild=808
www2.baidu.com http_port=8080 maxRequestPerChild=909

4.1 组变量

组变量是指赋予给指定组内所有主机上的playbook总可用的变量。例如:

[webservers]
www1.baidu.com
www2.baidu.com
[webservers:vars]
ntp_server=cn.pool.ntp.org
nfs_server=nfs.baidu.com

4.2 组嵌套

inventory中,组还可以包含其他的组,并且也可以向组中的主机指定变量。不过这些变量只能在ansible-playbook使用,而ansible不支持,例如:

[aoache]
httpd1.baidu.com
httpd2.baidu.com

[nginx]
ngx1.baidu.com
ngx2.baidu.com

[webservers:children]
apache
nginx

4.3 inventory参数

ansible基于ssh连接inventory中指定的远程主机时,还可以通过参数指定其交互方式,这些参数如下所示: 这样就可以通过密码的方式连接,而不需要秘钥

ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
ansible_connection
ansible_ssh_private_key_file
ansible_shell_type
ansible_python_interpreter

5.ansible playbooks示例

示例一:

创建·nginx.yml·,内容如下:

- hosts: websrvs
  remote_user: root
  tasks:
  - name: create nginx group
    group: name=nginx system=yes gid=208
    sudo : yes     ##用sudo执行命令
  - name: create nginx user
    user: name=nginx uid=208 group=nginx system=yes

- hosts: dbsrvs
  remote_user: root
  tasks:
  - name: copy file to dbsrvs
    copy: src=/etc/inittab dest=/tmp/inittab.ans

之后使用ansible-playbook nginx.yml来运行我们编辑好的playbook以任务(tasks)为中心,在所有主机上完成(所有主机执行完第一个task再继续第二个task) 如果命令或脚本的退出码不为零(妨碍下一个task运行),可以使用如下方式替代:

tasks:
   - name: run this command and ignore the result
     shell: /usr/bin/somecommand || /bin/true

或者使用ignore_errors来忽略错误信息:

tasks:
    - name: run this command and ignore the result
      shell: /usr/bin/somecommand
      ignore_errors: True
示例二:

创建一个安装httpd、修改配置文件、启动httpd服务的apache.yml文件:

- hosts: websrvs
  remote_user: root
  tasks:
  - name: install httpd package
    yum: name=httpd state=latest

  - name: install configuration file for httpd
    copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf

  - name: start httpd service
    service: enabled=true name=httpd state=started

handlers

用于当关注的资源发生变化时才去的一定的操作 示例二中,执行完apache.yml之后,如果/root/conf/httpd.conf文件发生改变,会再把文件copy一份过去,虽说配置文件复制过去了,但是服务没有apache重启,apache依旧读取的是原来的httpd.conf,这时候就是handles的作用了 示例二修改如下即可:

- hosts: websrvs
  remote_user: root
  tasks:
  - name: install httpd package
    yum: name=httpd state=latest
  - name: install configuration file for httpd
    copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify:
    - restart httpd
  - name: start httpd service
    service: enabled=true name=httpd state=started
  handlers:
    - name: restart httpd
      service: name=httpd state=restarted

变量

上述示例中,可以通过在yml文件中定义变量然后引用,变量用{{ }}括起来:

hosts: websrvs
remote_user: root
vars:

 - package: httpd
 - service: httpd
   tasks:
- name: install httpd package
  yum: name={{ package }} state=latest
- name: install configuration file for httpd
  copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
  notify:
  - restart httpd
- name: start httpd service
  service: enabled=true name={{ package }} state=started
  handlers:
  - name: restart httpd
    service: name={{ service }} state=restarted

可以调用的变量不仅仅只有yml中定义的变量,也可以是ansible中所定义的所有变量(比如facts) 变量调用示例:

- hosts: websrvs
  remote_user: root
  tasks:
  - name: copy file
    copy: content={{ ansible_all_ipv4_addresses }} dest=/tmp/vars

执行后,/tmp/vars文件内容为[172.30.0.12]inventory定义的变量(/etc/ansible/hosts)也可以直接调用。

赞(19)
转载请注明出处:RokasYang's Blog » Ansible用法进阶-