我正在尝试使用除我登录控制计算机之外的帐户对服务器运行Ansible playbook.我尝试ansible_user根据Inventory上的文档在库存文件中指定一个:
[srv1]
192.168.1.146 ansible_connection=ssh ansible_user=user1
Run Code Online (Sandbox Code Playgroud)
然而Ansible调用ansible-playbook -i inventory playbook.yml -vvvv打印以下内容:
GATHERING FACTS ***************************************************************
<192.168.1.146> ESTABLISH CONNECTION FOR USER: techraf
Run Code Online (Sandbox Code Playgroud)
对我remote_user有用的是在剧本中加入论点:
- hosts: srv1
remote_user: user1
Run Code Online (Sandbox Code Playgroud)
现在,相同的Ansible命令连接为user1:
GATHERING FACTS ***************************************************************
<192.168.1.146> ESTABLISH CONNECTION FOR USER: user1
Run Code Online (Sandbox Code Playgroud)
同时添加remote_user变量ansible.cfg使Ansible使用目标用户而不是登录用户.
是ansible_user库存文件和remote_user剧本/ ansible.cfg用于不同目的?
什么是ansible_user干什么用的?或者为什么Ansible没有观察清单中的设置?
我想通过使用Ansible来配置我最后一个节点的三个节点.
我的主机是Windows 10.
我的Vagrantfile看起来像:
Vagrant.configure("2") do |config|
(1..3).each do |index|
config.vm.define "node#{index}" do |node|
node.vm.box = "ubuntu"
node.vm.box = "../boxes/ubuntu_base.box"
node.vm.network :private_network, ip: "192.168.10.#{10 + index}"
if index == 3
node.vm.provision :setup, type: :ansible_local do |ansible|
ansible.playbook = "playbook.yml"
ansible.provisioning_path = "/vagrant/ansible"
ansible.inventory_path = "/vagrant/ansible/hosts"
ansible.limit = :all
ansible.install_mode = :pip
ansible.version = "2.0"
end
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
我的剧本看起来像:
---
# my little playbook
- name: My little playbook
hosts: webservers
gather_facts: false
roles:
- create_user
Run Code Online (Sandbox Code Playgroud)
我的主机文件看起来像:
[webservers]
192.168.10.11 …Run Code Online (Sandbox Code Playgroud) 已经有人想出运行EC2动态库存脚本(所需的最小IAM策略ec2.py上)ansible通过IAM角色?
到目前为止,除了boto在ansible的官方文档中指定库的凭据之外,我还没有看到这个问题的具体参考,但是,在生产环境中,我很少使用密钥对从EC2实例访问AWS服务,而是我有在这种情况下接受了IAM角色的使用.
我已经尝试过允许ec2:Describe*操作的策略,但对于脚本来说似乎不够,因为它总是会退出Unauthorized operation.
你能救我吗?
我正在使用如下的主机文件,
[qa-workstations]
10.39.19.190 ansible_user=test ansible_ssh_pass=test
Run Code Online (Sandbox Code Playgroud)
我使用下面的命令在主机中执行"whoami"命令
root@Svr:~/ansible# ansible all -a "whoami" -i /etc/ansible/host
10.39.19.190 | success | rc=0 >>
root
Run Code Online (Sandbox Code Playgroud)
默认情况下,ansible尝试使用我已登录的用户名,即root而不是我在主机文件中指定的测试用户
当我尝试在ansible cli命令中传递用户名时,它工作正常
root@Svr:~/ansible# ansible all -a "whoami" -i /etc/ansible/host -u test
10.39.19.190 | success | rc=0 >>
test
Run Code Online (Sandbox Code Playgroud)
但是我不可能每次在CLI中传递用户名,因为不同的主机使用不同的用户名.此外,我没有为每个主机生成密钥对,因为主机经常不断更改
使用版本:
ansible 1.5.4
Ubuntu 14.04 LTS
Run Code Online (Sandbox Code Playgroud) 我有一个用例,我需要在一个组中的所有主机中创建一个目录,该目录的名称将是该组的名称。
例如:我创建了一个动态清单文件,输出形式如下:
{
"db": ["host1", "host2", "host3"],
"logs": ["host2"],
"misc": ["host4"]
}
Run Code Online (Sandbox Code Playgroud)
我需要在组 db 的每个主机中创建一个名为 db 的目录,并在组日志的每个主机中创建一个名为 log 的目录。
到目前为止,我的剧本看起来像:
- hosts: db
tasks:
- name: create db directory
file: path=db state=directory
- hosts: logs
tasks:
- name: create logs directory
file: path=logs state=directory
Run Code Online (Sandbox Code Playgroud)
组数至少为 10+。这在未来可能会增长。我想为未来的团队编写一些易于扩展和管理的东西。
我读到 ansible 没有为任务的组名提供默认事实或变量。我发现如果我在主机中提供一个像 groupname 这样的变量,这是最好的。
有没有更好的解决方案可以使用循环而不是重复相同的任务?
我想为Ansible中的新机器编写一个bootstrapper playbook,它将重新配置网络设置.在第一次执行时,目标机器将具有DHCP分配的地址.
应该执行该剧本的用户知道所分配的新机器的IP地址.我想提示用户是值.
vars_prompt模块允许从用户获取输入,但是在hosts有效防止主机地址作为所需值的部分下定义.
是否可以不使用修改库存文件的包装脚本?
如何仅在组中的第一个主机上运行playbook?
我期待这样的事情:
---
- name: playbook that only run on first host in the group
hosts: "{{ groups[group_name] | first }}"
tasks:
- debug:
msg: "on {{ inventory_hostname }}"
Run Code Online (Sandbox Code Playgroud)
但这不起作用,给出错误:
'groups'未定义
我怎样才能使它工作?
因此,根据我收集的信息,我们可以使用 ansible.cfg 来设置 ansible 在运行剧本时查找的默认清单文件。
我们还可以在通过命令行运行 ansible playbook 时使用 -i 参数覆盖该清单。
有没有办法让我在不使用命令行或更改 ansible.cfg 文件的情况下在剧本中指定特定的特殊清单文件?
我有一本包含两种不同剧本的剧本
Sample.yml
- name : Play1
hosts: Host1
tasks:
...
- name: Play2
hosts: Host2
tasks:
...
Run Code Online (Sandbox Code Playgroud)
我需要用两个不同的主机(Host1 和 Host2)运行这个剧本,这两个不同的主机存在于库存/目录下的两个单独的文件(Hostfile1 和 Hostfile2)中。
inventory/
Hostfile1
Hostfile2
.
.
HostfileN
Run Code Online (Sandbox Code Playgroud)
我想知道如何在运行剧本时包含两个不同的主机文件。我知道通过在命令行中包含整个文件夹(库存/)我们可以实现这一点,但我在库存/ 文件夹中有很多主机文件,因此此选项将加载未使用的主机文件。
我试着像下面一样运行
ansible-playbook -i inventory/Hostfile1,Hostfile2 sample.yml
Run Code Online (Sandbox Code Playgroud)
但这没有用。那么,有谁知道如何通过在命令行中提供多个主机文件来运行剧本?
我能够在group_vars/all中定义如下所示的哈希(dict):
region_subnet_matrix:
site1:
region: "{{ aws_region }}"
subnet: "subnet-xxxxxxx"
zone: "{{aws_region}}a"
site2:
region: "{{ aws_region }}"
subnet: "subnet-xxxxxxx"
zone: "{{aws_region}}b"
Run Code Online (Sandbox Code Playgroud)
但对于我的生活,我无法弄清楚如何在hosts文件下定义它
[all:vars]
region_subnet_matrix="{
site1:
region: "{{ aws_region }}"
subnet: "subnet-xxxxxxx"
zone: "{{aws_region}}a"
site2:
region: "{{ aws_region }}"
subnet: "subnet-xxxxxxx"
zone: "{{aws_region}}b"
}"
Run Code Online (Sandbox Code Playgroud)
我知道这是不正确的,但我不知道正确的方法.有人可以开导我吗?