Linux 命令 Ansible-playbook
使用
ansible-playbook -i inventory.ini xxx.yml -k -K
-i 指定主机
-e 设置运行变量
-k 执行之后需要输入 ssh 连接用户的密码,如果做了中控机到所有节点的互信,则不需要此参数
-K 执行之后需要输入 sudo 所需的密码,如果使用 root 用户或者 sudo 无需密码,则不需要此参数
- name: create user
hosts: all
user: root
gather_facts: false
vars:
- user: "test"
tasks:
- name: create user
user: name="{{ user }}"
- name: remove user
user: name="{{ user }}" state=absent
- debug:
msg: "System \{\{ inventory_hostname \}\} has gateway \{\{ ansible_default_ipv4.gateway \}\}"
role 中使用变量
---
- hosts: default
roles:
- role: ansible-elastic-centos
elastic_name: elasticsearch
elastic_enabled: yes
elastic_state: started
elastic_version: 5.3.0
elastic_java: java-1.8.0-openjdk
become: yes
nsq 在role中使用变量
ansible-galaxy install ernestas-poskus.ansible-nsq
- name: Installing NSQ
hosts: nsqs
sudo: yes
roles:
- role: ernestas-poskus.ansible-nsq
nsq_lookupd_tcp_addresses: "{{ groups['nsqs']|map('extract', hostvars, ['ansible_eth1', 'ipv4', 'address'])|list }}"
nsq_lookupd_http_addresses: "{{ groups['nsqs']|map('extract', hostvars, ['ansible_eth1', 'ipv4', 'address'])|list }}"
extended_etcd_endpoints_list: "{{ groups['etcd'] | map('extract', hostvars, ['ansible_default_ipv4','address']) | map('regex_replace', '^(.*)$','https://\1:2379') | list }}"
时间同步 chrony
ansible-galaxy install influxdata.chrony
mariadb 集群
- ansible-galaxy install mrlesmithjr.mariadb-galera-cluster mrlesmithjr.etc-hosts
- /etc/ansible/roles/mrlesmithjr.mariadb-galera-cluster
3. Playbook
-i 指定 host Inventory
-e 通过命令行设置变量
### Playbook 中定义的变量
用户可以在 Playbook 中,通过 vars 关键字自定义变量,使用时用 {{ }} 引用以来即可。
Playbook 中定义和使用的变量的方法
例如下面的例子中,用户定义变量名为 http_port,其值为为 80。在 tasks firewalld 中,通过 {{ http_port }} 引用。
- hosts: web
vars:
http_port: 80
remote_user: root
tasks:- name: insert firewalld rule for httpd
firewalld: port={{ http_port }}/tcp permanent=true state=enabled immediate=yes
- name: insert firewalld rule for httpd
把变量放在单独的文件中
当变量比较多的时候,或者变量需要在多个 playbook 中重用的时候,可以把变量放到一个单独的文件中。通过关键字 var_files 把文件中定义的变量引入 playbook 中,使用变量的方法和在本文件中定义的变量相同。
- hosts: web
remote_user: root
vars_files:
- vars/server_vars.yml
tasks:
- name: insert firewalld rule for httpd
firewalld: port=\{\{ http_port \}\}/tcp permanent=true state=enabled immediate=yes
变量文件 vars/server_vars.yml 的内容为:
http_port: 80
### Playbook 通过命令行使用变量 -e
ansible-playbook main.yml -e "hosts=web user=root"
ansible-playbook main.yml -e "{'hosts':'vm-rhel7-1','user':'root'}"
# json 传递参数ansible-playbook main.yml -e "@vars.json"
#文件传参
Playbook 变量覆盖
1. role defaults[1]
2. inventory 文件或脚本组 vars [2]
playbook group_vars / *
inventory 文件或脚本主机 vars [2]
inventory host_vars / *
playbook host_vars / *
host facts
role vars(在 `role/vars/main.yml` 中定义)
include_vars
set_facts / registered vars
--extra-vars (命令行中 -e 指定优先级最高)
基本上,进入 “角色默认值”(角色中的默认文件夹)的任何东西都是最有价值的,容易被覆盖的。 该角色的 vars 目录中的任何内容都会覆盖该命名空间中该变量的先前版本。 这里要遵循的一个想法是,在范围上越明确,命令行 - e 额外的 vars 总是胜出越多的优先级。 主机和 / 或库存变量可以胜过角色默认值,但不显式包括 vars 目录或 include_vars 任务。 )
基本上,进入 “角色默认值”(角色中的默认文件夹)的任何东西都是最有价值的,容易被覆盖的。 该角色的 vars 目录中的任何内容都会覆盖该命名空间中该变量的先前版本。 这里要遵循的一个想法是,在范围上越明确,命令行 - e 额外的 vars 总是胜出越多的优先级。 主机和 / 或库存变量可以胜过角色默认值,但不显式包括 vars 目录或 include_vars 任务。