ansible的helloWorld
ansible 127.0.0.1 -m ping
通过类似helloWorld开始了解ansible的命令,上述命令是调用ansible的ping模块,ping 127.0.0.1这个地址。
再看另一条命令,-a 选项,代表-a选项用于传递模块所需要使用的参数
ansible testA -m fetch -a “src=/etc/fstab dest=/testdir/ansible/”
总结:
-
ansible 表示执行ansible命令
-
-m选项用于调用指定的模块
-
-a 选项用于传递模块所需要使用的参数
ansible 实用命令
- 列出ansible所支持的模块
ansible-doc -l - 查看某个模块的详细参数及释义
ansible-doc -s 模块名称,比如想查看fetch模块的参数ansible-doc -s fetch
ansible常用模块
- copy模块: 从主控机把文件复制到被控主机上
- file模块:可以帮助我们完成一些对文件的基本操作,比如,创建文件或目录、删除文件或目录、修改文件权限等。
- lineinfile模块: 可以借助lineinfile模块,确保”某一行文本”存在于指定的文件中,或者确保从文件中删除指定的”文本”(即确保指定的文本不存在于文件中),还可以根据正则表达式,替换”某一行文本”。
playbook
上面的命令都是使用命令行方式挨个输入的,ansible提供了playbook剧本的方式可以执行多个任务。上面的ping写成playbook的如下
---
# 测试ansible脚本
- name: start ping
hosts: consul
tags:
- test_ping_consul
tasks:
- name: ping consul
ping:
name表示该任务名称,标记用。
hosts 是需要控制的机器,上述consul是在inventory.ini中配置好的(需要包含被控机地址、账户密码等)如下
[consul]
10.10.8.173 ansible_ssh_user="juzix" ansible_ssh_pass="123456" ansible_sudo_pass="123456"
tags 如果在一个playbook中写了多个task,而运行时又只想运行其中的某一个任务时,可以在脚本调用时通过参数指定要执行的那个tag如 ansible-playbook --tags=test_ping_consul test.yml
tasks表示要执行的任务,其中ping表示调用ansible的ping模块
playbook语法检查
ansible-playbook --syntax-check /testdir/ansible/test.yml
模拟运行
ansible-playbook --check test.yml
内置变量
- ansible_version
- hostvars
- inventory_hostname
- inventory_hostname_short
- play_hosts
- groups:通过groups内置变量可以获取到清单中”所有分组”的”分组信息”(inventory.ini中的分组,如
[via]、[carrier]、[data]等 - group_names
- inventory_dir
循环处理
with_items
”with_items”关键字会把返回的列表信息自动处理,将每一条信息单独放在一个名为”item”的变量中,我们只要获取到名为”item”变量的变量值,即可循环的获取到列表中的每一条信息.如:
---
- hosts: test70
remote_user: root
gather_facts: no
tasks:
- debug:
msg: "{{item}}"
with_items: "{{groups.ungrouped}}"
上例中,我们使用的是返回值中的信息,那么我们能不能自定义一个列表,然后循环使用列表中的值呢?必须能的,示例如下
---
- hosts: test70
remote_user: root
gather_facts: no
tasks:
- debug:
msg: "{{item}}"
with_items:
- 1
- 2
- 3
或者我们换一种写法,如下写法与上述写法的效果完全相同
---
- hosts: test70
remote_user: root
gather_facts: no
tasks:
- debug:
msg: "{{item}}"
with_items: [ 1, 2, 3 ]
条件判断
when
在大多数语言中条件判断都是通过
if关键字,但是在ansible中是使用when作为条件判断。而且这里需要注意的是,这里的ansible_distributionb变量是没有加大括号的 {{}},这是因为在when关键字中引用变量时,变量名不需要加”{{ }}”
---
- hosts: test70
remote_user: root
tasks:
- debug:
msg: "System release is centos"
when: ansible_distribution == "CentOS"
上面的语句也比较好理解,即:当ansible_distribution == "CentOS" 的时候执行上面的debug模块,否则不执行。
过滤器
---
- hosts: test70
remote_user: root
gather_facts: no
vars:
testvar: 1a2b3c
tasks:
- debug:
msg: "{{ testvar | upper }}"
如上例所示,testvar变量的值中包含三个小写字母,在使用debug模块输出这个变量的值时,我们使用了一个管道符,将testvar变量传递给了一个名为”upper”的东西,”upper”就是一个”过滤器”,执行上例playbook后你会发现,testvar中的所有小写字母都被变成了大写。
过滤器大部分是基于的是jinja2的语法,有些是ansible自己独有的,有关jinjia2的过滤器可以参见 jinjia2过滤器
可以简单理解为一些函数调用,而不是或的意思,虽然大多数时候会放在when语句中,如:
- name: Set data center address
uri:
url: http://{{consul_leader_ip}}:{{consul_leader_port}}/v1/kv/metis/dataCenter_ip_port
method: PUT
body: "{{storage_ip}}_{{storage_port}}"
when:
- ansible_host == consul_leader_ip
- enable_deploy_consul|default(false)
- 404 == dataCenter_ip_port_content.status
其中的 enable_deploy_consul|default(false) 表示当enable_deploy_consul变量null时则取默认值false否则,取enable_deploy_consul变量本身的值。
jinja2模板
相当于freemarker、thymeleaf之类的只不过是python里面用来写模板文件的。使用模板可以快速完成程序配置文件的编写,比如:
# 调度服务相关配置文件模板
datadir: {{carrier_data_dir}}
verbosity: debug
# 调试模块
pprof: true
pprof-port: {{carrier_pprof_port}}
pprof-addr: {{carrier_pprof_ip}}
debug: true
# p2p 模块
# tls-cert: {{carrier_tls_cert}}
# tls-key: {{carrier_tls_key}}
# TLS方式,RSA证书 , gmtls国密 证书则为gmtls
p2p-encrypt-channel: gmtls
# tls根证书路径
p2p-tls-ca-cert: {{carrier_tls_rsa_root_crt}}
# tls私钥路径
p2p-tls-priv-key: {{carrier_tls_rsa_node_key}}
# tls证书路径
p2p-tls-cert: {{carrier_tls_rsa_node_crt}}
# 国密跟根证书路径
p2p-gm-ca-cert: {{carrier_gmtls_root_crt}}
# 国密签名证书路径
p2p-gm-sign-cert: {{carrier_gmtls_node_sign_crt}}
# 国密签名私钥路径
p2p-gm-sign-priv-key: {{carrier_gmtls_node_sign_key}}
# 国密加密证书路径
p2p-gm-encode-cert: {{carrier_gmtls_node_encode_cert}}
# 国密加密证书私钥路径
p2p-gm-encode-priv-key: {{carrier_gmtls_node_encode_key}}
disable-grpc-gateway: false
rpc-host: {{carrier_rpc_ip}}
rpc-port: {{carrier_rpc_port}}
grpc-gateway-host: {{carrier_grpc_gateway_ip}}
grpc-gateway-port: {{carrier_grpc_gateway_port}}
enable-debug-rpc-endpoints: true
no-discovery: true
bootstrap-node: []
p2p-udp-port: {{carrier_p2p_udp_port}}
p2p-tcp-port: {{carrier_p2p_tcp_port}}
p2p-local-ip: {{carrier_p2p_listen_ip}}
p2p-host-ip: {{carrier_external_ip}}
p2p-priv-key: {{carrier_p2p_private_key}}
# 注册中心信息
discovery-server-ip: {{consul_leader_ip}}
discovery-server-port: {{consul_leader_port}}
写完模板文件之后通过调用ansible的template即可生成对应的配置文件如:
template表示调用template模块
- name: "Generate carrier.yml configuration file based on carrier.yml.j2 template file"
template:
src: "carrier.yml.j2"
dest: "{{ deploy_dir }}/carrier/config/carrier.yml"
mode: 0600
backup: yes
jinja2模板文件条件控制语句
在jinja2中,使用”{% %}”对控制语句进行包含,比如”if”控制语句、”for”循环控制语句等 都需要包含在”{% %}”中
- If
{% if testnum > 3 %}
greater than 3
{% endif %}
-
If else
{% if 条件一 %} ... {% elif 条件二 %} ... {% elif 条件N %} ... {% endif %} -
for循环
{% for i in [3,1,7,8,2] -%} {{ i }} {%- endfor %}
浙公网安备 33010602011771号