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
)也可以直接调用。